1+ import asyncio
12from concurrent .futures import ThreadPoolExecutor
23import time
34import unittest
45
5- import pytest
6+ import aiounittest
67
78from prometheus_client .core import (
89 CollectorRegistry , Counter , CounterMetricFamily , Enum , Gauge ,
@@ -28,7 +29,7 @@ def assert_not_observable(fn, *args, **kwargs):
2829 assert False , "Did not raise a 'missing label values' exception"
2930
3031
31- class TestCounter (unittest . TestCase ):
32+ class TestCounter (aiounittest . AsyncTestCase ):
3233 def setUp (self ):
3334 self .registry = CollectorRegistry ()
3435 self .counter = Counter ('c_total' , 'help' , registry = self .registry )
@@ -56,30 +57,42 @@ def f(r):
5657
5758 self .assertEqual ((["r" ], None , None , None ), getargspec (f ))
5859
59- try :
60+ with self . assertRaises ( TypeError ) :
6061 f (False )
61- except TypeError :
62- pass
6362 self .assertEqual (0 , self .registry .get_sample_value ('c_total' ))
6463
65- try :
64+ with self . assertRaises ( ValueError ) :
6665 f (True )
67- except ValueError :
68- pass
66+ self .assertEqual (1 , self .registry .get_sample_value ('c_total' ))
67+
68+ async def test_async_function_decorator (self ):
69+ @self .counter .count_exceptions (ValueError )
70+ async def f (r ):
71+ if r :
72+ raise ValueError
73+ else :
74+ raise TypeError
75+
76+ self .assertEqual ((["r" ], None , None , None ), getargspec (f ))
77+
78+ with self .assertRaises (TypeError ):
79+ await f (False )
80+
81+ self .assertEqual (0 , self .registry .get_sample_value ('c_total' ))
82+
83+ with self .assertRaises (ValueError ):
84+ await f (True )
85+
6986 self .assertEqual (1 , self .registry .get_sample_value ('c_total' ))
7087
7188 def test_block_decorator (self ):
7289 with self .counter .count_exceptions ():
7390 pass
7491 self .assertEqual (0 , self .registry .get_sample_value ('c_total' ))
7592
76- raised = False
77- try :
93+ with self .assertRaises (ValueError ):
7894 with self .counter .count_exceptions ():
7995 raise ValueError
80- except :
81- raised = True
82- self .assertTrue (raised )
8396 self .assertEqual (1 , self .registry .get_sample_value ('c_total' ))
8497
8598 def test_count_exceptions_not_observable (self ):
@@ -115,7 +128,7 @@ def test_exemplar_too_long(self):
115128 })
116129
117130
118- class TestGauge (unittest . TestCase ):
131+ class TestGauge (aiounittest . AsyncTestCase ):
119132 def setUp (self ):
120133 self .registry = CollectorRegistry ()
121134 self .gauge = Gauge ('g' , 'help' , registry = self .registry )
@@ -160,6 +173,18 @@ def f():
160173 f ()
161174 self .assertEqual (0 , self .registry .get_sample_value ('g' ))
162175
176+ async def test_inprogress_async_function_decorator (self ):
177+ self .assertEqual (0 , self .registry .get_sample_value ('g' ))
178+
179+ @self .gauge .track_inprogress ()
180+ async def f ():
181+ self .assertEqual (1 , self .registry .get_sample_value ('g' ))
182+
183+ self .assertEqual (([], None , None , None ), getargspec (f ))
184+
185+ await f ()
186+ self .assertEqual (0 , self .registry .get_sample_value ('g' ))
187+
163188 def test_inprogress_block_decorator (self ):
164189 self .assertEqual (0 , self .registry .get_sample_value ('g' ))
165190 with self .gauge .track_inprogress ():
@@ -185,12 +210,24 @@ def test_time_function_decorator(self):
185210
186211 @self .gauge .time ()
187212 def f ():
188- time .sleep (.001 )
213+ time .sleep (.05 )
189214
190215 self .assertEqual (([], None , None , None ), getargspec (f ))
191216
192217 f ()
193- self .assertNotEqual (0 , self .registry .get_sample_value ('g' ))
218+ self .assertTrue (0.05 <= self .registry .get_sample_value ('g' ) <= 0.1 )
219+
220+ async def test_time_async_function_decorator (self ):
221+ self .assertEqual (0 , self .registry .get_sample_value ('g' ))
222+
223+ @self .gauge .time ()
224+ async def f ():
225+ await asyncio .sleep (.05 )
226+
227+ self .assertEqual (([], None , None , None ), getargspec (f ))
228+
229+ await f ()
230+ self .assertTrue (0.05 <= self .registry .get_sample_value ('g' ) <= 0.1 )
194231
195232 def test_function_decorator_multithread (self ):
196233 self .assertEqual (0 , self .registry .get_sample_value ('g' ))
@@ -239,7 +276,7 @@ def manager():
239276 assert_not_observable (manager )
240277
241278
242- class TestSummary (unittest . TestCase ):
279+ class TestSummary (aiounittest . AsyncTestCase ):
243280 def setUp (self ):
244281 self .registry = CollectorRegistry ()
245282 self .summary = Summary ('s' , 'help' , registry = self .registry )
@@ -264,12 +301,26 @@ def test_function_decorator(self):
264301
265302 @self .summary .time ()
266303 def f ():
267- pass
304+ time . sleep ( .05 )
268305
269306 self .assertEqual (([], None , None , None ), getargspec (f ))
270307
271308 f ()
272309 self .assertEqual (1 , self .registry .get_sample_value ('s_count' ))
310+ self .assertTrue (.05 < self .registry .get_sample_value ('s_sum' ) < 0.1 )
311+
312+ async def test_async_function_decorator (self ):
313+ self .assertEqual (0 , self .registry .get_sample_value ('s_count' ))
314+
315+ @self .summary .time ()
316+ async def f ():
317+ await asyncio .sleep (.05 )
318+
319+ self .assertEqual (([], None , None , None ), getargspec (f ))
320+
321+ await f ()
322+ self .assertEqual (1 , self .registry .get_sample_value ('s_count' ))
323+ self .assertTrue (.05 < self .registry .get_sample_value ('s_sum' ) < 0.1 )
273324
274325 def test_function_decorator_multithread (self ):
275326 self .assertEqual (0 , self .registry .get_sample_value ('s_count' ))
@@ -343,7 +394,7 @@ def manager():
343394 assert_not_observable (manager )
344395
345396
346- class TestHistogram (unittest . TestCase ):
397+ class TestHistogram (aiounittest . AsyncTestCase ):
347398 def setUp (self ):
348399 self .registry = CollectorRegistry ()
349400 self .histogram = Histogram ('h' , 'help' , registry = self .registry )
@@ -417,13 +468,29 @@ def test_function_decorator(self):
417468
418469 @self .histogram .time ()
419470 def f ():
420- pass
471+ time . sleep ( .05 )
421472
422473 self .assertEqual (([], None , None , None ), getargspec (f ))
423474
424475 f ()
425476 self .assertEqual (1 , self .registry .get_sample_value ('h_count' ))
426477 self .assertEqual (1 , self .registry .get_sample_value ('h_bucket' , {'le' : '+Inf' }))
478+ self .assertTrue (.05 < self .registry .get_sample_value ('h_sum' ) < 0.1 )
479+
480+ async def test_async_function_decorator (self ):
481+ self .assertEqual (0 , self .registry .get_sample_value ('h_count' ))
482+ self .assertEqual (0 , self .registry .get_sample_value ('h_bucket' , {'le' : '+Inf' }))
483+
484+ @self .histogram .time ()
485+ async def f ():
486+ await asyncio .sleep (.05 )
487+
488+ self .assertEqual (([], None , None , None ), getargspec (f ))
489+
490+ await f ()
491+ self .assertEqual (1 , self .registry .get_sample_value ('h_count' ))
492+ self .assertEqual (1 , self .registry .get_sample_value ('h_bucket' , {'le' : '+Inf' }))
493+ self .assertTrue (.05 < self .registry .get_sample_value ('h_sum' ) < 0.1 )
427494
428495 def test_function_decorator_multithread (self ):
429496 self .assertEqual (0 , self .registry .get_sample_value ('h_count' ))
@@ -527,7 +594,7 @@ def test_labels(self):
527594 self .assertRaises (ValueError , self .labels .state , 'a' )
528595
529596 def test_overlapping_labels (self ):
530- with pytest . raises (ValueError ):
597+ with self . assertRaises (ValueError ):
531598 Enum ('e' , 'help' , registry = None , labelnames = ['e' ])
532599
533600
@@ -568,7 +635,7 @@ def test_incorrect_label_count_raises(self):
568635 self .assertRaises (ValueError , self .counter .remove , 'a' , 'b' )
569636
570637 def test_labels_on_labels (self ):
571- with pytest . raises (ValueError ):
638+ with self . assertRaises (ValueError ):
572639 self .counter .labels ('a' ).labels ('b' )
573640
574641 def test_labels_coerced_to_string (self ):
0 commit comments