Skip to content

Commit 81f873a

Browse files
committed
Add tests for async functions
Signed-off-by: Yury Pliner <yury.pliner@gmail.com>
1 parent 39d2360 commit 81f873a

File tree

2 files changed

+90
-23
lines changed

2 files changed

+90
-23
lines changed

tests/test_core.py

Lines changed: 89 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1+
import asyncio
2+
import aiounittest
13
from concurrent.futures import ThreadPoolExecutor
24
import time
35
import unittest
46

5-
import pytest
6-
77
from prometheus_client.core import (
88
CollectorRegistry, Counter, CounterMetricFamily, Enum, Gauge,
99
GaugeHistogramMetricFamily, GaugeMetricFamily, Histogram,
@@ -28,7 +28,7 @@ def assert_not_observable(fn, *args, **kwargs):
2828
assert False, "Did not raise a 'missing label values' exception"
2929

3030

31-
class TestCounter(unittest.TestCase):
31+
class TestCounter(aiounittest.AsyncTestCase):
3232
def setUp(self):
3333
self.registry = CollectorRegistry()
3434
self.counter = Counter('c_total', 'help', registry=self.registry)
@@ -56,30 +56,42 @@ def f(r):
5656

5757
self.assertEqual((["r"], None, None, None), getargspec(f))
5858

59-
try:
59+
with self.assertRaises(TypeError):
6060
f(False)
61-
except TypeError:
62-
pass
6361
self.assertEqual(0, self.registry.get_sample_value('c_total'))
6462

65-
try:
63+
with self.assertRaises(ValueError):
6664
f(True)
67-
except ValueError:
68-
pass
65+
self.assertEqual(1, self.registry.get_sample_value('c_total'))
66+
67+
async def test_async_function_decorator(self):
68+
@self.counter.count_exceptions(ValueError)
69+
async def f(r):
70+
if r:
71+
raise ValueError
72+
else:
73+
raise TypeError
74+
75+
self.assertEqual((["r"], None, None, None), getargspec(f))
76+
77+
with self.assertRaises(TypeError):
78+
await f(False)
79+
80+
self.assertEqual(0, self.registry.get_sample_value('c_total'))
81+
82+
with self.assertRaises(ValueError):
83+
await f(True)
84+
6985
self.assertEqual(1, self.registry.get_sample_value('c_total'))
7086

7187
def test_block_decorator(self):
7288
with self.counter.count_exceptions():
7389
pass
7490
self.assertEqual(0, self.registry.get_sample_value('c_total'))
7591

76-
raised = False
77-
try:
92+
with self.assertRaises(ValueError):
7893
with self.counter.count_exceptions():
7994
raise ValueError
80-
except:
81-
raised = True
82-
self.assertTrue(raised)
8395
self.assertEqual(1, self.registry.get_sample_value('c_total'))
8496

8597
def test_count_exceptions_not_observable(self):
@@ -115,7 +127,7 @@ def test_exemplar_too_long(self):
115127
})
116128

117129

118-
class TestGauge(unittest.TestCase):
130+
class TestGauge(aiounittest.AsyncTestCase):
119131
def setUp(self):
120132
self.registry = CollectorRegistry()
121133
self.gauge = Gauge('g', 'help', registry=self.registry)
@@ -160,6 +172,18 @@ def f():
160172
f()
161173
self.assertEqual(0, self.registry.get_sample_value('g'))
162174

175+
async def test_inprogress_async_function_decorator(self):
176+
self.assertEqual(0, self.registry.get_sample_value('g'))
177+
178+
@self.gauge.track_inprogress()
179+
async def f():
180+
self.assertEqual(1, self.registry.get_sample_value('g'))
181+
182+
self.assertEqual(([], None, None, None), getargspec(f))
183+
184+
await f()
185+
self.assertEqual(0, self.registry.get_sample_value('g'))
186+
163187
def test_inprogress_block_decorator(self):
164188
self.assertEqual(0, self.registry.get_sample_value('g'))
165189
with self.gauge.track_inprogress():
@@ -185,12 +209,24 @@ def test_time_function_decorator(self):
185209

186210
@self.gauge.time()
187211
def f():
188-
time.sleep(.001)
212+
time.sleep(.05)
189213

190214
self.assertEqual(([], None, None, None), getargspec(f))
191215

192216
f()
193-
self.assertNotEqual(0, self.registry.get_sample_value('g'))
217+
self.assertTrue(0.05 <= self.registry.get_sample_value('g') <= 0.1)
218+
219+
async def test_time_async_function_decorator(self):
220+
self.assertEqual(0, self.registry.get_sample_value('g'))
221+
222+
@self.gauge.time()
223+
async def f():
224+
await asyncio.sleep(.05)
225+
226+
self.assertEqual(([], None, None, None), getargspec(f))
227+
228+
await f()
229+
self.assertTrue(0.05 <= self.registry.get_sample_value('g') <= 0.1)
194230

