@@ -7,7 +7,7 @@ local os = require('os')
7
7
local tnt = require (' t.tnt' )
8
8
9
9
local test = tap.test(' test work with quuid' )
10
- test:plan(1 )
10
+ test:plan(3 )
11
11
12
12
local listen = ' localhost:1918'
13
13
tnt.cfg{listen = listen}
@@ -17,7 +17,7 @@ rawset(_G, 'queue', require('queue'))
17
17
test:test(' test work with two consumers with the same quuid' , function (test)
18
18
test:plan(4 )
19
19
20
- -- Preparing of the tube
20
+ -- Preparing of the tube.
21
21
local tube = queue.create_tube(' test_tube' , ' fifo' )
22
22
tube:grant(' guest' , {call = true })
23
23
local quuid_con1
@@ -81,5 +81,89 @@ test:test('test work with two consumers with the same quuid', function(test)
81
81
tube:drop()
82
82
end )
83
83
84
+ test:test(' test reconnect and ack the task' , function (test)
85
+ test:plan(2 )
86
+
87
+ -- Preparing of the tube.
88
+ queue.set_settings({ttr = 60 })
89
+ local tube = queue.create_tube(' test_tube' , ' fifo' )
90
+ tube:put(' test_data' )
91
+ tube:grant(' guest' , {call = true })
92
+
93
+ local fiber_consumer = fiber.new(function ()
94
+ -- Connect and take a task.
95
+ local conn = netbox.connect(listen)
96
+ local task = conn:call(' queue.tube.test_tube:take' )
97
+ local task_id = task[1 ]
98
+ local session_id = conn:call(' queue.identificate' )
99
+ conn:close()
100
+
101
+ -- Reconnect and ack the task.
102
+ conn = netbox.connect(listen)
103
+ conn:call(' queue.identificate' , {session_id})
104
+ task = conn:call(' queue.tube.test_tube:ack' , {task_id})
105
+ test:ok(task[1 ] == task_id and task[2 ] == ' -' , ' task has been acked' )
106
+
107
+ conn:close()
108
+ end )
109
+
110
+ fiber_consumer:set_joinable(true )
111
+
112
+ local ok = fiber_consumer:join()
113
+ test:ok(ok, ' reconnect and ack the task test done' )
114
+
115
+ tube:drop()
116
+ end )
117
+
118
+ test:test(' test expiration' , function (test)
119
+ test:plan(5 )
120
+
121
+ -- Preparing of the tube.
122
+ local tube = queue.create_tube(' test_tube' , ' fifo' )
123
+ tube:put(' test_data' )
124
+ tube:grant(' guest' , {call = true })
125
+
126
+ local fiber_consumer = fiber.new(function ()
127
+ queue.set_settings({ttr = 1 })
128
+ -- Connect and take a task.
129
+ local conn = netbox.connect(listen)
130
+ local task_id = conn:call(' queue.tube.test_tube:take' )[1 ]
131
+ local quuid_con = conn:call(' queue.identificate' )
132
+ conn:close()
133
+
134
+ -- Check that the task is in a "taken" state before ttr expires.
135
+ fiber.sleep(0.1 )
136
+ test:ok(tube:peek(task_id)[2 ] == ' t' , ' task in taken state' )
137
+ fiber.sleep(2 )
138
+
139
+ -- The task must be released after the ttr expires.
140
+ test:ok(tube:peek(task_id)[2 ] == ' r' , ' task in ready state after ttr' )
141
+
142
+ -- The old queue session must expire.
143
+ conn = netbox.connect(listen)
144
+ local ok, err = pcall (conn.call, conn, ' queue.identificate' ,
145
+ {quuid_con})
146
+ local check_ident = not ok and err:match(' UUID .* is unknown.' )
147
+ test:ok(check_ident, " the old queue session has expired." )
148
+ conn:close()
149
+
150
+ -- If ttr = 0, the task should be released immediately.
151
+ queue.set_settings({ttr = 0 })
152
+ conn = netbox.connect(listen)
153
+ task_id = conn:call(' queue.tube.test_tube:take' )[1 ]
154
+ conn:close()
155
+ fiber.sleep(0.1 )
156
+ test:ok(tube:peek(task_id)[2 ] == ' r' ,
157
+ ' task has been immediately released' )
158
+ end )
159
+
160
+ fiber_consumer:set_joinable(true )
161
+
162
+ local ok = fiber_consumer:join()
163
+ test:ok(ok, ' expiration test done' )
164
+
165
+ tube:drop()
166
+ end )
167
+
84
168
tnt.finish()
85
169
os.exit (test:check() and 0 or 1 )
0 commit comments