Skip to content

Commit b593cbe

Browse files
committed
test: harden telemetry nonblocking assertions
1 parent 7514af4 commit b593cbe

1 file changed

Lines changed: 50 additions & 17 deletions

File tree

tests/test_telemetry.py

Lines changed: 50 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -244,38 +244,64 @@ class TestNonBlocking:
244244
def test_send_event_returns_immediately(self, mock_urlopen, enable_telemetry):
245245
from datafog.telemetry import _send_event
246246

247-
# Make urlopen block
248-
mock_urlopen.side_effect = lambda *a, **k: time.sleep(10)
247+
release_network = threading.Event()
249248

250-
start = time.monotonic()
251-
_send_event("test", {"k": "v"})
252-
elapsed = time.monotonic() - start
249+
def block_until_released(*args, **kwargs):
250+
release_network.wait(5)
253251

254-
# Should return in <100ms even though urlopen blocks for 10s
255-
assert elapsed < 0.1
252+
mock_urlopen.side_effect = block_until_released
253+
254+
call_done = threading.Event()
255+
caller = threading.Thread(
256+
target=lambda: (_send_event("test", {"k": "v"}), call_done.set())
257+
)
258+
259+
try:
260+
caller.start()
261+
assert call_done.wait(1)
262+
assert not release_network.is_set()
263+
finally:
264+
release_network.set()
265+
caller.join(1)
256266

257267
def test_track_function_call_returns_immediately(
258268
self, mock_urlopen, enable_telemetry
259269
):
260270
from datafog.telemetry import track_function_call
261271

262-
mock_urlopen.side_effect = lambda *a, **k: time.sleep(10)
272+
release_network = threading.Event()
263273

264-
start = time.monotonic()
265-
track_function_call("fn", "mod")
266-
elapsed = time.monotonic() - start
274+
def block_until_released(*args, **kwargs):
275+
release_network.wait(5)
276+
277+
mock_urlopen.side_effect = block_until_released
267278

268-
assert elapsed < 0.1
279+
call_done = threading.Event()
280+
caller = threading.Thread(
281+
target=lambda: (track_function_call("fn", "mod"), call_done.set())
282+
)
283+
284+
try:
285+
caller.start()
286+
assert call_done.wait(1)
287+
assert not release_network.is_set()
288+
finally:
289+
release_network.set()
290+
caller.join(1)
269291

270292
def test_track_function_call_does_not_wait_for_init_metadata(
271293
self, monkeypatch, enable_telemetry
272294
):
273295
import datafog.telemetry as tel
274296

297+
call_done = threading.Event()
298+
detect_started = threading.Event()
299+
release_detect = threading.Event()
275300
init_posted = threading.Event()
276301

277302
def slow_detect_installed_extras():
278-
time.sleep(0.3)
303+
detect_started.set()
304+
release_detect.wait(5)
279305
return []
280306

281307
def fake_post_event(event_name, properties):
@@ -287,11 +313,18 @@ def fake_post_event(event_name, properties):
287313
)
288314
monkeypatch.setattr(tel, "_post_event", fake_post_event)
289315

290-
start = time.monotonic()
291-
tel.track_function_call("fn", "mod")
292-
elapsed = time.monotonic() - start
316+
caller = threading.Thread(
317+
target=lambda: (tel.track_function_call("fn", "mod"), call_done.set())
318+
)
319+
320+
try:
321+
caller.start()
322+
assert detect_started.wait(1)
323+
assert call_done.wait(1)
324+
finally:
325+
release_detect.set()
326+
caller.join(1)
293327

294-
assert elapsed < 0.1
295328
assert init_posted.wait(1)
296329

297330
def test_network_failure_is_silent(self, mock_urlopen, enable_telemetry):

0 commit comments

Comments
 (0)