Skip to content

Commit 298fa92

Browse files
author
Joel Collins
committed
ClientEvent coverage
1 parent f84f059 commit 298fa92

File tree

1 file changed

+123
-0
lines changed

1 file changed

+123
-0
lines changed

tests/test_core_event.py

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
import pytest
2+
import gevent
3+
from gevent.hub import getcurrent
4+
5+
from labthings.core import event
6+
7+
8+
def test_clientevent_init():
9+
assert event.ClientEvent()
10+
11+
12+
def test_clientevent_greenlet_wait():
13+
e = event.ClientEvent()
14+
15+
def g():
16+
# Wait for e.set()
17+
return e.wait()
18+
19+
# Spawn greenlet
20+
greenlet = gevent.spawn(g)
21+
# Wait for e to notice greenlet is waiting for it
22+
while e.events == {}:
23+
gevent.sleep(0)
24+
25+
# Assert greenlet is in the list of threads waiting for e
26+
assert id(greenlet) in e.events
27+
28+
# Set e from main thread
29+
# Should cause greenlet to exit due to wait ending as event is set
30+
e.set()
31+
# Wait for greenlet to finish
32+
greenlet.join()
33+
# Ensure greenlet successfully waited without timing out
34+
assert greenlet.value == True
35+
36+
37+
def test_clientevent_greenlet_wait_timeout():
38+
e = event.ClientEvent()
39+
40+
def g():
41+
# Wait for e.set(), but timeout immediately
42+
return e.wait(timeout=0)
43+
44+
# Spawn greenlet
45+
greenlet = gevent.spawn(g)
46+
# Wait for greenlet to finish without ever setting e
47+
greenlet.join()
48+
# Assert greenlet returns False, since wait() timed out immediately
49+
assert greenlet.value == False
50+
51+
52+
def test_clientevent_greenlet_wait_clear():
53+
e = event.ClientEvent()
54+
55+
def g():
56+
# Wait for e.set()
57+
e.wait()
58+
# Clear e for this greenlet
59+
# This informs e that the greenlet is alive
60+
# and waiting for e to be set again
61+
return e.clear()
62+
63+
# Spawn greenlet
64+
greenlet = gevent.spawn(g)
65+
# Wait for e to notice greenlet is waiting for it
66+
while e.events == {}:
67+
gevent.sleep(0)
68+
69+
# Set e from main thread
70+
e.set()
71+
# Wait for greenlet to finish
72+
greenlet.join()
73+
# Ensure greenlet successfully cleared e
74+
assert greenlet.value == True
75+
76+
77+
def test_clientevent_greenlet_wait_clear_wrong_greenlet():
78+
e = event.ClientEvent()
79+
80+
def g():
81+
return e.wait()
82+
83+
# Spawn greenlet
84+
greenlet = gevent.spawn(g)
85+
# Wait for e to notice greenlet is waiting for it
86+
while e.events == {}:
87+
gevent.sleep(0)
88+
89+
# Set e from main thread
90+
e.set()
91+
# Wait for greenlet to finish
92+
greenlet.join()
93+
# Try to clear() e from main thread
94+
# Should return False since main thread isn't registered as waiting for e
95+
assert e.clear() == False
96+
97+
98+
def test_clientevent_drop_client():
99+
e = event.ClientEvent()
100+
101+
def g():
102+
# Wait for e.set()
103+
e.wait()
104+
# Exit without clearing
105+
106+
# Spawn greenlet
107+
greenlet = gevent.spawn(g)
108+
# Wait for e to notice greenlet is waiting for it
109+
while e.events == {}:
110+
gevent.sleep(0)
111+
112+
# Set e from main thread, causing the greenlet to exit
113+
e.set()
114+
# Wait for greenlet to finish
115+
greenlet.join()
116+
# Set e from main thread again, with immediate timeout
117+
# This means that if the client greenlet hasn't cleared the event
118+
# within 0 seconds, it will be assumed to have exited and dropped
119+
# from the internal event list
120+
e.set(timeout=0)
121+
122+
# Assert that the exited greenlet was dropped from e
123+
assert id(greenlet) not in e.events

0 commit comments

Comments
 (0)