From dc63d731f884da11cb0fc2d3b98eef5e2c2c07bc Mon Sep 17 00:00:00 2001 From: Romain Forlot Date: Fri, 29 Jun 2018 19:42:56 +0200 Subject: 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 --- conf.d/project/etc/aft-mapis.json | 59 ++++++++++++++++++++++++ conf.d/project/etc/aft-test.json | 22 +++++++++ conf.d/project/etc/test-config.json | 22 --------- conf.d/project/etc/test-fapi.json | 59 ------------------------ conf.d/project/lua.d/fapi_low-can.lua | 43 +++++++++++++++++ conf.d/project/lua.d/fapi_tests.lua | 51 ++++++++++++++++++++ src/CMakeLists.txt | 2 +- src/fapis.c | 57 ----------------------- src/fapis.h | 23 --------- src/mapis.c | 87 +++++++++++++++++++++++++++++++++++ src/mapis.h | 23 +++++++++ src/test-binding.c | 6 +-- 12 files changed, 289 insertions(+), 165 deletions(-) create mode 100644 conf.d/project/etc/aft-mapis.json create mode 100644 conf.d/project/etc/aft-test.json delete mode 100644 conf.d/project/etc/test-config.json delete mode 100644 conf.d/project/etc/test-fapi.json create mode 100644 conf.d/project/lua.d/fapi_low-can.lua create mode 100644 conf.d/project/lua.d/fapi_tests.lua delete mode 100644 src/fapis.c delete mode 100644 src/fapis.h create mode 100644 src/mapis.c create mode 100644 src/mapis.h diff --git a/conf.d/project/etc/aft-mapis.json b/conf.d/project/etc/aft-mapis.json new file mode 100644 index 0000000..4ecfbbb --- /dev/null +++ b/conf.d/project/etc/aft-mapis.json @@ -0,0 +1,59 @@ +{ + "id": "http://iot.bzh/download/public/schema/json/ctl-schema.json#", + "$schema": "http://iot.bzh/download/public/schema/json/ctl-schema.json#", + "metadata": { + "uid": "Test", + "version": "1.0", + "api": "test", + "info": "Configuration to test an emulated api", + "require": [ + "low-can" + ] + }, + "onload": { + "uid": "launch_all_tests", + "info": "Launch all the tests", + "action": "lua://AFT#_launch_test", + "args": { + "trace": "low-can", + "files": "mapi_tests.lua" + } + }, + "mapis": [{ + "uid": "low-can", + "info": "Faked low-can API", + "libs": "mapi_low-can.lua", + "verbs": [ + { + "uid": "subscribe", + "info": "Subscribe to CAN signals events", + "action": "lua://low-can#_subscribe" + }, + { + "uid": "unsubscribe", + "info": "Unsubscribe previously suscribed signals.", + "action": "lua://low-can#_unsubscribe" + }, + { + "uid": "get", + "info": "get a current value of CAN message", + "action": "lua://low-can#_get" + }, + { + "uid": "list", + "info": "get a supported CAN message list", + "action": "lua://low-can#_list" + }, + { + "uid": "auth", + "info": "Authenticate session to be raise Level Of Assurance.", + "action": "lua://low-can#_auth" + }, + { + "uid": "write", + "info": "Write a CAN messages to the CAN bus.", + "action": "lua://low-can#_write" + } + ] + }] +} diff --git a/conf.d/project/etc/aft-test.json b/conf.d/project/etc/aft-test.json new file mode 100644 index 0000000..fa26c5f --- /dev/null +++ b/conf.d/project/etc/aft-test.json @@ -0,0 +1,22 @@ +{ + "id": "http://iot.bzh/download/public/schema/json/ctl-schema.json#", + "$schema": "http://iot.bzh/download/public/schema/json/ctl-schema.json#", + "metadata": { + "uid": "Test", + "version": "1.0", + "api": "test", + "info": "Binding made to tests other bindings", + "require": [ + "hello" + ] + }, + "onload": { + "uid": "launch_all_tests", + "info": "Launch all the tests", + "action": "lua://AFT#_launch_test", + "args": { + "trace": "hello", + "files": "helloworld.lua" + } + } +} diff --git a/conf.d/project/etc/test-config.json b/conf.d/project/etc/test-config.json deleted file mode 100644 index fa26c5f..0000000 --- a/conf.d/project/etc/test-config.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "id": "http://iot.bzh/download/public/schema/json/ctl-schema.json#", - "$schema": "http://iot.bzh/download/public/schema/json/ctl-schema.json#", - "metadata": { - "uid": "Test", - "version": "1.0", - "api": "test", - "info": "Binding made to tests other bindings", - "require": [ - "hello" - ] - }, - "onload": { - "uid": "launch_all_tests", - "info": "Launch all the tests", - "action": "lua://AFT#_launch_test", - "args": { - "trace": "hello", - "files": "helloworld.lua" - } - } -} diff --git a/conf.d/project/etc/test-fapi.json b/conf.d/project/etc/test-fapi.json deleted file mode 100644 index 283bceb..0000000 --- a/conf.d/project/etc/test-fapi.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "id": "http://iot.bzh/download/public/schema/json/ctl-schema.json#", - "$schema": "http://iot.bzh/download/public/schema/json/ctl-schema.json#", - "metadata": { - "uid": "Test", - "version": "1.0", - "api": "test", - "info": "Configuration to test an emulated api", - "require": [ - "low-can" - ] - }, - "onload": { - "uid": "launch_all_tests", - "info": "Launch all the tests", - "action": "lua://AFT#_launch_test", - "args": { - "trace": "low-can", - "files": "fapi.lua" - } - }, - "fapis": [{ - "uid": "low-can", - "info": "Faked low-can API", - "libs": "low-can_fapi.lua", - "verbs": [ - { - "uid": "subscribe", - "info": "Subscribe to CAN signals events", - "action": "lua://low-can#_subscribe" - }, - { - "uid": "unsubscribe", - "info": "Unsubscribe previously suscribed signals.", - "action": "lua://low-can#_unsubscribe" - }, - { - "uid": "get", - "info": "get a current value of CAN message", - "action": "lua://low-can#_get" - }, - { - "uid": "list", - "info": "get a supported CAN message list", - "action": "lua://low-can#_list" - }, - { - "uid": "auth", - "info": "Authenticate session to be raise Level Of Assurance.", - "action": "lua://low-can#_auth" - }, - { - "uid": "write", - "info": "Write a CAN messages to the CAN bus.", - "action": "lua://low-can#_write" - } - ] - }] -} 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 + + 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 + + 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 - * - * 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 - -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/fapis.h b/src/fapis.h deleted file mode 100644 index d0dd467..0000000 --- a/src/fapis.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2016 "IoT.bzh" - * - * Author Romain Forlot - * - * 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 -#include -#include - -int FapisConfig(AFB_ApiT apiHandle, CtlSectionT *section, json_object *fapisJ); 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 + * + * 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 +#include + +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/mapis.h b/src/mapis.h new file mode 100644 index 0000000..9ea03b1 --- /dev/null +++ b/src/mapis.h @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2016 "IoT.bzh" + * + * Author Romain Forlot + * + * 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 +#include +#include + +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 #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; -- cgit 1.2.3-korg