Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 621af25

Browse files
committed
More robust unit tests, less race conditions
- Bump timouts value to avoid false unit test errors: Basically, some timeouts are a little bit to short for fast testing. - Fix transiant unit test failure on pubsub. - you log all msgs - you send one msg - heartbeat msgs are logged - you check for only one msg: bad - you check if your msg appars among the heartbeats: good This was a beautiful race condition, since most of the time, the heartbeat is slower than how fast you send and test your msg. - Wrap in coroutines. HeartbeatOnChannel can raises to its parent at any time. Encapsulating the code in its own coroutine will reduce race conditions.
1 parent 049c0b3 commit 621af25

File tree

5 files changed

+61
-45
lines changed

5 files changed

+61
-45
lines changed

tests/test_buffered_channel.py

Lines changed: 45 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -149,22 +149,28 @@ def test_heartbeat_can_open_channel_client_close():
149149
client_hbchan = zerorpc.HeartBeatOnChannel(client_channel, freq=TIME_FACTOR * 2)
150150
client_bufchan = zerorpc.BufferedChannel(client_hbchan)
151151

152-
event = server.recv()
153-
server_channel = server.channel(event)
154-
server_hbchan = zerorpc.HeartBeatOnChannel(server_channel, freq=TIME_FACTOR * 2)
155-
server_bufchan = zerorpc.BufferedChannel(server_hbchan)
152+
def server_fn():
153+
event = server.recv()
154+
server_channel = server.channel(event)
155+
server_hbchan = zerorpc.HeartBeatOnChannel(server_channel, freq=TIME_FACTOR * 2)
156+
server_bufchan = zerorpc.BufferedChannel(server_hbchan)
157+
try:
158+
while True:
159+
gevent.sleep(1)
160+
finally:
161+
server_bufchan.close()
162+
server_coro = gevent.spawn(server_fn)
156163

157164
gevent.sleep(TIME_FACTOR * 3)
158165
print 'CLOSE CLIENT SOCKET!!!'
159166
client_bufchan.close()
160167
client.close()
161168
if sys.version_info < (2, 7):
162-
assert_raises(zerorpc.LostRemote, client_bufchan.recv)
169+
assert_raises(zerorpc.LostRemote, server_coro.get())
163170
else:
164171
with assert_raises(zerorpc.LostRemote):
165-
client_bufchan.recv()
172+
server_coro.get()
166173
print 'SERVER LOST CLIENT :)'
167-
server_bufchan.close()
168174
server.close()
169175

170176

@@ -178,16 +184,11 @@ def test_do_some_req_rep():
178184
client_events.connect(endpoint)
179185
client = zerorpc.ChannelMultiplexer(client_events, ignore_broadcast=True)
180186

181-
client_channel = client.channel()
182-
client_hbchan = zerorpc.HeartBeatOnChannel(client_channel, freq=TIME_FACTOR * 2)
183-
client_bufchan = zerorpc.BufferedChannel(client_hbchan)
184-
185-
event = server.recv()
186-
server_channel = server.channel(event)
187-
server_hbchan = zerorpc.HeartBeatOnChannel(server_channel, freq=TIME_FACTOR * 2)
188-
server_bufchan = zerorpc.BufferedChannel(server_hbchan)
189187

190188
def client_do():
189+
client_channel = client.channel()
190+
client_hbchan = zerorpc.HeartBeatOnChannel(client_channel, freq=TIME_FACTOR * 2)
191+
client_bufchan = zerorpc.BufferedChannel(client_hbchan)
191192
for x in xrange(20):
192193
client_bufchan.emit('add', (x, x * x))
193194
event = client_bufchan.recv()
@@ -199,6 +200,11 @@ def client_do():
199200
coro_pool.spawn(client_do)
200201

