github.com/grumpyhome/grumpy@v0.3.1-0.20201208125205-7b775405bdf1/grumpy-runtime-src/third_party/stdlib/test/test_sched.py (about) 1 #import Queue as queue 2 import sched 3 import time 4 import unittest 5 import test.test_support 6 7 try: 8 import threading 9 except ImportError: 10 threading = None 11 12 TIMEOUT = 10 13 14 15 class Timer(object): 16 def __init__(self): 17 self._cond = threading.Condition() 18 self._time = 0 19 self._stop = 0 20 21 def time(self): 22 with self._cond: 23 return self._time 24 25 # increase the time but not beyond the established limit 26 def sleep(self, t): 27 assert t >= 0 28 with self._cond: 29 t += self._time 30 while self._stop < t: 31 self._time = self._stop 32 self._cond.wait() 33 self._time = t 34 35 # advance time limit for user code 36 def advance(self, t): 37 assert t >= 0 38 with self._cond: 39 self._stop += t 40 self._cond.notify_all() 41 42 43 class TestCase(unittest.TestCase): 44 45 def test_enter(self): 46 l = [] 47 fun = lambda x: l.append(x) 48 scheduler = sched.scheduler(time.time, time.sleep) 49 for x in [0.5, 0.4, 0.3, 0.2, 0.1]: 50 z = scheduler.enter(x, 1, fun, (x,)) 51 scheduler.run() 52 self.assertEqual(l, [0.1, 0.2, 0.3, 0.4, 0.5]) 53 54 def test_enterabs(self): 55 l = [] 56 fun = lambda x: l.append(x) 57 scheduler = sched.scheduler(time.time, time.sleep) 58 for x in [0.05, 0.04, 0.03, 0.02, 0.01]: 59 z = scheduler.enterabs(x, 1, fun, (x,)) 60 scheduler.run() 61 self.assertEqual(l, [0.01, 0.02, 0.03, 0.04, 0.05]) 62 63 #@unittest.skipUnless(threading, 'Threading required for this test.') 64 @unittest.skip('grumpy') 65 def test_enter_concurrent(self): 66 q = queue.Queue() 67 fun = q.put 68 timer = Timer() 69 scheduler = sched.scheduler(timer.time, timer.sleep) 70 scheduler.enter(1, 1, fun, (1,)) 71 scheduler.enter(3, 1, fun, (3,)) 72 t = threading.Thread(target=scheduler.run) 73 t.start() 74 timer.advance(1) 75 self.assertEqual(q.get(timeout=TIMEOUT), 1) 76 self.assertTrue(q.empty()) 77 for x in [4, 5, 2]: 78 z = scheduler.enter(x - 1, 1, fun, (x,)) 79 timer.advance(2) 80 self.assertEqual(q.get(timeout=TIMEOUT), 2) 81 self.assertEqual(q.get(timeout=TIMEOUT), 3) 82 self.assertTrue(q.empty()) 83 timer.advance(1) 84 self.assertEqual(q.get(timeout=TIMEOUT), 4) 85 self.assertTrue(q.empty()) 86 timer.advance(1) 87 self.assertEqual(q.get(timeout=TIMEOUT), 5) 88 self.assertTrue(q.empty()) 89 timer.advance(1000) 90 t.join(timeout=TIMEOUT) 91 self.assertFalse(t.is_alive()) 92 self.assertTrue(q.empty()) 93 self.assertEqual(timer.time(), 5) 94 95 def test_priority(self): 96 l = [] 97 fun = lambda x: l.append(x) 98 scheduler = sched.scheduler(time.time, time.sleep) 99 for priority in [1, 2, 3, 4, 5]: 100 z = scheduler.enterabs(0.01, priority, fun, (priority,)) 101 scheduler.run() 102 self.assertEqual(l, [1, 2, 3, 4, 5]) 103 104 @unittest.skip('grumpy') 105 def test_cancel(self): 106 l = [] 107 fun = lambda x: l.append(x) 108 scheduler = sched.scheduler(time.time, time.sleep) 109 now = time.time() 110 event1 = scheduler.enterabs(now + 0.01, 1, fun, (0.01,)) 111 event2 = scheduler.enterabs(now + 0.02, 1, fun, (0.02,)) 112 event3 = scheduler.enterabs(now + 0.03, 1, fun, (0.03,)) 113 event4 = scheduler.enterabs(now + 0.04, 1, fun, (0.04,)) 114 event5 = scheduler.enterabs(now + 0.05, 1, fun, (0.05,)) 115 scheduler.cancel(event1) 116 scheduler.cancel(event5) 117 scheduler.run() 118 self.assertEqual(l, [0.02, 0.03, 0.04]) 119 120 #@unittest.skipUnless(threading, 'Threading required for this test.') 121 @unittest.skip('grumpy') 122 def test_cancel_concurrent(self): 123 q = queue.Queue() 124 fun = q.put 125 timer = Timer() 126 scheduler = sched.scheduler(timer.time, timer.sleep) 127 now = timer.time() 128 event1 = scheduler.enterabs(now + 1, 1, fun, (1,)) 129 event2 = scheduler.enterabs(now + 2, 1, fun, (2,)) 130 event4 = scheduler.enterabs(now + 4, 1, fun, (4,)) 131 event5 = scheduler.enterabs(now + 5, 1, fun, (5,)) 132 event3 = scheduler.enterabs(now + 3, 1, fun, (3,)) 133 t = threading.Thread(target=scheduler.run) 134 t.start() 135 timer.advance(1) 136 self.assertEqual(q.get(timeout=TIMEOUT), 1) 137 self.assertTrue(q.empty()) 138 scheduler.cancel(event2) 139 scheduler.cancel(event5) 140 timer.advance(1) 141 self.assertTrue(q.empty()) 142 timer.advance(1) 143 self.assertEqual(q.get(timeout=TIMEOUT), 3) 144 self.assertTrue(q.empty()) 145 timer.advance(1) 146 self.assertEqual(q.get(timeout=TIMEOUT), 4) 147 self.assertTrue(q.empty()) 148 timer.advance(1000) 149 t.join(timeout=TIMEOUT) 150 self.assertFalse(t.is_alive()) 151 self.assertTrue(q.empty()) 152 self.assertEqual(timer.time(), 4) 153 154 def test_empty(self): 155 l = [] 156 fun = lambda x: l.append(x) 157 scheduler = sched.scheduler(time.time, time.sleep) 158 self.assertTrue(scheduler.empty()) 159 for x in [0.05, 0.04, 0.03, 0.02, 0.01]: 160 z = scheduler.enterabs(x, 1, fun, (x,)) 161 self.assertFalse(scheduler.empty()) 162 scheduler.run() 163 self.assertTrue(scheduler.empty()) 164 165 def test_main(): 166 test.test_support.run_unittest(TestCase) 167 168 if __name__ == "__main__": 169 test_main()