summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRomain Forlot <romain.forlot@iot.bzh>2018-06-12 18:40:18 +0200
committerRomain Forlot <romain.forlot@iot.bzh>2018-07-10 17:12:13 +0200
commit3c944fb961235f127639c0135103602258d7aaf0 (patch)
tree887fd7caa71e4273f0b77d6e71a94800ac957863
parent0683deff8c9ed8fe051ca134cdb158b062905573 (diff)
Add a Application Framework Test
Change-Id: Ic786bab6df777f62ff2156ea18156389c8aa79e3 Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
m---------afb-helpers0
m---------conf.d/app-templates0
-rw-r--r--conf.d/cmake/config.cmake1
-rw-r--r--conf.d/project/etc/test-config.json14
-rw-r--r--conf.d/project/lua.d/aft.lua276
-rw-r--r--conf.d/project/lua.d/helloworld.lua24
-rw-r--r--conf.d/project/lua.d/low-can-tests.lua7
7 files changed, 313 insertions, 9 deletions
diff --git a/afb-helpers b/afb-helpers
-Subproject c7cd527a8350f736b8013f65db6f5a52b8cb05d
+Subproject f5f1e251131b6dd54b8f7bb9a31a7ef6e231a94
diff --git a/conf.d/app-templates b/conf.d/app-templates
-Subproject 66f7bc88bfc7a17e1ef277c4f7293f95f6ec8b6
+Subproject 6621af007c13b12bb1d33d0edf75db600a42f74
diff --git a/conf.d/cmake/config.cmake b/conf.d/cmake/config.cmake
index adce773..3bedeeb 100644
--- a/conf.d/cmake/config.cmake
+++ b/conf.d/cmake/config.cmake
@@ -47,7 +47,6 @@ set(PROJECT_APP_TEMPLATES_DIR "conf.d/app-templates")
# ----------------------------------
set(CMAKE_BUILD_TYPE "DEBUG")
-
# Kernel selection if needed. You can choose between a
# mandatory version to impose a minimal version.
# Or check Kernel minimal version and just print a Warning
diff --git a/conf.d/project/etc/test-config.json b/conf.d/project/etc/test-config.json
index b0df78a..43e006d 100644
--- a/conf.d/project/etc/test-config.json
+++ b/conf.d/project/etc/test-config.json
@@ -5,19 +5,21 @@
"uid": "Test",
"version": "1.0",
"api": "test",
- "info": "Binding made to tests other bindings",
- "require": ["low-can"]
+ "info": "Binding made to tests other bindings"
},
"resources": [{
- "uid": "low-can-test",
- "info": "Plugin that will test low-can binding",
+ "uid": "AFT",
+ "info": "Binder test framework",
"spath": "var/",
- "libs": [ "low-can-tests.lua"]
+ "libs": [ "AFT.lua"]
}],
"onload": {
"uid": "launch_all_tests",
"info": "Launch all the tests",
- "action": "lua://low-can-test#_launch_test"
+ "action": "lua://low-can-test#_launch_test",
+ "args": {
+ "files": ["helloworld.lua"]
+ }
},
"events":[
{
diff --git a/conf.d/project/lua.d/aft.lua b/conf.d/project/lua.d/aft.lua
new file mode 100644
index 0000000..e522c40
--- /dev/null
+++ b/conf.d/project/lua.d/aft.lua
@@ -0,0 +1,276 @@
+--[[
+ 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 '_'
+--]]
+
+package.path = package.path .. ';./var/?.lua'
+local lu = require('luaunit')
+
+local AFT = {
+ context = _ctx
+}
+
+--[[
+ Events listener and assertion function to test correctness of received
+ event data.
+]]
+
+_events_cb = {}
+
+function _evt_catcher_ (source, action, evt)
+ -- local table_end = table_length(_events) + 1
+ -- _events[event.event] = event.data
+ if _events_cb[evt.event] ~= nil then
+ _events_cb[evt.event](evt)
+ end
+end
+
+function AFT.assertEvtReceived(event)
+ lu.execOneFunction(nil,nil,nil, function()
+ assertIsString(event, "Event parameter must be a string")
+ assertTrue(true)
+ end)
+end
+
+--[[
+ Assert Wrapping function meant to tests API Verbs calls
+]]
+
+local function assertVerbCallParameters(src, api, verb, args)
+ AFT.assertIsUserdata(src, "Source must be an opaque userdata pointer which will be passed to the binder")
+ AFT.assertIsString(api, "API and Verb must be string")
+ AFT.assertIsString(verb, "API and Verb must be string")
+ AFT.assertIsTable(args, "Arguments must use LUA Table (event empty)")
+end
+
+function AFT.assertVerb(api, verb, args, cb)
+ lu.LuaUnit:runSuiteByInstances({{"assertVerb", function()
+ assertVerbCallParameters(AFT.context, api, verb, args)
+ local err,responseJ = AFB:servsync(AFT.context, api, verb, args)
+ lu.assertFalse(err)
+ lu.assertStrContains(responseJ.request.status, "success", nil, nil, "Call for API/Verb failed.")
+
+ if type(cb) == 'function' then
+ cb(responseJ)
+ elseif type(cb) == 'table' then
+ assertTrue(table_eq(responseJ, cb))
+ elseif not type(cb) == nil then
+ assertTrue(false, "Wrong parameter passed to assertion. Last parameter should be function, table representing a JSON object or nil")
+ end
+ end}} )
+end
+
+function AFT.assertVerbError(api, verb, args, cb)
+ lu.execOneFunction(nil,nil,nil, function()
+ assertVerbCallParameters(AFT.context, api, verb, args)
+ local err,responseJ = AFB:servsync(AFT.context, api, verb, args)
+ lu.assertFalse(err)
+ lu.assertNotStrContains(responseJ.request.status, "success", nil, nil, "Call for API/Verb succeed but it shouldn't.")
+
+ if type(cb) == 'function' then
+ cb(responseJ)
+ elseif type(cb) == 'table' then
+ assertFalse(table_eq(responseJ, cb))
+ elseif not type(cb) == nil then
+ assertFalse(true, "Wrong parameter passed to assertion. Last parameter should be function, table representing a JSON object or nil")
+ end
+ end)
+end
+
+--[[
+ Make all assertions accessible using AFT and declare some convenients
+ aliases.
+]]
+
+local luaunit_list_of_funcs = {
+ -- official function name from luaunit test framework
+
+ -- general assertions
+ 'assertEquals',
+ 'assertItemsEquals',
+ 'assertNotEquals',
+ 'assertAlmostEquals',
+ 'assertNotAlmostEquals',
+ 'assertEvalToTrue',
+ 'assertEvalToFalse',
+ 'assertStrContains',
+ 'assertStrIContains',
+ 'assertNotStrContains',
+ 'assertNotStrIContains',
+ 'assertStrMatches',
+ 'assertError',
+ 'assertErrorMsgEquals',
+ 'assertErrorMsgContains',
+ 'assertErrorMsgMatches',
+ 'assertIs',
+ 'assertNotIs',
+ 'wrapFunctions',
+ 'wrapFunctions',
+
+ -- type assertions: assertIsXXX -> assert_is_xxx
+ 'assertIsNumber',
+ 'assertIsString',
+ 'assertIsTable',
+ 'assertIsBoolean',
+ 'assertIsNil',
+ 'assertIsTrue',
+ 'assertIsFalse',
+ 'assertIsNaN',
+ 'assertIsInf',
+ 'assertIsPlusInf',
+ 'assertIsMinusInf',
+ 'assertIsPlusZero',
+ 'assertIsMinusZero',
+ 'assertIsFunction',
+ 'assertIsThread',
+ 'assertIsUserdata',
+
+ -- type assertions: assertIsXXX -> assertXxx
+ 'assertIsNumber',
+ 'assertIsString',
+ 'assertIsTable',
+ 'assertIsBoolean',
+ 'assertIsNil',
+ 'assertIsTrue',
+ 'assertIsFalse',
+ 'assertIsNaN',
+ 'assertIsInf',
+ 'assertIsPlusInf',
+ 'assertIsMinusInf',
+ 'assertIsPlusZero',
+ 'assertIsMinusZero',
+ 'assertIsFunction',
+ 'assertIsThread',
+ 'assertIsUserdata',
+
+ -- type assertions: assertIsXXX -> assert_xxx (luaunit v2 compat)
+ 'assertIsNumber',
+ 'assertIsString',
+ 'assertIsTable',
+ 'assertIsBoolean',
+ 'assertIsNil',
+ 'assertIsTrue',
+ 'assertIsFalse',
+ 'assertIsNaN',
+ 'assertIsInf',
+ 'assertIsPlusInf',
+ 'assertIsMinusInf',
+ 'assertIsPlusZero',
+ 'assertIsMinusZero',
+ 'assertIsFunction',
+ 'assertIsThread',
+ 'assertIsUserdata',
+
+ -- type assertions: assertNotIsXXX -> assert_not_is_xxx
+ 'assertNotIsNumber',
+ 'assertNotIsString',
+ 'assertNotIsTable',
+ 'assertNotIsBoolean',
+ 'assertNotIsNil',
+ 'assertNotIsTrue',
+ 'assertNotIsFalse',
+ 'assertNotIsNaN',
+ 'assertNotIsInf',
+ 'assertNotIsPlusInf',
+ 'assertNotIsMinusInf',
+ 'assertNotIsPlusZero',
+ 'assertNotIsMinusZero',
+ 'assertNotIsFunction',
+ 'assertNotIsThread',
+ 'assertNotIsUserdata',
+
+ -- type assertions: assertNotIsXXX -> assertNotXxx (luaunit v2 compat)
+ 'assertNotIsNumber',
+ 'assertNotIsString',
+ 'assertNotIsTable',
+ 'assertNotIsBoolean',
+ 'assertNotIsNil',
+ 'assertNotIsTrue',
+ 'assertNotIsFalse',
+ 'assertNotIsNaN',
+ 'assertNotIsInf',
+ 'assertNotIsPlusInf',
+ 'assertNotIsMinusInf',
+ 'assertNotIsPlusZero',
+ 'assertNotIsMinusZero',
+ 'assertNotIsFunction',
+ 'assertNotIsThread',
+ 'assertNotIsUserdata',
+
+ -- type assertions: assertNotIsXXX -> assert_not_xxx
+ 'assertNotIsNumber',
+ 'assertNotIsString',
+ 'assertNotIsTable',
+ 'assertNotIsBoolean',
+ 'assertNotIsNil',
+ 'assertNotIsTrue',
+ 'assertNotIsFalse',
+ 'assertNotIsNaN',
+ 'assertNotIsInf',
+ 'assertNotIsPlusInf',
+ 'assertNotIsMinusInf',
+ 'assertNotIsPlusZero',
+ 'assertNotIsMinusZero',
+ 'assertNotIsFunction',
+ 'assertNotIsThread',
+ 'assertNotIsUserdata',
+
+ -- all assertions with Coroutine duplicate Thread assertions
+ 'assertIsThread',
+ 'assertIsThread',
+ 'assertIsThread',
+ 'assertIsThread',
+ 'assertNotIsThread',
+ 'assertNotIsThread',
+ 'assertNotIsThread',
+ 'assertNotIsThread',
+}
+
+local aft_list_of_funcs = {
+ -- AF Binder generic assertions
+ { 'assertVerb', 'assertVerbStatusSuccess' },
+ { 'assertVerb', 'assertVerbResponseEquals' },
+ { 'assertVerb', 'assertVerbResponseContains' },
+ { 'assertVerb', 'assertVerbCb' },
+ { 'assertVerbError', 'assertVerbStatusError' },
+ { 'assertVerbError', 'assertVerbResponseEqualsError' },
+ { 'assertVerbError', 'assertVerbResponseContainsError' },
+ { 'assertVerbError', 'assertVerbCbError' },
+}
+
+-- Create all aliases in M
+for _, v in pairs( luaunit_list_of_funcs ) do
+ local funcname = v
+ AFT[funcname] = lu[funcname]
+end
+
+-- Create all aliases in M
+for _, v in pairs( aft_list_of_funcs ) do
+ local funcname, alias = v[1], v[2]
+ AFT[alias] = AFT[funcname]
+end
+
+function _launch_test(context, args)
+ _ctx = context
+ for _,f in pairs(args.files) do
+ print('******** Do file: var/'.. f)
+ dofile('var/'..f)
+ end
+end
+
+return AFT
diff --git a/conf.d/project/lua.d/helloworld.lua b/conf.d/project/lua.d/helloworld.lua
new file mode 100644
index 0000000..81024bc
--- /dev/null
+++ b/conf.d/project/lua.d/helloworld.lua
@@ -0,0 +1,24 @@
+--[[
+ 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 '_'
+--]]
+
+local AFT = require('aft')
+
+--print("***** In Helloworld Test ".. Dump_Table(AFT))
+AFT.assertVerbStatusSuccess('hello', 'ping', {})
diff --git a/conf.d/project/lua.d/low-can-tests.lua b/conf.d/project/lua.d/low-can-tests.lua
index 985c343..8ef13b2 100644
--- a/conf.d/project/lua.d/low-can-tests.lua
+++ b/conf.d/project/lua.d/low-can-tests.lua
@@ -1,7 +1,7 @@
--[[
- Copyright (C) 2016 "IoT.bzh"
- Author Fulup Ar Foll <fulup@iot.bzh>
+ 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.
@@ -18,6 +18,9 @@
NOTE: strict mode: every global variables should be prefixed by '_'
--]]
+
+-- BOUNDARY WIP
+
package.path = package.path .. ';./var/?.lua'
local lu = require('luaunit')
local src = nil