cc-libs/packages/trapos-test/tests/harness/fake-eventloop.lua

99 lines
2.6 KiB
Lua

-- Shared test fakes for the trapos-cloud Lua client.
--
-- Lives under tests/harness/ so runtest.lua does NOT auto-discover it as a test
-- (discoverTests skips subdirectories), while /tests is still mounted so it can
-- be required at /tests/harness/fake-eventloop.
local M = {};
function M.fakeOs(id, label)
return {
getComputerID = function() return id; end,
getComputerLabel = function() return label; end,
};
end
-- Fake eventloop: captures registered handlers and scheduled timeouts, and lets
-- tests fire them manually to drive the daemon state machine.
function M.fakeEventloop()
local handlers = {};
local timers = {};
local fake = { handlers = handlers, timers = timers };
function fake.register(name, fn)
handlers[name] = handlers[name] or {};
handlers[name][#handlers[name] + 1] = fn;
return function() end;
end
function fake.setTimeout(fn, seconds)
timers[#timers + 1] = { fn = fn, seconds = seconds };
return function() end;
end
function fake.fire(name, ...)
local list = handlers[name];
if not list then return; end
for _, fn in ipairs(list) do
fn(...);
end
end
function fake.fireTimer(index)
index = index or #timers;
local t = timers[index];
if t then t.fn(); end
end
return fake;
end
-- Fake websocket: records sent frames (raw strings) and close calls.
function M.fakeWs()
local ws = { sent = {}, closed = false };
function ws.send(text) ws.sent[#ws.sent + 1] = text; end
function ws.close() ws.closed = true; end
return ws;
end
-- Fake http: records websocketAsync target URLs.
function M.fakeHttp()
local h = { connects = {} };
function h.websocketAsync(url) h.connects[#h.connects + 1] = url; end
function h.websocket() return nil; end
return h;
end
-- Scriptable event primitives for request() tests. `scriptedPulls` is an ordered
-- list of packed events ({ n=?, name, p1, ... }) returned by pullEvent in turn.
function M.fakeEvents(scriptedPulls)
local idx = 0;
local api = { queued = {}, timers = {}, cancelled = {} };
function api.queueEvent(name, ...)
api.queued[#api.queued + 1] = table.pack(name, ...);
end
function api.startTimer(seconds)
api.timers[#api.timers + 1] = seconds;
return 'timer-' .. #api.timers;
end
function api.cancelTimer(id)
api.cancelled[#api.cancelled + 1] = id;
end
function api.pullEvent()
idx = idx + 1;
local e = scriptedPulls[idx];
if not e then
error('fakeEvents: no more scripted events', 0);
end
return table.unpack(e, 1, e.n or #e);
end
return api;
end
return M;