201202
def server_do():
203+
event = server.recv()
204+
server_channel = server.channel(event)
205+
server_hbchan = zerorpc.HeartBeatOnChannel(server_channel, freq=TIME_FACTOR * 2)
206+
server_bufchan = zerorpc.BufferedChannel(server_hbchan)
207+
202208
for x in xrange(20):
203209
event = server_bufchan.recv()
204210
assert event.name == 'add'
@@ -389,18 +395,22 @@ def test_congestion_control_server_pushing():
389395

390396
client_channel = client.channel()
391397
client_hbchan = zerorpc.HeartBeatOnChannel(client_channel, freq=TIME_FACTOR * 2)
392-
client_bufchan = zerorpc.BufferedChannel(client_hbchan)
398+
client_bufchan = zerorpc.BufferedChannel(client_hbchan, inqueue_size=100)
393399

394400
event = server.recv()
395401
server_channel = server.channel(event)
396402
server_hbchan = zerorpc.HeartBeatOnChannel(server_channel, freq=TIME_FACTOR * 2)
397-
server_bufchan = zerorpc.BufferedChannel(server_hbchan)
403+
server_bufchan = zerorpc.BufferedChannel(server_hbchan, inqueue_size=100)
404+
405+
read_cnt = 0
398406

399407
def client_do():
400408
for x in xrange(200):
401409
event = client_bufchan.recv()
402410
assert event.name == 'coucou'
403411
assert event.args == x
412+
read_cnt += 1
413+
raise Exception('CLIENT DONE')
404414

405415
coro_pool = gevent.pool.Pool()
406416
coro_pool.spawn(client_do)
@@ -409,30 +419,37 @@ def server_do():
409419
if sys.version_info < (2, 7):
410420
def _do_with_assert_raises():
411421
for x in xrange(200):
412-
server_bufchan.emit('coucou', x, timeout=TIME_FACTOR * 0) # will fail when x == 1
422+
server_bufchan.emit('coucou', x, timeout=0) # will fail when x == 1
413423
assert_raises(zerorpc.TimeoutExpired, _do_with_assert_raises)
414424
else:
415425
with assert_raises(zerorpc.TimeoutExpired):
416426
for x in xrange(200):
417-
server_bufchan.emit('coucou', x, timeout=TIME_FACTOR * 0) # will fail when x == 1
427+
server_bufchan.emit('coucou', x, timeout=0) # will fail when x == 1
418428
server_bufchan.emit('coucou', 1) # block until receiver is ready
419429
if sys.version_info < (2, 7):
420430
def _do_with_assert_raises():
421431
for x in xrange(2, 200):
422-
server_bufchan.emit('coucou', x, timeout=TIME_FACTOR * 0) # will fail when x == 100
432+
server_bufchan.emit('coucou', x, timeout=0) # will fail when x == 100
423433
assert_raises(zerorpc.TimeoutExpired, _do_with_assert_raises)
424434
else:
425435
with assert_raises(zerorpc.TimeoutExpired):
426436
for x in xrange(2, 200):
427-
server_bufchan.emit('coucou', x, timeout=TIME_FACTOR * 0) # will fail when x == 100
428-
for x in xrange(101, 200):
437+
server_bufchan.emit('coucou', x, timeout=0) # will fail when x == 100
438+
for x in xrange(read_cnt, 200):
429439
server_bufchan.emit('coucou', x) # block until receiver is ready
440+
raise Exception('SERVER DONE')
430441

431442

432443
coro_pool.spawn(server_do)
433-
434-
coro_pool.join()
435-
client_bufchan.close()
436-
client.close()
437-
server_bufchan.close()
438-
server.close()
444+
try:
445+
coro_pool.join()
446+
except zerorpc.LostRemote:
447+
pass
448+
finally:
449+
try:
450+
client_bufchan.close()
451+
client.close()
452+
server_bufchan.close()
453+
server.close()
454+
except Exception:
455+
pass

tests/test_client_heartbeat.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,12 @@ def lolita(self):
6060
gevent.sleep(TIME_FACTOR * 3)
6161
return 42
6262

