diff options
| author | bd <bdunahu@operationnull.com> | 2025-07-22 21:01:59 -0600 |
|---|---|---|
| committer | bd <bdunahu@operationnull.com> | 2025-07-22 21:01:59 -0600 |
| commit | 160b13fd8a46138f31b9458cb46c54af3af95936 (patch) | |
| tree | dd22b7d6b1a9d3f65e52545b0a58c1ec59a9f5f9 /t/test_yappi_adaptations.py | |
| parent | 02ca06b3e835b34b577caf8931abe7c3786a7d87 (diff) | |
Add a lot more tests, finish yappi comparisons
Diffstat (limited to 't/test_yappi_adaptations.py')
| -rw-r--r-- | t/test_yappi_adaptations.py | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/t/test_yappi_adaptations.py b/t/test_yappi_adaptations.py new file mode 100644 index 0000000..7f034ef --- /dev/null +++ b/t/test_yappi_adaptations.py @@ -0,0 +1,112 @@ +import yappi +import utils +import asyncio +import threading + +# A test file containing tests adapted from yappi's own test suite. + + +class YappiTests(utils.AergiaUnitTestCase): + + def test_asyncio_recursion_yappi(self): + delay = 0.1 + + async def a(n): + if n <= 0: + return + await asyncio.sleep(delay) + await a(n - 1) + await a(n - 2) + + yappi.start() + self.Aergia.start() + asyncio.run(a(3)) + self.Aergia.stop() + yappi.stop() + + yappi_samples = yappi.get_func_stats() + aergia_samples = self.Aergia.get_samples() + + self.assert_reasonable_delay('a', delay * 4, aergia_samples) + self.assert_similar_delay('a', yappi_samples, aergia_samples) + + def test_basic_multithread(self): + delay = 0.1 + num_times = 5 + + async def a(): + await asyncio.sleep(delay) + + async def b(): + await a() + + async def recursive_a(n): + if not n: + return + await asyncio.sleep(delay) + await recursive_a(n - 1) + + def tag_cbk(): + cthread = threading.current_thread() + try: + return cthread._tag + except: + return -1 + + threading.current_thread()._tag = 0 + yappi.set_tag_callback(tag_cbk) + + def _thread_event_loop(loop): + asyncio.set_event_loop(loop) + loop.run_forever() + + _TCOUNT = 3 + _ctag = 1 + + ts = [] + for i in range(_TCOUNT): + _loop = asyncio.new_event_loop() + t = threading.Thread(target=_thread_event_loop, args=(_loop, )) + t._tag = _ctag + t._loop = _loop + t.start() + + ts.append(t) + _ctag += 1 + + async def stop_loop(): + asyncio.get_event_loop().stop() + + async def driver(): + futs = [] + fut = asyncio.run_coroutine_threadsafe(a(), ts[0]._loop) + futs.append(fut) + fut = asyncio.run_coroutine_threadsafe(recursive_a(num_times), ts[1]._loop) + futs.append(fut) + fut = asyncio.run_coroutine_threadsafe(b(), ts[2]._loop) + futs.append(fut) + for fut in futs: + fut.result() + + for t in ts: + asyncio.run_coroutine_threadsafe(stop_loop(), t._loop) + + yappi.start() + self.Aergia.start() + asyncio.run(driver()) + self.Aergia.stop() + yappi.stop() + + yappi_samples = yappi.get_func_stats() + aergia_samples = self.Aergia.get_samples() + + self.assert_reasonable_delay('a', delay * 2, aergia_samples) + self.assert_reasonable_delay('b', 0, aergia_samples) + self.assert_reasonable_delay('recursive_a', + delay * num_times, + aergia_samples) + self.assert_similar_delay('a', yappi_samples, aergia_samples) + self.assert_similar_delay('recursive_a', yappi_samples, aergia_samples) + # Aergia only assigns time to the current line when the task suspends + # This should fail. + # self.assert_similar_delay('b', yappi_samples, aergia_samples) |
