summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--t/async-generator-and-comprehension.py20
-rw-r--r--t/test_functionality.py56
-rw-r--r--t/utils.py36
3 files changed, 77 insertions, 35 deletions
diff --git a/t/async-generator-and-comprehension.py b/t/async-generator-and-comprehension.py
deleted file mode 100644
index 2e1b60b..0000000
--- a/t/async-generator-and-comprehension.py
+++ /dev/null
@@ -1,20 +0,0 @@
-import asyncio
-import yappi
-
-
-async def async_generator():
- for i in range(10):
- await asyncio.sleep(0.5)
- yield i
-
-
-async def main():
- r = [a async for a in async_generator()]
- print(sum(r))
-
-
-yappi.set_clock_type("wall")
-yappi.start()
-asyncio.run(main())
-yappi.get_func_stats().print_all()
-yappi.get_thread_stats().print_all()
diff --git a/t/test_functionality.py b/t/test_functionality.py
index f0fa6ed..0302a90 100644
--- a/t/test_functionality.py
+++ b/t/test_functionality.py
@@ -1,7 +1,16 @@
+try:
+ import yappi
+except ImportError:
+ print("yappi module not found. Skipping related tests.")
+ exit(0)
import utils
import asyncio
import threading
+# A test file containing basic async functionality tests. Compares the results
+# of Aergia to both a calculated expected time and yappi reported time, done
+# simply to draw comparisons between the two approaches.
+
class TerminateTaskGroup(Exception):
'''Exception raised to terminate a task group.'''
@@ -39,10 +48,15 @@ class BasicUsage(utils.AergiaUnitTestCase):
self.Aergia.start()
asyncio.run(a())
self.Aergia.stop()
+ yappi.start()
+ asyncio.run(a())
+ yappi.stop()
- samples = self.Aergia.get_samples()
+ yappi_samples = yappi.get_func_stats()
+ aergia_samples = self.Aergia.get_samples()
- self.assert_reasonable_delay('b', delay * num_times, samples)
+ self.assert_reasonable_delay('b', delay * num_times, aergia_samples)
+ self.assert_similar_delay('b', yappi_samples, aergia_samples)
def test_simultaneous_tasks(self):
delay = 0.2
@@ -52,15 +66,22 @@ class BasicUsage(utils.AergiaUnitTestCase):
self.Aergia.start()
asyncio.run(a())
self.Aergia.stop()
+ yappi.start()
+ asyncio.run(a())
+ yappi.stop()
- samples = self.Aergia.get_samples()
+ yappi_samples = yappi.get_func_stats()
+ aergia_samples = self.Aergia.get_samples()
- self.assert_reasonable_delay('b', delay * 3, samples)
+ self.assert_reasonable_delay('b', delay * 3, aergia_samples)
# the gather function is technically waiting for all tasks to finish.
# This might be seen as unintuitive though I don't want to bias the
# results by adding logic to add artificial consistency.
# profiling does not mean obscuring implementation details.
- self.assert_reasonable_delay('a', delay, samples)
+ self.assert_reasonable_delay('a', delay, aergia_samples)
+
+ self.assert_similar_delay('b', yappi_samples, aergia_samples)
+ self.assert_similar_delay('a', yappi_samples, aergia_samples)
def test_subthread_task(self):
delay = 0.2
@@ -74,6 +95,11 @@ class BasicUsage(utils.AergiaUnitTestCase):
x.start()
x.join()
self.Aergia.stop()
+ yappi.start()
+ x = threading.Thread(target=c)
+ x.start()
+ x.join()
+ yappi.stop()
samples = self.Aergia.get_samples()
self.assert_reasonable_delay('c', 0, samples)
@@ -91,6 +117,9 @@ class BasicUsage(utils.AergiaUnitTestCase):
self.Aergia.start()
asyncio.run(a())
self.Aergia.stop()
+ yappi.start()
+ asyncio.run(a())
+ yappi.stop()
samples = self.Aergia.get_samples()
self.assert_reasonable_delay('a', delay, samples)
@@ -112,6 +141,9 @@ class BasicUsage(utils.AergiaUnitTestCase):
self.Aergia.start()
asyncio.run(a())
self.Aergia.stop()
+ yappi.start()
+ asyncio.run(a())
+ yappi.stop()
samples = self.Aergia.get_samples()
self.assert_reasonable_delay('a', d1 + d2 + d3 + d4, samples)
@@ -180,6 +212,9 @@ class BasicUsage(utils.AergiaUnitTestCase):
self.Aergia.start()
asyncio.run(a())
self.Aergia.stop()
+ yappi.start()
+ asyncio.run(a())
+ yappi.stop()
samples = self.Aergia.get_samples()
@@ -205,6 +240,9 @@ class BasicUsage(utils.AergiaUnitTestCase):
self.Aergia.start()
asyncio.run(a())
self.Aergia.stop()
+ yappi.start()
+ asyncio.run(a())
+ yappi.stop()
samples = self.Aergia.get_samples()
@@ -242,6 +280,9 @@ class BasicUsage(utils.AergiaUnitTestCase):
self.Aergia.start()
asyncio.run(a())
self.Aergia.stop()
+ yappi.start()
+ asyncio.run(a())
+ yappi.stop()
samples = self.Aergia.get_samples()
@@ -265,5 +306,8 @@ class BasicUsage(utils.AergiaUnitTestCase):
self.Aergia.start()
asyncio.run(a(3))
self.Aergia.stop()
+ yappi.start()
+ asyncio.run(a(3))
+ yappi.stop()
- samples = self.Aergia.get_samples()
+ # samples = self.Aergia.get_samples()
diff --git a/t/utils.py b/t/utils.py
index 6a168bc..9d77665 100644
--- a/t/utils.py
+++ b/t/utils.py
@@ -1,4 +1,5 @@
from aergia.aergia import Aergia
+import yappi
import unittest
@@ -6,27 +7,44 @@ class AergiaUnitTestCase(unittest.TestCase):
interval = 0.01
Aergia = Aergia(interval)
+ # yappi is a singleton
def setUp(self):
self.Aergia.clear()
+ yappi.stop()
+ yappi.clear_stats()
+ yappi.set_clock_type('wall')
+ yappi.set_context_id_callback(None)
+ yappi.set_context_name_callback(None)
+ yappi.set_tag_callback(None)
+
def assert_reasonable_delay(self, func_name, time_expected, samples):
'''Compares the results reported by Aergia for FUNC_NAME
with time_expected.'''
- samples_expected = self.aergia_expected_samples(time_expected)
samples_actual = self.aergia_extract_values_by_func(samples, func_name)
- self.assert_roughly_equal(samples_actual, samples_expected)
+ time_actual = self.aergia_expected_time(samples_actual)
+ self.assert_roughly_equal(time_actual, time_expected)
+
+ def assert_similar_delay(self, func_name, yappi_stats, aergia_samples):
+ time_yappi = self.yappi_extract_values_by_func(yappi_stats, func_name)
+
+ samples_aergia = self.aergia_extract_values_by_func(
+ aergia_samples, func_name)
+ time_aergia = self.aergia_expected_time(samples_aergia)
+
+ self.assert_roughly_equal(time_aergia, time_yappi)
def assert_roughly_equal(self, v1, v2):
- '''Throws an exception if values V1 and V2 are not within 2.5
- samples of each other.'''
+ '''Throws an exception if values V1 and V2 are not within 0.03
+ seconds of each other.'''
a = abs(v1 - v2)
- self.assertTrue(a <= 2.5, f'{v1} (expected) not roughly {v2} (actual)')
+ self.assertTrue(a <= .03, f'{v1} (expected) not roughly {v2} (actual)')
- def aergia_expected_samples(self, total_seconds):
- '''Given TOTAL_SECONDS, returns the expected number of samples, using
- the sampling interval.'''
- return (total_seconds / self.interval)
+ def aergia_expected_time(self, total_samples):
+ '''Given TOTAL_SAMPLES, returns the total time, using the
+ sampling interval.'''
+ return total_samples * self.interval
def aergia_extract_values_by_func(self, samples, func_name):
'''Returns the total number of samples for function name, given an