@@ -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