From c4e0d9dfe78766df2503f95d9b172756deabeacd Mon Sep 17 00:00:00 2001 From: Rahix Date: Fri, 23 Dec 2022 01:00:00 +0100 Subject: [PATCH 1/2] Improve test coverage Add missing tests to fully cover the BaseControl codebase (execution coverage). The only missing pieces are now uuid and os.clock coverage. Importantly, these changes do not guarantee full coverage of failure modes - but at least more possible failures are covered now. --- tests/tests/cleanup.lua | 26 ++++++++++++++++++++++++++ tests/tests/dirty.lua | 8 ++++++-- tests/tests/local.lua | 14 ++++++++++++-- tests/tests/network.lua | 6 ++++++ 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/tests/tests/cleanup.lua b/tests/tests/cleanup.lua index 5142d02..cd30316 100644 --- a/tests/tests/cleanup.lua +++ b/tests/tests/cleanup.lua @@ -68,6 +68,32 @@ function test.clean_network2() end, "unknown") end +function test.clean_network_listener() + local bc1 = BaseControl:new() + local addr1 = network.get_scene() + bc1:register("clnlin1", 1234) + bc1:finalize() + + local bc2 = BaseControl:new() + local addr2 = network.get_scene() + + local tmp + bc2:listen("clnlin1", bc1.Query.Change, function(new) + test.equal(tmp, new, "value did not propagate") + end) + + network.set_scene(addr1) + tmp = 13 + bc1:set("clnlin1", 13) + + network.set_scene(addr2) + bc2:close() + + network.set_scene(addr1) + -- if the listener wasn't cleaned properly, this will fail + bc1:set("clnlin1", 16) +end + function test.unclean_deregister() local bc = BaseControl:new() local addr = network.get_scene() diff --git a/tests/tests/dirty.lua b/tests/tests/dirty.lua index e5974c9..96dd4fb 100644 --- a/tests/tests/dirty.lua +++ b/tests/tests/dirty.lua @@ -77,6 +77,7 @@ function test.finalize_robust() serialization.serialize({ ty=BaseControl.Message.Register, nouns={"finaln2"}, + verbs={"finalv2", "finalv3"}, }) ) @@ -96,11 +97,14 @@ function test.finalize_robust() BaseControl.Network.default_port, serialization.serialize({ ty=BaseControl.Message.Register, - nouns={"finaln3"}, + nouns={"finaln3", "finaln4"}, }) ) - bc2:finalize{"finaln1", "finaln2", "finaln3"} + bc2:finalize{ + "finaln1", "finaln2", "finaln3", + "finaln4", "finalv2", "finalv3", + } test.is_true(bc2:has_noun("finaln1"), "noun missing") test.is_true(bc2:has_noun("finaln2"), "noun missing") diff --git a/tests/tests/local.lua b/tests/tests/local.lua index 96263ab..3435994 100644 --- a/tests/tests/local.lua +++ b/tests/tests/local.lua @@ -47,6 +47,11 @@ function test.register() test.error_raised(function() bc:register("register3", 12) end, "already registered") + + bc:register("register4", function() end) + test.error_raised(function() + bc:register("register4", function() end) + end, "already registered") end function test.register_batch() @@ -143,13 +148,18 @@ function test.call_verb() end) bc:finalize() - bc:call("call1", 1, 2) + local ret = bc:call("call1", 1, 2) test.equal(3, flag1, "call failed") test.equal(1, flag2, "call failed") + test.equal(true, ret, "call not attempted") - bc:call("call1", 10, 10) + local ret = bc:call("call1", 10, 10) test.equal(20, flag1, "call failed") test.equal(2, flag2, "call failed") + test.equal(true, ret, "call not attempted") + + local ret = bc:call("call2", 1, 2, 3) + test.equal(false, ret, "call erroneously attempted") end function test.has_iter_verbs() diff --git a/tests/tests/network.lua b/tests/tests/network.lua index 7f20f6f..fa71cc7 100644 --- a/tests/tests/network.lua +++ b/tests/tests/network.lua @@ -64,6 +64,9 @@ function test.call_sync() test.equal(40, ret, "local sync not correct") test.equal("hello", val, "local sync not multiple") test.equal(2, n, "wrong invokation number") + test.error_raised(function() + bc1:call_sync("sync404", 1, 2, 3) + end, "unknown verb") -- Test remote local bc2 = BaseControl:new() @@ -72,4 +75,7 @@ function test.call_sync() test.equal(40, ret, "local sync not correct") test.equal("hello", val, "local sync not multiple") test.equal(4, n, "wrong invokation number") + test.error_raised(function() + bc2:call_sync("sync404", 1, 2, 3) + end, "unknown verb") end From 6f5e8386ebd5d8084ea847000cec91af33896b7e Mon Sep 17 00:00:00 2001 From: Rahix Date: Fri, 23 Dec 2022 01:13:00 +0100 Subject: [PATCH 2/2] Add tests for local uuid and os.clock To get execution coverage of bc.lua to 100%, add two more tests: 1. The first one ensures that os.clock is used properly when computer.uptime() is not available. 2. The second one tests the fallback implementation of uuid generation when uuid.next() is not available. --- tests/run.lua | 1 + tests/tests/misc.lua | 59 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 tests/tests/misc.lua diff --git a/tests/run.lua b/tests/run.lua index 7bc6d8c..2b18472 100755 --- a/tests/run.lua +++ b/tests/run.lua @@ -13,6 +13,7 @@ test_sources = { "tests/local.lua", "tests/network.lua", "tests/timeout.lua", + "tests/misc.lua", } for _, source in ipairs(test_sources) do loadfile("./tests/"..source)() diff --git a/tests/tests/misc.lua b/tests/tests/misc.lua new file mode 100644 index 0000000..9ba5e31 --- /dev/null +++ b/tests/tests/misc.lua @@ -0,0 +1,59 @@ +local test = require("u-test") + +local serialization = require("serialization") +local computer = require("computer") +local uuid = require("uuid") + +local computer_uptime_saved +function test.os_clock.start_up() + computer_uptime_saved = computer.uptime + computer.uptime = nil +end +function test.os_clock.tear_down() + computer.uptime = computer_uptime_saved + -- Force reload of the module + package.loaded.bc = nil + local BaseControl = require("bc") +end + +function test.os_clock.test_monkeypatched() + -- Force reload of the module + package.loaded.bc = nil + local BaseControl = require("bc") + + -- Test a timeout to prove it works + local bc1 = BaseControl:new() + test.error_raised(function() + bc1:finalize({"to_final1"}, 0.1) + end, "timeout") +end + +local uuid_next_saved +function test.uuid.start_up() + uuid_next_saved = uuid.next + uuid.next = nil +end +function test.uuid.tear_down() + uuid.next = uuid_next_saved + -- Force reload of the module + package.loaded.bc = nil + local BaseControl = require("bc") +end + +function test.uuid.test_monkeypatched() + -- Force reload of the module + package.loaded.bc = nil + local BaseControl = require("bc") + + -- Test a listener as this will use a uuid + local bc = BaseControl:new() + bc:register("lisuuid1", 1234) + bc:finalize() + + local id1 = bc:listen( + "lisuuid1", bc.Query.Change, function(new) end) + local id2 = bc:listen( + "lisuuid1", bc.Query.Change, function(new) end) + + test.not_equal(id1, id2, "uuid collision") +end