63-
srv = MySrv(heartbeat=TIME_FACTOR * 1)
63+
srv = MySrv(heartbeat=TIME_FACTOR * 4)
6464
srv.bind(endpoint)
6565
gevent.spawn(srv.run)
66-
gevent.sleep(TIME_FACTOR * 0)
66+
gevent.sleep(0)
6767

68-
client = zerorpc.Client(heartbeat=TIME_FACTOR * 1)
68+
client = zerorpc.Client(heartbeat=TIME_FACTOR * 4)
6969
client.connect(endpoint)
7070

7171
assert client.lolita() == 42
@@ -84,11 +84,12 @@ def slow(self):
8484
gevent.sleep(TIME_FACTOR * 3)
8585
return 2
8686

87-
srv = MySrv(heartbeat=TIME_FACTOR * 1)
87+
srv = MySrv(heartbeat=TIME_FACTOR * 4)
8888
srv.bind(endpoint)
8989
gevent.spawn(srv.run)
90+
gevent.sleep(0)
9091

91-
client = zerorpc.Client(heartbeat=TIME_FACTOR * 1, passive_heartbeat=True)
92+
client = zerorpc.Client(heartbeat=TIME_FACTOR * 4, passive_heartbeat=True)
9293
client.connect(endpoint)
9394

9495
assert client.slow() == 2

tests/test_heartbeat.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,11 +171,11 @@ def test_do_some_req_rep():
171171
client = zerorpc.ChannelMultiplexer(client_events, ignore_broadcast=True)
172172

173173
client_channel = client.channel()
174-
client_hbchan = zerorpc.HeartBeatOnChannel(client_channel, freq=TIME_FACTOR * 2)
174+
client_hbchan = zerorpc.HeartBeatOnChannel(client_channel, freq=TIME_FACTOR * 4)
175175

176176
event = server.recv()
177177
server_channel = server.channel(event)
178-
server_hbchan = zerorpc.HeartBeatOnChannel(server_channel, freq=TIME_FACTOR * 2)
178+
server_hbchan = zerorpc.HeartBeatOnChannel(server_channel, freq=TIME_FACTOR * 4)
179179

180180
def client_do():
181181
for x in xrange(20):

tests/test_middleware.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -373,20 +373,18 @@ def echo(self, msg):
373373
trigger.clear()
374374
# We need this retry logic to wait that the subscriber.run coroutine starts
375375
# reading (the published messages will go to /dev/null until then).
376-
for attempt in xrange(0, 100):
376+
while not trigger.is_set():
377377
c.echo('pub...')
378-
if trigger.wait(TIME_FACTOR * 0.2):
378+
if trigger.wait(TIME_FACTOR * 1):
379379
break
380380

381381
subscriber.stop()
382382
subscriber_task.join()
383383

384-
assert publisher_tracer._log == [
385-
('new', publisher_tracer.trace_id),
386-
]
387-
assert subscriber_tracer._log == [
388-
('load', publisher_tracer.trace_id),
389-
]
384+
print publisher_tracer._log
385+
assert ('new', publisher_tracer.trace_id) in publisher_tracer._log
386+
print subscriber_tracer._log
387+
assert ('load', publisher_tracer.trace_id) in subscriber_tracer._log
390388

391389

392390
class InspectExceptionMiddleware(Tracer):

tests/test_reqstream.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,11 @@ def range(self, max):
4242
def xrange(self, max):
4343
return xrange(max)
4444

45-
srv = MySrv(heartbeat=TIME_FACTOR * 2)
45+
srv = MySrv(heartbeat=TIME_FACTOR * 4)
4646
srv.bind(endpoint)
4747
gevent.spawn(srv.run)
4848

49-
client = zerorpc.Client(heartbeat=TIME_FACTOR * 2)
49+
client = zerorpc.Client(heartbeat=TIME_FACTOR * 4)
5050
client.connect(endpoint)
5151

5252
r = client.range(10)

0 commit comments

Comments
 (0)