aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRomain Forlot <romain.forlot@iot.bzh>2018-07-10 16:26:39 +0200
committerRomain Forlot <romain.forlot@iot.bzh>2018-07-10 17:12:13 +0200
commit8a35cc2a73a8d02feb30262a76e79fee49961df4 (patch)
tree659df5efcf7ce5269baa5976554c817705ec9355 /src
parent14c5b20de6357f57d1facf1c9742f78958df29a3 (diff)
Update controller mechanism
Add luaunit as xUnit lua framework Change-Id: I49627b6554c62d05eca5e367d073b037385e40b1 Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
Diffstat (limited to 'src')
-rw-r--r--src/test-binding.c207
-rw-r--r--src/test-binding.h7
2 files changed, 122 insertions, 92 deletions
diff --git a/src/test-binding.c b/src/test-binding.c
index 403fbfc..7b28b01 100644
--- a/src/test-binding.c
+++ b/src/test-binding.c
@@ -28,126 +28,155 @@ afb_dynapi *AFB_default;
// Config Section definition (note: controls section index should match handle
// retrieval in HalConfigExec)
static CtlSectionT ctrlSections[] = {
- {.key = "plugins", .loadCB = PluginConfig},
- {.key = "onload", .loadCB = OnloadConfig},
- {.key = "controls", .loadCB = ControlConfig},
+ {.key = "resources", .loadCB = PluginConfig},
+ {.key = "onload", .loadCB = OnloadConfig},
+ {.key = "events", .loadCB = EventConfig},
- {.key = NULL}};
+ {.key = NULL}
+};
static void ctrlapi_ping(AFB_ReqT request) {
- static int count = 0;
+ static int count = 0;
- count++;
- AFB_ReqNotice(request, "Controller:ping count=%d", count);
- AFB_ReqSucess(request, json_object_new_int(count), NULL);
+ count++;
+ AFB_ReqNotice(request, "Controller:ping count=%d", count);
+ AFB_ReqSucess(request, json_object_new_int(count), NULL);
- return;
+ return;
}
-// Every HAL export the same API & Interface Mapping from SndCard to AudioLogic
-// is done through alsaHalSndCardT
static AFB_ApiVerbs CtrlApiVerbs[] = {
- /* VERB'S NAME FUNCTION TO CALL SHORT DESCRIPTION */
- {.verb = "ping", .callback = ctrlapi_ping, .info = "ping test for API"},
- {.verb = NULL} /* marker for end of the array */
+ /* VERB'S NAME FUNCTION TO CALL SHORT DESCRIPTION */
+ {.verb = "ping", .callback = ctrlapi_ping, .info = "ping test for API"},
+ {.verb = NULL} /* marker for end of the array */
};
static int CtrlLoadStaticVerbs(afb_dynapi *apiHandle, AFB_ApiVerbs *verbs) {
- int errcount = 0;
+ int errcount = 0;
- for (int idx = 0; verbs[idx].verb; idx++) {
- errcount += afb_dynapi_add_verb(
- apiHandle, CtrlApiVerbs[idx].verb, NULL, CtrlApiVerbs[idx].callback,
- (void *)&CtrlApiVerbs[idx], CtrlApiVerbs[idx].auth, 0);
- }
+ for (int idx = 0; verbs[idx].verb; idx++) {
+ errcount += afb_dynapi_add_verb(
+ apiHandle, CtrlApiVerbs[idx].verb, NULL, CtrlApiVerbs[idx].callback,
+ (void *)&CtrlApiVerbs[idx], CtrlApiVerbs[idx].auth, 0);
+ }
- return errcount;
+ return errcount;
};
static int CtrlInitOneApi(AFB_ApiT apiHandle) {
-
- AFB_default =
- apiHandle; // hugely hack to make all V2 AFB_DEBUG to work in fileutils
-
- // retrieve section config from api handle
- CtlConfigT *ctrlConfig = (CtlConfigT *)afb_dynapi_get_userdata(apiHandle);
- int err = CtlConfigExec(apiHandle, ctrlConfig);
-
- return err;
+ int err = 0;
+ AFB_default = apiHandle; // hugely hack to make all V2 AFB_DEBUG to work in fileutils
+
+ // retrieve section config from api handle
+ CtlConfigT *ctrlConfig = (CtlConfigT *)afb_dynapi_get_userdata(apiHandle);
+ err = CtlConfigExec(apiHandle, ctrlConfig);
+ if(err) {
+ AFB_ApiError(apiHandle, "Error at CtlConfigExec step");
+ return err;
+ }
+
+ return err;
}
// next generation dynamic API-V3 mode
#include <signal.h>
static int CtrlLoadOneApi(void *cbdata, AFB_ApiT apiHandle) {
- CtlConfigT *ctrlConfig = (CtlConfigT *)cbdata;
+ CtlConfigT *ctrlConfig = (CtlConfigT *)cbdata;
- // save closure as api's data context
- afb_dynapi_set_userdata(apiHandle, ctrlConfig);
+ // save closure as api's data context
+ afb_dynapi_set_userdata(apiHandle, ctrlConfig);
- // add static controls verbs
- int err = CtrlLoadStaticVerbs(apiHandle, CtrlApiVerbs);
- if (err) {
- AFB_ApiError(apiHandle, "CtrlLoadSection fail to register static V2 verbs");
- goto OnErrorExit;
- }
+ // add static controls verbs
+ int err = CtrlLoadStaticVerbs(apiHandle, CtrlApiVerbs);
+ if (err) {
+ AFB_ApiError(apiHandle, "CtrlLoadSection fail to register static V2 verbs");
+ return ERROR;
+ }
- // load section for corresponding API
- err = CtlLoadSections(apiHandle, ctrlConfig, ctrlSections);
+ // load section for corresponding API
+ err = CtlLoadSections(apiHandle, ctrlConfig, ctrlSections);
- // declare an event event manager for this API;
- afb_dynapi_on_event(apiHandle, CtrlDispatchApiEvent);
+ // declare an event event manager for this API;
+ afb_dynapi_on_event(apiHandle, CtrlDispatchApiEvent);
- // init API function (does not receive user closure ???
- afb_dynapi_on_init(apiHandle, CtrlInitOneApi);
+ // init API function (does not receive user closure ???
+ afb_dynapi_on_init(apiHandle, CtrlInitOneApi);
- afb_dynapi_seal(apiHandle);
- return err;
+ afb_dynapi_seal(apiHandle);
+ return err;
+}
-OnErrorExit:
- return 1;
+int AddLunitFrameworkResource(AFB_ApiT apihandle, CtlConfigT *ctrlConfig)
+{
+ int err = 0;
+ json_object *luaunitFrameworkJ = NULL, *resourcesJ = NULL;
+ json_object *savedJ = NULL;
+
+ err = wrap_json_pack(&luaunitFrameworkJ, "{ss, ss, ss, ss}",
+ "uid", "lunit",
+ "info", "Lunit LUA xUnit framework",
+ "spath", CONTROL_PLUGIN_PATH,
+ "libs", "luaunit.lua");
+ if(err) {
+ AFB_ApiError(apihandle, "Loading LUA xUnit framework");
+ return ERROR;
+ }
+
+ if(json_object_object_get_ex(ctrlConfig->configJ, "resources", &resourcesJ) &&
+ json_object_is_type(resourcesJ, json_type_array)) {
+ savedJ = json_object_get(json_object_array_get_idx(resourcesJ, 0));
+ json_object_array_put_idx(resourcesJ, 0, luaunitFrameworkJ);
+ json_object_array_add(resourcesJ, savedJ);
+ }
+ else {
+ AFB_ApiError(apihandle, "Resources section isn't a JSON array or does not exists.");
+ return ERROR;
+ }
+
+ return 0;
}
int afbBindingVdyn(afb_dynapi *apiHandle) {
- AFB_default = apiHandle;
- AFB_ApiNotice(apiHandle, "Controller in afbBindingVdyn");
-
- const char *dirList = getenv("CONTROL_CONFIG_PATH");
- if (!dirList)
- dirList = CONTROL_CONFIG_PATH;
-
- const char *configPath = CtlConfigSearch(apiHandle, dirList, "4a-");
- if (!configPath) {
- AFB_ApiError(apiHandle, "CtlPreInit: No 4a-%s-* config found in %s ",
- GetBinderName(), dirList);
- goto OnErrorExit;
- }
-
- // load config file and create API
- CtlConfigT *ctrlConfig = CtlLoadMetaData(apiHandle, configPath);
- if (!ctrlConfig) {
- AFB_ApiError(apiHandle,
- "CtrlBindingDyn No valid control config file in:\n-- %s",
- configPath);
- goto OnErrorExit;
- }
-
- if (!ctrlConfig->api) {
- AFB_ApiError(apiHandle,
- "CtrlBindingDyn API Missing from metadata in:\n-- %s",
- configPath);
- goto OnErrorExit;
- }
-
- AFB_ApiNotice(apiHandle, "Controller API='%s' info='%s'", ctrlConfig->api,
- ctrlConfig->info);
- // create one API per config file (Pre-V3 return code ToBeChanged)
- int status = afb_dynapi_new_api(apiHandle, ctrlConfig->api, ctrlConfig->info,
- 1, CtrlLoadOneApi, ctrlConfig);
-
- return status;
-
-OnErrorExit:
- return -1;
+ AFB_default = apiHandle;
+ AFB_ApiNotice(apiHandle, "Controller in afbBindingVdyn");
+
+ const char *dirList = getenv("CONTROL_CONFIG_PATH");
+ if (!dirList)
+ dirList = CONTROL_CONFIG_PATH;
+
+ const char *configPath = CtlConfigSearch(apiHandle, dirList, "");
+ if (!configPath) {
+ AFB_ApiError(apiHandle, "CtlPreInit: No %s* config found in %s ", GetBinderName(), dirList);
+ return ERROR;
+ }
+
+ // load config file and create API
+ CtlConfigT *ctrlConfig = CtlLoadMetaData(apiHandle, configPath);
+ if (!ctrlConfig) {
+ AFB_ApiError(apiHandle,
+ "CtrlBindingDyn No valid control config file in:\n-- %s",
+ configPath);
+ return ERROR;
+ }
+
+ if (!ctrlConfig->api) {
+ AFB_ApiError(apiHandle,
+ "CtrlBindingDyn API Missing from metadata in:\n-- %s",
+ configPath);
+ return ERROR;
+ }
+
+ AFB_ApiNotice(apiHandle, "Controller API='%s' info='%s'", ctrlConfig->api,
+ ctrlConfig->info);
+
+
+ if (AddLunitFrameworkResource(apiHandle, ctrlConfig))
+ return ERROR;
+
+ // create one API per config file (Pre-V3 return code ToBeChanged)
+ int status = afb_dynapi_new_api(apiHandle, ctrlConfig->api, ctrlConfig->info, 1, CtrlLoadOneApi, ctrlConfig);
+
+ return status;
}
diff --git a/src/test-binding.h b/src/test-binding.h
index 57d4ce9..8b0e62d 100644
--- a/src/test-binding.h
+++ b/src/test-binding.h
@@ -20,11 +20,12 @@
#define _CTL_BINDING_INCLUDE_
#include <stdio.h>
-#include <alsa/asoundlib.h>
-
+#include <ctl-config.h>
#include <filescan-utils.h>
#include <wrap-json.h>
-#include <ctl-config.h>
+#ifndef ERROR
+ #define ERROR -1
+#endif
#endif /* _CTL_BINDING_INCLUDE_ */