195231
def test_function_decorator_multithread(self):
196232
self.assertEqual(0, self.registry.get_sample_value('g'))
@@ -239,7 +275,7 @@ def manager():
239275
assert_not_observable(manager)
240276

241277

242-
class TestSummary(unittest.TestCase):
278+
class TestSummary(aiounittest.AsyncTestCase):
243279
def setUp(self):
244280
self.registry = CollectorRegistry()
245281
self.summary = Summary('s', 'help', registry=self.registry)
@@ -264,12 +300,26 @@ def test_function_decorator(self):
264300

265301
@self.summary.time()
266302
def f():
267-
pass
303+
time.sleep(.05)
268304

269305
self.assertEqual(([], None, None, None), getargspec(f))
270306

271307
f()
272308
self.assertEqual(1, self.registry.get_sample_value('s_count'))
309+
self.assertTrue(.05 < self.registry.get_sample_value('s_sum') < 0.1)
310+
311+
async def test_async_function_decorator(self):
312+
self.assertEqual(0, self.registry.get_sample_value('s_count'))
313+
314+
@self.summary.time()
315+
async def f():
316+
await asyncio.sleep(.05)
317+
318+
self.assertEqual(([], None, None, None), getargspec(f))
319+
320+
await f()
321+
self.assertEqual(1, self.registry.get_sample_value('s_count'))
322+
self.assertTrue(.05 < self.registry.get_sample_value('s_sum') < 0.1)
273323

274324
def test_function_decorator_multithread(self):
275325
self.assertEqual(0, self.registry.get_sample_value('s_count'))
@@ -343,7 +393,7 @@ def manager():
343393
assert_not_observable(manager)
344394

345395

346-
class TestHistogram(unittest.TestCase):
396+
class TestHistogram(aiounittest.AsyncTestCase):
347397
def setUp(self):
348398
self.registry = CollectorRegistry()
349399
self.histogram = Histogram('h', 'help', registry=self.registry)
@@ -417,13 +467,29 @@ def test_function_decorator(self):
417467

418468
@self.histogram.time()
419469
def f():
420-
pass
470+
time.sleep(.05)
421471

422472
self.assertEqual(([], None, None, None), getargspec(f))
423473

424474
f()
425475
self.assertEqual(1, self.registry.get_sample_value('h_count'))
426476
self.assertEqual(1, self.registry.get_sample_value('h_bucket', {'le': '+Inf'}))
477+
self.assertTrue(.05 < self.registry.get_sample_value('h_sum') < 0.1)
478+
479+
async def test_async_function_decorator(self):
480+
self.assertEqual(0, self.registry.get_sample_value('h_count'))
481+
self.assertEqual(0, self.registry.get_sample_value('h_bucket', {'le': '+Inf'}))
482+
483+
@self.histogram.time()
484+
async def f():
485+
await asyncio.sleep(.05)
486+
487+
self.assertEqual(([], None, None, None), getargspec(f))
488+
489+
await f()
490+
self.assertEqual(1, self.registry.get_sample_value('h_count'))
491+
self.assertEqual(1, self.registry.get_sample_value('h_bucket', {'le': '+Inf'}))
492+
self.assertTrue(.05 < self.registry.get_sample_value('h_sum') < 0.1)
427493

428494
def test_function_decorator_multithread(self):
429495
self.assertEqual(0, self.registry.get_sample_value('h_count'))
@@ -527,7 +593,7 @@ def test_labels(self):
527593
self.assertRaises(ValueError, self.labels.state, 'a')
528594

529595
def test_overlapping_labels(self):
530-
with pytest.raises(ValueError):
596+
with self.assertRaises(ValueError):
531597
Enum('e', 'help', registry=None, labelnames=['e'])
532598

533599

@@ -568,7 +634,7 @@ def test_incorrect_label_count_raises(self):
568634
self.assertRaises(ValueError, self.counter.remove, 'a', 'b')
569635

570636
def test_labels_on_labels(self):
571-
with pytest.raises(ValueError):
637+
with self.assertRaises(ValueError):
572638
self.counter.labels('a').labels('b')
573639

574640
def test_labels_coerced_to_string(self):

tox.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ envlist = coverage-clean,py3.6,py3.7,py3.8,py3.9,py3.10,pypy3.7,py3.9-nooptional
66
deps =
77
coverage
88
pytest
9+
aiounittest
910
attrs
1011

1112
[testenv]

0 commit comments

Comments
 (0)