diff options
author | Benoit Germain <benoit.germain@ubisoft.com> | 2024-05-31 11:40:28 +0200 |
---|---|---|
committer | Benoit Germain <benoit.germain@ubisoft.com> | 2024-05-31 11:40:28 +0200 |
commit | a65a84cfad4eae38e5e84b1ab11f60a62833f287 (patch) | |
tree | 3d3b6cc88c188f2c34d3283e081316d6cc05ae83 /tests | |
parent | 731556711e453a501f1d1d06a6013b8fbd53414e (diff) | |
download | lanes-a65a84cfad4eae38e5e84b1ab11f60a62833f287.tar.gz lanes-a65a84cfad4eae38e5e84b1ab11f60a62833f287.tar.bz2 lanes-a65a84cfad4eae38e5e84b1ab11f60a62833f287.zip |
Improved multi-keeper tests
Diffstat (limited to 'tests')
-rw-r--r-- | tests/keeper.lua | 235 | ||||
-rw-r--r-- | tests/nb_keepers.lua | 20 |
2 files changed, 153 insertions, 102 deletions
diff --git a/tests/keeper.lua b/tests/keeper.lua index d08dd98..2d432f4 100644 --- a/tests/keeper.lua +++ b/tests/keeper.lua | |||
@@ -4,99 +4,170 @@ | |||
4 | -- Test program for Lua Lanes | 4 | -- Test program for Lua Lanes |
5 | -- | 5 | -- |
6 | -- TODO: there is a random crash when nb_user_keepers > 1. Will have to investigate if it rears its ugly head again | 6 | -- TODO: there is a random crash when nb_user_keepers > 1. Will have to investigate if it rears its ugly head again |
7 | local lanes = require "lanes".configure{ nb_user_keepers = 3, keepers_gc_threshold = 500 } | 7 | -- 3 keepers in addition to the one reserved for the timer linda |
8 | local require_lanes_result_1, require_lanes_result_2 = require "lanes".configure{nb_user_keepers = 3, keepers_gc_threshold = 500} | ||
9 | print("require_lanes_result:", require_lanes_result_1, require_lanes_result_2) | ||
10 | local lanes = require_lanes_result_1 | ||
8 | 11 | ||
9 | do | 12 | local require_assert_result_1, require_assert_result_2 = require "assert" -- assert.fails() |
10 | print "Linda names test:" | 13 | print("require_assert_result:", require_assert_result_1, require_assert_result_2) |
11 | local unnamedLinda = lanes.linda(1) | 14 | |
15 | -- ################################################################################################# | ||
16 | |||
17 | local print_id = 0 | ||
18 | local P = function(whence_, ...) | ||
19 | print_id = print_id + 1 | ||
20 | print(whence_, print_id .. ".", ...) | ||
21 | end | ||
22 | |||
23 | local PRINT = function(...) P("main", ...) end | ||
24 | |||
25 | local DONE = function() | ||
26 | PRINT "collecting garbage" | ||
27 | collectgarbage() | ||
28 | PRINT "SUCCESS\n" | ||
29 | end | ||
30 | |||
31 | -- ################################################################################################# | ||
32 | -- ################################################################################################# | ||
33 | |||
34 | if false then | ||
35 | PRINT "=========================================================================================" | ||
36 | PRINT "Linda groups test:" | ||
37 | |||
38 | local createLinda = function(...) | ||
39 | return lanes.linda(...) | ||
40 | end | ||
41 | |||
42 | -- should succeed | ||
43 | assert.failsnot(function() createLinda("zero", 0) end) | ||
44 | assert.failsnot(function() createLinda("one", 1) end) | ||
45 | assert.failsnot(function() createLinda("two", 2) end) | ||
46 | assert.failsnot(function() createLinda("three", 3) end) | ||
47 | -- should fail (and not create the lindas) | ||
48 | assert.fails(function() createLinda("minus 1", -1) end) | ||
49 | assert.fails(function() createLinda("none") end) | ||
50 | assert.fails(function() createLinda("four", 4) end) | ||
51 | |||
52 | end | ||
53 | -- should only collect the 4 successfully created lindas | ||
54 | DONE() | ||
55 | |||
56 | -- ################################################################################################# | ||
57 | |||
58 | if false then | ||
59 | PRINT "=========================================================================================" | ||
60 | PRINT "Linda names test:" | ||
61 | local unnamedLinda1 = lanes.linda(1) | ||
12 | local unnamedLinda2 = lanes.linda("", 2) | 62 | local unnamedLinda2 = lanes.linda("", 2) |
13 | local veeeerrrryyyylooongNamedLinda= lanes.linda( "veeeerrrryyyylooongNamedLinda", 3) | 63 | local veeeerrrryyyylooongNamedLinda3 = lanes.linda( "veeeerrrryyyylooongNamedLinda", 3) |
14 | print(unnamedLinda, unnamedLinda2, veeeerrrryyyylooongNamedLinda) | 64 | assert(tostring(veeeerrrryyyylooongNamedLinda3) == "Linda: veeeerrrryyyylooongNamedLinda") |
15 | print "GC deadlock test start" | 65 | local shortNamedLinda0 = lanes.linda( "short", 0) |
16 | -- store a linda in another linda (-> in a keeper) | 66 | assert(tostring(shortNamedLinda0) == "Linda: short") |
17 | unnamedLinda:set("here", lanes.linda("temporary linda", 0)) | 67 | PRINT(shortNamedLinda0, unnamedLinda1, unnamedLinda2, veeeerrrryyyylooongNamedLinda3) |
18 | -- repeatedly add and remove stuff in the linda so that a GC happens during the keeper operation | 68 | end |
69 | -- collect the 4 lindas we created | ||
70 | DONE() | ||
71 | |||
72 | -- ################################################################################################# | ||
73 | |||
74 | if true then | ||
75 | PRINT "=========================================================================================" | ||
76 | PRINT "Linda GC test:" | ||
77 | local a = lanes.linda("A", 1) | ||
78 | local b = lanes.linda("B", 2) | ||
79 | local c = lanes.linda("C", 3) | ||
80 | |||
81 | -- store lindas in each other and in themselves | ||
82 | a:set("here", lanes.linda("temporary linda", 0)) | ||
83 | b:set("here", a, b, c) | ||
84 | c:set("here", a, b, c) | ||
85 | |||
86 | -- repeatedly add and remove stuff in the linda 'a' so that a GC happens during the keeper operation | ||
19 | for i = 1, 100 do | 87 | for i = 1, 100 do |
88 | io.stdout:write "." | ||
20 | for j = 1, 1000 do -- send 1000 tables | 89 | for j = 1, 1000 do -- send 1000 tables |
21 | -- print("send #" .. j) | 90 | -- PRINT("send #" .. j) |
22 | unnamedLinda:send("here", {"a", "table", "with", "some", "stuff"}) | 91 | a:send("here", {"a", "table", "with", "some", "stuff"}, j) |
23 | end | 92 | end |
24 | -- print(clearing) | 93 | -- PRINT(clearing) |
25 | unnamedLinda:set("here") -- clear everything | 94 | a:set("here") -- clear everything, including the temporary linda for which we have no reference |
26 | end | 95 | end |
96 | io.stdout:write "\n" | ||
97 | b:set("here") | ||
98 | c:set("here") | ||
27 | end | 99 | end |
28 | print "collecting garbage" | 100 | -- should successfully collect a, b, and c and destroy the underlying Deep objects |
29 | collectgarbage() | 101 | DONE() |
30 | print "GC deadlock test done" | ||
31 | 102 | ||
32 | local print_id = 0 | 103 | -- ################################################################################################# |
33 | local PRINT = function(...) | ||
34 | print_id = print_id + 1 | ||
35 | print("main", print_id .. ".", ...) | ||
36 | end | ||
37 | 104 | ||
38 | local function keeper(linda) | 105 | if false then |
39 | local mt= { | 106 | PRINT "=========================================================================================" |
40 | __index= function( _, key ) | 107 | PRINT "General test:" |
41 | return linda:get( key ) | ||
42 | end, | ||
43 | __newindex= function( _, key, val ) | ||
44 | linda:set( key, val ) | ||
45 | end | ||
46 | } | ||
47 | return setmetatable( {}, mt ) | ||
48 | end | ||
49 | 108 | ||
50 | -- | 109 | local function keeper(linda) |
51 | local lindaA= lanes.linda( "A", 1) | 110 | local mt= { |
52 | local A= keeper( lindaA ) | 111 | __index= function( _, key ) |
53 | 112 | return linda:get( key ) | |
54 | local lindaB= lanes.linda( "B", 2) | 113 | end, |
55 | local B= keeper( lindaB ) | 114 | __newindex= function( _, key, val ) |
56 | 115 | linda:set( key, val ) | |
57 | local lindaC= lanes.linda( "C", 3) | 116 | end |
58 | local C= keeper( lindaC ) | 117 | } |
59 | print("Created", lindaA, lindaB, lindaC) | 118 | return setmetatable( {}, mt ) |
60 | |||
61 | A.some= 1 | ||
62 | PRINT("A.some == " .. A.some ) | ||
63 | assert( A.some==1 ) | ||
64 | |||
65 | B.some= "hoo" | ||
66 | PRINT("B.some == " .. B.some ) | ||
67 | assert( B.some=="hoo" ) | ||
68 | assert( A.some==1 ) | ||
69 | assert( C.some==nil ) | ||
70 | |||
71 | function lane() | ||
72 | local print_id = 0 | ||
73 | local PRINT = function(...) | ||
74 | print_id = print_id + 1 | ||
75 | print("lane", print_id .. ".", ...) | ||
76 | end | 119 | end |
120 | |||
121 | -- | ||
122 | local lindaA= lanes.linda( "A", 1) | ||
123 | local A= keeper( lindaA ) | ||
124 | |||
125 | local lindaB= lanes.linda( "B", 2) | ||
126 | local B= keeper( lindaB ) | ||
127 | |||
128 | local lindaC= lanes.linda( "C", 3) | ||
129 | local C= keeper( lindaC ) | ||
130 | PRINT("Created", lindaA, lindaB, lindaC) | ||
131 | |||
132 | A.some= 1 | ||
133 | PRINT("A.some == " .. A.some ) | ||
134 | assert( A.some==1 ) | ||
135 | |||
136 | B.some= "hoo" | ||
137 | PRINT("B.some == " .. B.some ) | ||
138 | assert( B.some=="hoo" ) | ||
139 | assert( A.some==1 ) | ||
140 | assert( C.some==nil ) | ||
141 | |||
142 | function lane() | ||
143 | local PRINT = function(...) P("lane", ...) end | ||
77 | 144 | ||
78 | local a= keeper(lindaA) | 145 | local a= keeper(lindaA) |
79 | PRINT("a.some == " .. a.some ) | 146 | PRINT("a.some == " .. a.some ) |
80 | assert( a.some==1 ) | 147 | assert( a.some==1 ) |
81 | a.some= 2 | 148 | a.some= 2 |
82 | assert( a.some==2 ) | 149 | assert( a.some==2 ) |
83 | PRINT("a.some == " .. a.some ) | 150 | PRINT("a.some == " .. a.some ) |
84 | |||
85 | local c = keeper(lindaC) | ||
86 | assert( c.some==nil ) | ||
87 | PRINT("c.some == " .. tostring(c.some)) | ||
88 | c.some= 3 | ||
89 | assert( c.some==3 ) | ||
90 | PRINT("c.some == " .. c.some) | ||
91 | end | ||
92 | 151 | ||
93 | PRINT("lane started") | 152 | local c = keeper(lindaC) |
94 | local h= lanes.gen( "io", lane )() | 153 | assert( c.some==nil ) |
95 | PRINT("lane joined:", h:join()) | 154 | PRINT("c.some == " .. tostring(c.some)) |
155 | c.some= 3 | ||
156 | assert( c.some==3 ) | ||
157 | PRINT("c.some == " .. c.some) | ||
158 | end | ||
159 | |||
160 | PRINT("lane started") | ||
161 | local h= lanes.gen( "io", lane )() | ||
162 | PRINT("lane joined:", h:join()) | ||
163 | |||
164 | PRINT("A.some = " .. A.some ) | ||
165 | assert( A.some==2 ) | ||
166 | PRINT("C.some = " .. C.some ) | ||
167 | assert( C.some==3 ) | ||
168 | lindaC:set("some") | ||
169 | assert( C.some==nil ) | ||
170 | end | ||
171 | DONE() | ||
96 | 172 | ||
97 | PRINT("A.some = " .. A.some ) | 173 | print "\nTEST OK" \ No newline at end of file |
98 | assert( A.some==2 ) | ||
99 | PRINT("C.some = " .. C.some ) | ||
100 | assert( C.some==3 ) | ||
101 | lindaC:set("some") | ||
102 | assert( C.some==nil ) | ||
diff --git a/tests/nb_keepers.lua b/tests/nb_keepers.lua deleted file mode 100644 index 575138c..0000000 --- a/tests/nb_keepers.lua +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | -- 2 keepers in addition to the one reserved for the timer linda | ||
2 | local require_lanes_result_1, require_lanes_result_2 = require "lanes".configure{nb_user_keepers = 2} | ||
3 | print("require_lanes_result:", require_lanes_result_1, require_lanes_result_2) | ||
4 | local lanes = require_lanes_result_1 | ||
5 | |||
6 | local require_assert_result_1, require_assert_result_2 = require "assert" -- assert.fails() | ||
7 | print("require_assert_result:", require_assert_result_1, require_assert_result_2) | ||
8 | |||
9 | local createLinda = function(...) | ||
10 | return lanes.linda(...) | ||
11 | end | ||
12 | |||
13 | -- should succeed | ||
14 | assert.failsnot(function() createLinda("one", 1) end) | ||
15 | assert.failsnot(function() createLinda("two", 2) end) | ||
16 | -- should fail | ||
17 | assert.fails(function() createLinda("none") end) | ||
18 | assert.fails(function() createLinda("zero", 0) end) | ||
19 | assert.fails(function() createLinda("three", 3) end) | ||
20 | print "TEST OK" | ||