diff options
author | Romain Forlot <romain.forlot@iot.bzh> | 2018-07-18 19:50:57 +0200 |
---|---|---|
committer | Romain Forlot <romain.forlot@iot.bzh> | 2018-07-21 10:05:16 +0000 |
commit | 3f00d0fea4b8db29ef8268f2189704a3ea8e3360 (patch) | |
tree | 03d2d6abb708a8830682250653c43d79d24100cf /conf.d/controller/lua.d | |
parent | 99043faef2d12b70dc27e2c816738a9ba2fff659 (diff) |
Fix: events callback aren't correctly registered
They were stored in the mapis sections instead of the events
one.
Clean and handle raw events as well. Before that it could
only process events coming from monitoring api. Now it could
receive the event directly.
Make sure that the event handle is valid before sends the
request response. This prevent to subcribe or push an event
while the event handle hasn't been correctly created. This
could happens if the testVerb hasn't not been called from a
session. In that case, the response will just be that tests
has been launched.
Format.
Change-Id: I0aa522939162684f91dd426cc14919bb0ec3f69e
Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
Diffstat (limited to 'conf.d/controller/lua.d')
-rw-r--r-- | conf.d/controller/lua.d/aft.lua | 189 |
1 files changed, 145 insertions, 44 deletions
diff --git a/conf.d/controller/lua.d/aft.lua b/conf.d/controller/lua.d/aft.lua index 918deb1..b9061fb 100644 --- a/conf.d/controller/lua.d/aft.lua +++ b/conf.d/controller/lua.d/aft.lua @@ -22,6 +22,14 @@ local lu = require('luaunit') lu.LuaUnit:setOutputType('JUNIT') lu.LuaUnit.fname = "xUnitResults.xml" +local function table_size(t) + local size = 0 + for _,_ in pairs(t) do + size = size + 1 + end + return size +end + _AFT = { exit = {0, code}, context = _ctx, @@ -98,71 +106,151 @@ function _AFT.registerData(dict, eventData) end end -function _AFT.requestDaemonEventHandler(eventObj) - local eventName = eventObj.data.message - local log = _AFT.monitored_events[eventName] - local api = nil - - if eventObj.daemon then - api = eventObj.daemon.api - elseif eventObj.request then - api = eventObj.request.api +function _AFT.bindingEventHandler(eventObj, uid) + local eventName = nil + local eventListeners = nil + local data = nil + + if uid then + eventName = uid + data = eventObj + elseif eventObj.event.name then + eventName = eventObj.event.name + eventListeners = eventObj.data.result + -- Remove from event to hold the bare event data and be able to assert it + eventObj.data.result = nil + data = eventObj.data end - if log and log.api == api and log.type == eventObj.data.type then + if type(_AFT.monitored_events[eventName]) == 'table' then + if eventListeners then + _AFT.monitored_events[eventName].eventListeners = eventListeners + end + _AFT.incrementCount(_AFT.monitored_events[eventName]) - _AFT.registerData(_AFT.monitored_events[eventName], eventObj.data) + _AFT.registerData(_AFT.monitored_events[eventName], data) end +end +function _evt_catcher_(source, action, eventObj) + local uid = AFB:getuid(source) + if uid == "monitor/trace" then + if eventObj.type == "event" then + _AFT.bindingEventHandler(eventObj) + end + else + _AFT.bindingEventHandler(eventObj, uid) + end end -function _AFT.bindingEventHandler(eventObj) - local eventName = eventObj.event.name - local eventListeners = eventObj.data.result +function _AFT.lockWait(eventName, timeout) + if type(eventName) ~= "string" then + print("Error: wrong argument given to wait an event. 1st argument should be a string") + return 0 + end - -- Remove from event to hold the bare event data and be able to assert it - eventObj.data.result = nil + local count = 0 + if _AFT.monitored_events[eventName].receivedCount and timeout then + count = _AFT.monitored_events[eventName].receivedCount + end - if type(_AFT.monitored_events[eventName]) == 'table' then - _AFT.monitored_events[eventName].eventListeners = eventListeners + while timeout > 0 do + timeout = AFB:lockwait(_AFT.context, timeout) + AFB:lockwait(_AFT.context, 0) --without it _evt_catcher_ cannot received event - _AFT.incrementCount(_AFT.monitored_events[eventName]) - _AFT.registerData(_AFT.monitored_events[eventName], eventObj.data) + if _AFT.monitored_events[eventName].receivedCount == count + 1 then + return 1 + end end + return 0 end -function _evt_catcher_ (source, action, eventObj) - if eventObj.type == "event" then - _AFT.bindingEventHandler(eventObj) - elseif eventObj.type == "daemon" or eventObj.type == "request" then - _AFT.requestDaemonEventHandler(eventObj) +function _AFT.lockWaitGroup(eventGroup, timeout) + if type(eventGroup) ~= "table" then + print("Error: wrong argument given to wait a group of events. 1st argument should be a table") + return 0 + end + local eventGroupCpy = {table.unpack(eventGroup)} + + while timeout > 0 do + timeout = AFB:lockwait(_AFT.context, timeout) + AFB:lockwait(_AFT.context, 0) --without it _evt_catcher_ cannot received event + + for key,event in pairs(eventGroupCpy) do + if _AFT.monitored_events[event.name].receivedCount == event.receivedCount + 1 then + eventGroupCpy[key] = nil + end + end + if table_size(eventGroupCpy) == 0 then return 1 end end + return 0 end --[[ Assert and test functions about the event part. ]] -function _AFT.lockwait(eventName, timeout) - local count = 0 - if _AFT.monitored_events[eventName].receivedCount then - if timeout then - count = _AFT.monitored_events[eventName].receivedCount - end +function _AFT.assertEvtGrpNotReceived(eventGroup, timeout) + local count = 0 + local eventName = "" + for _,event in pairs(eventGroup) do + eventGroup[key] = {name = event, receivedCount = _AFT.monitored_events[event].receivedCount} end - while timeout > 0 do - timeout = AFB:lockwait(_AFT.context, timeout) - AFB:lockwait(_AFT.context, 0) --without it ev catcher cannot received event - if _AFT.monitored_events[eventName].receivedCount == count + 1 then - return 1 - end - end - return 0 + if timeout then + count = _AFT.lockWaitGroup(eventGroup, timeout) + else + for _,v in pairs(eventGroup) do + count = count + v.count + end + end + + for _,event in pairs(eventGroup) do + eventName = eventName .. " " .. event.name + end + _AFT.assertIsTrue(count == 0, "One of the following events has been received: '".. eventName .."' but it shouldn't") + + for _,event in pairs(eventGroup) do + if _AFT.monitored_events[event.name].cb then + local data_n = table_size(_AFT.monitored_events[event.name].data) + _AFT.monitored_events[event.name].cb(v.name, _AFT.monitored_events[event.name].data[data_n]) + end + end +end + +function _AFT.assertEvtGrpReceived(eventGroup, timeout) + local count = 0 + local eventName = "" + for key,event in pairs(eventGroup) do + eventGroup[key] = {name = event, receivedCount = _AFT.monitored_events[event].receivedCount} + end + + if timeout then + count = _AFT.lockWaitGroup(eventGroup, timeout) + else + for _,v in pairs(eventGroup) do + count = count + v.receivedCount + end + end + + for _,event in pairs(eventGroup) do + eventName = eventName .. " " .. event.name + end + _AFT.assertIsTrue(count >= table_size(eventGroup), "None or one of the following events: '".. eventName .."' has not been received") + + for _,event in pairs(eventGroup) do + if _AFT.monitored_events[event.name].cb then + local data_n = table_size(_AFT.monitored_events[event.name].data) + _AFT.monitored_events[event.name].cb(v.name, _AFT.monitored_events[event.name].data[data_n]) + end + end end function _AFT.assertEvtNotReceived(eventName, timeout) - local count = _AFT.lockwait(eventName, timeout) + local count = _AFT.monitored_events[eventName].receivedCount + if timeout then + count = _AFT.lockWait(eventName, timeout) + end _AFT.assertIsTrue(count == 0, "Event '".. eventName .."' received but it shouldn't") @@ -173,7 +261,10 @@ function _AFT.assertEvtNotReceived(eventName, timeout) end function _AFT.assertEvtReceived(eventName, timeout) - local count = _AFT.lockwait(eventName, timeout) + local count = _AFT.monitored_events[eventName].receivedCount + if timeout then + count = _AFT.lockWait(eventName, timeout) + end _AFT.assertIsTrue(count > 0, "No event '".. eventName .."' received") @@ -460,8 +551,10 @@ local function call_tests() local failures="Failures : "..tostring(lu.LuaUnit.result.testCount-lu.LuaUnit.result.passedCount) local evtHandle = AFB:evtmake(_AFT.context, 'results') - AFB:subscribe(_AFT.context,evtHandle) - AFB:evtpush(_AFT.context,evtHandle,{info = success.." "..failures}) + if type(evtHandle) == "userdata" then + AFB:subscribe(_AFT.context,evtHandle) + AFB:evtpush(_AFT.context,evtHandle,{info = success.." "..failures}) + end end function _launch_test(context, args) @@ -470,7 +563,15 @@ function _launch_test(context, args) -- Prepare the tests execution configuring the monitoring and loading -- lua test files to execute in the Framework. AFB:servsync(_AFT.context, "monitor", "set", { verbosity = "debug" }) - AFB:servsync(_AFT.context, "monitor", "trace", { add = { api = args.trace, request = "vverbose", event = "push_after" }}) + if type(args.trace) == "string" then + AFB:servsync(_AFT.context, "monitor", "trace", { add = { api = args.trace, request = "vverbose", event = "push_after" }}) + elseif type(args.trace) == "table" then + for _,v in pairs(args.trace) do + if type(v) == "string" then + AFB:servsync(_AFT.context, "monitor", "trace", { add = { api = v, request = "vverbose", event = "push_after" }}) + end + end + end if args.files and type(args.files) == 'table' then for _,f in pairs(args.files) do dofile('var/'..f) |