diff options
author | Romain Forlot <romain.forlot@iot.bzh> | 2018-06-29 19:42:56 +0200 |
---|---|---|
committer | Romain Forlot <romain.forlot@iot.bzh> | 2018-07-10 17:12:14 +0200 |
commit | dc63d731f884da11cb0fc2d3b98eef5e2c2c07bc (patch) | |
tree | 09b095334b9e0b57574e8d31df033c61ed53c735 | |
parent | 06e96704868d7b13c1e8e296ce1b262069ca9b4a (diff) |
First draft for mock apis
An m(ock)api is a plugin with its action as verb. About
now the event listener is the same then the main api
Change-Id: Iadbbb60cfbe9d5ef85801c346e6565ccde92b0c4
Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
-rw-r--r-- | conf.d/project/etc/aft-mapis.json (renamed from conf.d/project/etc/test-fapi.json) | 6 | ||||
-rw-r--r-- | conf.d/project/etc/aft-test.json (renamed from conf.d/project/etc/test-config.json) | 0 | ||||
-rw-r--r-- | conf.d/project/lua.d/fapi_low-can.lua | 43 | ||||
-rw-r--r-- | conf.d/project/lua.d/fapi_tests.lua | 51 | ||||
-rw-r--r-- | src/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/fapis.c | 57 | ||||
-rw-r--r-- | src/mapis.c | 87 | ||||
-rw-r--r-- | src/mapis.h (renamed from src/fapis.h) | 2 | ||||
-rw-r--r-- | src/test-binding.c | 6 |
9 files changed, 189 insertions, 65 deletions
diff --git a/conf.d/project/etc/test-fapi.json b/conf.d/project/etc/aft-mapis.json index 283bceb..4ecfbbb 100644 --- a/conf.d/project/etc/test-fapi.json +++ b/conf.d/project/etc/aft-mapis.json @@ -16,13 +16,13 @@ "action": "lua://AFT#_launch_test", "args": { "trace": "low-can", - "files": "fapi.lua" + "files": "mapi_tests.lua" } }, - "fapis": [{ + "mapis": [{ "uid": "low-can", "info": "Faked low-can API", - "libs": "low-can_fapi.lua", + "libs": "mapi_low-can.lua", "verbs": [ { "uid": "subscribe", diff --git a/conf.d/project/etc/test-config.json b/conf.d/project/etc/aft-test.json index fa26c5f..fa26c5f 100644 --- a/conf.d/project/etc/test-config.json +++ b/conf.d/project/etc/aft-test.json diff --git a/conf.d/project/lua.d/fapi_low-can.lua b/conf.d/project/lua.d/fapi_low-can.lua new file mode 100644 index 0000000..f7cd99a --- /dev/null +++ b/conf.d/project/lua.d/fapi_low-can.lua @@ -0,0 +1,43 @@ +--[[ + Copyright (C) 2018 "IoT.bzh" + Author Romain Forlot <romain.forlot@iot.bzh> + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + NOTE: strict mode: every global variables should be prefixed by '_' +--]] + +function _subscribe(source, args) + AFB:success(source) +end + +function _unsubscribe(source, args) + AFB:success(source) +end + +function _get(source, args) + AFB:success(source) +end + +function _list(source, args) + AFB:success(source) +end + +function _auth(source, args) + AFB:success(source) +end + +function _write(source, args) + AFB:success(source) +end diff --git a/conf.d/project/lua.d/fapi_tests.lua b/conf.d/project/lua.d/fapi_tests.lua new file mode 100644 index 0000000..1111a2d --- /dev/null +++ b/conf.d/project/lua.d/fapi_tests.lua @@ -0,0 +1,51 @@ +--[[ + Copyright (C) 2018 "IoT.bzh" + Author Romain Forlot <romain.forlot@iot.bzh> + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + NOTE: strict mode: every global variables should be prefixed by '_' +--]] + +_AFT.testVerbStatusSuccess("TestListverb", "low-can", "list", {}) +_AFT.testVerbStatusSuccess("TestGetVerb", "low-can", "get", { event = "engine.speed"}) + +_AFT.testCustom("Test_detection_is_off", function() + local logMsg = "signal: Engine is off, diagnostic_messages.engine.speed won't received responses until it's on" + _AFT.addLogToMonitor("low-can", "warning", logMsg) + + _AFT.assertVerbStatusSuccess("low-can","subscribe", { event = "diagnostic_messages.engine.speed" }) + _AFT.assertLogReceived(logMsg) + _AFT.assertVerbStatusSuccess("low-can","unsubscribe", { event = "diagnostic_messages.engine.speed" }) +end) + +_AFT.testCustom("Test_turning_on", function() + _AFT.assertVerbStatusSuccess("low-can","subscribe", { event = "diagnostic_messages.engine.speed" }) + + local evt = "low-can/diagnostic_messages" + local logMsg = "signal: Engine is off, diagnostic_messages.engine.speed won't received responses until it's on" + _AFT.addLogToMonitor("low-can", "warning", logMsg) + _AFT.addEventToMonitor(evt) + + local ret = os.execute("./var/replay_launcher.sh ./var/test1.canreplay") + _AFT.assertIsTrue(ret) + + _AFT.assertEvtReceived(evt, function(eventName, data) + _AFT.assertIsTrue(data.name == "diagnostic_messages.engine.speed") + end) + + _AFT.assertLogNotReceived(logMsg) + + _AFT.assertVerbStatusSuccess("low-can","unsubscribe", { event = "diagnostic_messages.engine.speed" }) +end) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 170844d..8a7380e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -21,7 +21,7 @@ PROJECT_TARGET_ADD(test-binding) # Define project Targets - ADD_LIBRARY(${TARGET_NAME} MODULE ${TARGET_NAME}.c fapis.c) + ADD_LIBRARY(${TARGET_NAME} MODULE ${TARGET_NAME}.c mapis.c) SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES PREFIX "" diff --git a/src/fapis.c b/src/fapis.c deleted file mode 100644 index a736fd6..0000000 --- a/src/fapis.c +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2016 "IoT.bzh" - * - * Author Romain Forlot <romain@iot.bzh> - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <fapis.h> - -static int LoadOneFapi(void *data, AFB_ApiT apiHandle) -{ - CtlActionT *actions = NULL; - json_object* verbsJ = (json_object*) data; - - actions = ActionConfig(apiHandle, verbsJ, 1); - - return 0; -} - -static void OneFapiConfig(void *data, json_object *fapiJ) { - const char *uid = NULL, *info = NULL, *spath = NULL; - json_object *verbsJ = NULL, *filesJ = NULL, *luaJ = NULL; - - AFB_ApiT apiHandle = (AFB_ApiT)data; - - if(wrap_json_unpack(fapiJ, "{ss,s?s,s?s,so,s?o,so !}", - "uid", &uid, - "info", &info, - "spath", &spath, - "libs", &filesJ, - "lua", &luaJ, - "verbs", &verbsJ)) { - AFB_ApiError(apiHandle, "Wrong fapis specification, missing uid|[info]|[spath]|libs|[lua]|verbs"); - return; - } - - if (afb_dynapi_new_api(apiHandle, uid, info, 1, LoadOneFapi, )) { - AFB_ApiError(apiHandle, "Error creating new api: %s", uid); - return; - } -} - -int FapisConfig(AFB_ApiT apiHandle, CtlSectionT *section, json_object *fapisJ) { - if(! PluginConfig(apiHandle, section, fapisJ)) - wrap_json_optarray_for_all(fapisJ, OneFapiConfig, (void*)apiHandle); -} diff --git a/src/mapis.c b/src/mapis.c new file mode 100644 index 0000000..d196ed0 --- /dev/null +++ b/src/mapis.c @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2016 "IoT.bzh" + * + * Author Romain Forlot <romain@iot.bzh> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <mapis.h> +#include <ctl-plugin.h> + +struct mapisHandleT { + AFB_ApiT mainApiHandle; + CtlSectionT *section; + json_object *mapiJ; + json_object *verbsJ; +}; + +static int LoadOnemapi(void *data, AFB_ApiT apiHandle) +{ + struct mapisHandleT *mapisHandle = (struct mapisHandleT*)data; + + if(PluginConfig(apiHandle, mapisHandle->section, mapisHandle->mapiJ)) { + AFB_ApiError(apiHandle, "Problem loading the plugin as an API for %s, see log message above", json_object_get_string(mapisHandle->mapiJ)); + return -1; + } + + // declare the verbs for this API + if(! ActionConfig(apiHandle, mapisHandle->verbsJ, 1)) { + AFB_ApiError(apiHandle, "Problems at verbs creations for %s", json_object_get_string(mapisHandle->mapiJ)); + return -1; + } + // declare an event event manager for this API; + afb_dynapi_on_event(apiHandle, CtrlDispatchApiEvent); + + return 0; +} + +static void OnemapiConfig(void *data, json_object *mapiJ) { + const char *uid = NULL, *info = NULL; + + struct mapisHandleT *mapisHandle = (struct mapisHandleT*)data; + + if(mapiJ) { + if(wrap_json_unpack(mapiJ, "{ss,s?s,s?s,so,s?o,so !}", + "uid", &uid, + "info", &info, + "spath", NULL, + "libs", NULL, + "lua", NULL, + "verbs", &mapisHandle->verbsJ)) { + AFB_ApiError(mapisHandle->mainApiHandle, "Wrong mapis specification, missing uid|[info]|[spath]|libs|[lua]|verbs"); + return; + } + + json_object_get(mapisHandle->verbsJ); + json_object_object_del(mapiJ, "verbs"); + mapisHandle->mapiJ = mapiJ; + + if (afb_dynapi_new_api(mapisHandle->mainApiHandle, uid, info, 1, LoadOnemapi, (void*)mapisHandle)) { + AFB_ApiError(mapisHandle->mainApiHandle, "Error creating new api: %s", uid); + return; + } + } +} + +int mapisConfig(AFB_ApiT apiHandle, CtlSectionT *section, json_object *mapisJ) { + struct mapisHandleT mapisHandle = { + .mainApiHandle = apiHandle, + .section = section, + .mapiJ = NULL, + .verbsJ = NULL + }; + wrap_json_optarray_for_all(mapisJ, OnemapiConfig, (void*)&mapisHandle); + + return 0; +} diff --git a/src/fapis.h b/src/mapis.h index d0dd467..9ea03b1 100644 --- a/src/fapis.h +++ b/src/mapis.h @@ -20,4 +20,4 @@ #include <wrap-json.h> #include <filescan-utils.h> -int FapisConfig(AFB_ApiT apiHandle, CtlSectionT *section, json_object *fapisJ); +int mapisConfig(AFB_ApiT apiHandle, CtlSectionT *section, json_object *mapisJ); diff --git a/src/test-binding.c b/src/test-binding.c index 1668360..d0fcb3c 100644 --- a/src/test-binding.c +++ b/src/test-binding.c @@ -22,7 +22,7 @@ #include <time.h> #include "test-binding.h" -#include "fapis.h" +#include "mapis.h" // default api to print log when apihandle not avaliable afb_dynapi *AFB_default; @@ -31,7 +31,7 @@ static CtlSectionT ctrlSections[] = { {.key = "resources", .loadCB = PluginConfig}, {.key = "onload", .loadCB = OnloadConfig}, {.key = "events", .loadCB = EventConfig}, - {.key = "fapis", .loadCB = FapisConfig}, + {.key = "mapis", .loadCB = mapisConfig}, {.key = NULL} }; @@ -114,7 +114,7 @@ int afbBindingVdyn(afb_dynapi *apiHandle) { if (!dirList) dirList = CONTROL_CONFIG_PATH; - configPath = CtlConfigSearch(apiHandle, dirList, ""); + configPath = CtlConfigSearch(apiHandle, dirList, "aft"); if (!configPath) { AFB_ApiError(apiHandle, "CtlPreInit: No %s* config found in %s ", GetBinderName(), dirList); return ERROR; |