diff options
Diffstat (limited to 'conf.d/controller')
-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) |