blob: d0112e41ca221c173cd2472e64b55fa60da0dfa2 [file] [log] [blame]
Giampaolo Rodolàb5c23762010-08-04 09:28:05 +00001#!/usr/bin/env python
2
3import sched
4import time
5import unittest
6from test import support
Serhiy Storchakaf2b9cf42012-12-29 21:34:11 +02007try:
8 import threading
9except ImportError:
10 threading = None
Giampaolo Rodolàb5c23762010-08-04 09:28:05 +000011
12class TestCase(unittest.TestCase):
13
14 def test_enter(self):
15 l = []
16 fun = lambda x: l.append(x)
17 scheduler = sched.scheduler(time.time, time.sleep)
Charles-François Natalif670ca52012-02-16 19:49:48 +010018 for x in [0.5, 0.4, 0.3, 0.2, 0.1]:
Giampaolo Rodolàb5c23762010-08-04 09:28:05 +000019 z = scheduler.enter(x, 1, fun, (x,))
20 scheduler.run()
Charles-François Natalif670ca52012-02-16 19:49:48 +010021 self.assertEqual(l, [0.1, 0.2, 0.3, 0.4, 0.5])
Giampaolo Rodolàb5c23762010-08-04 09:28:05 +000022
23 def test_enterabs(self):
24 l = []
25 fun = lambda x: l.append(x)
26 scheduler = sched.scheduler(time.time, time.sleep)
27 for x in [0.05, 0.04, 0.03, 0.02, 0.01]:
28 z = scheduler.enterabs(x, 1, fun, (x,))
29 scheduler.run()
30 self.assertEqual(l, [0.01, 0.02, 0.03, 0.04, 0.05])
31
Serhiy Storchakaf2b9cf42012-12-29 21:34:11 +020032 @unittest.skipUnless(threading, 'Threading required for this test.')
33 def test_enter_concurrent(self):
34 l = []
35 fun = lambda x: l.append(x)
36 scheduler = sched.scheduler(time.time, time.sleep)
37 scheduler.enter(0.03, 1, fun, (0.03,))
38 t = threading.Thread(target=scheduler.run)
39 t.start()
40 for x in [0.05, 0.04, 0.02, 0.01]:
41 z = scheduler.enter(x, 1, fun, (x,))
42 scheduler.run()
43 t.join()
44 self.assertEqual(l, [0.01, 0.02, 0.03, 0.04, 0.05])
45
Giampaolo Rodolàb5c23762010-08-04 09:28:05 +000046 def test_priority(self):
47 l = []
48 fun = lambda x: l.append(x)
49 scheduler = sched.scheduler(time.time, time.sleep)
50 for priority in [1, 2, 3, 4, 5]:
Charles-François Natalif670ca52012-02-16 19:49:48 +010051 z = scheduler.enterabs(0.01, priority, fun, (priority,))
Giampaolo Rodolàb5c23762010-08-04 09:28:05 +000052 scheduler.run()
53 self.assertEqual(l, [1, 2, 3, 4, 5])
54
55 def test_cancel(self):
56 l = []
57 fun = lambda x: l.append(x)
58 scheduler = sched.scheduler(time.time, time.sleep)
Charles-François Natalif670ca52012-02-16 19:49:48 +010059 now = time.time()
60 event1 = scheduler.enterabs(now + 0.01, 1, fun, (0.01,))
61 event2 = scheduler.enterabs(now + 0.02, 1, fun, (0.02,))
62 event3 = scheduler.enterabs(now + 0.03, 1, fun, (0.03,))
63 event4 = scheduler.enterabs(now + 0.04, 1, fun, (0.04,))
64 event5 = scheduler.enterabs(now + 0.05, 1, fun, (0.05,))
Giampaolo Rodolàb5c23762010-08-04 09:28:05 +000065 scheduler.cancel(event1)
66 scheduler.cancel(event5)
67 scheduler.run()
68 self.assertEqual(l, [0.02, 0.03, 0.04])
69
Serhiy Storchakaf2b9cf42012-12-29 21:34:11 +020070 @unittest.skipUnless(threading, 'Threading required for this test.')
71 def test_cancel_concurrent(self):
72 l = []
73 fun = lambda x: l.append(x)
74 scheduler = sched.scheduler(time.time, time.sleep)
75 now = time.time()
76 event1 = scheduler.enterabs(now + 0.01, 1, fun, (0.01,))
77 event2 = scheduler.enterabs(now + 0.02, 1, fun, (0.02,))
78 event3 = scheduler.enterabs(now + 0.03, 1, fun, (0.03,))
79 event4 = scheduler.enterabs(now + 0.04, 1, fun, (0.04,))
80 event5 = scheduler.enterabs(now + 0.05, 1, fun, (0.05,))
81 t = threading.Thread(target=scheduler.run)
82 t.start()
83 scheduler.cancel(event1)
84 scheduler.cancel(event5)
85 t.join()
86 self.assertEqual(l, [0.02, 0.03, 0.04])
87
Giampaolo Rodolàb5c23762010-08-04 09:28:05 +000088 def test_empty(self):
89 l = []
90 fun = lambda x: l.append(x)
91 scheduler = sched.scheduler(time.time, time.sleep)
92 self.assertTrue(scheduler.empty())
93 for x in [0.05, 0.04, 0.03, 0.02, 0.01]:
94 z = scheduler.enterabs(x, 1, fun, (x,))
95 self.assertFalse(scheduler.empty())
96 scheduler.run()
97 self.assertTrue(scheduler.empty())
98
99 def test_queue(self):
100 l = []
Giampaolo Rodolàb5c23762010-08-04 09:28:05 +0000101 fun = lambda x: l.append(x)
102 scheduler = sched.scheduler(time.time, time.sleep)
Charles-François Natali4a72ebe2012-02-16 19:51:45 +0100103 now = time.time()
104 e5 = scheduler.enterabs(now + 0.05, 1, fun)
105 e1 = scheduler.enterabs(now + 0.01, 1, fun)
106 e2 = scheduler.enterabs(now + 0.02, 1, fun)
107 e4 = scheduler.enterabs(now + 0.04, 1, fun)
108 e3 = scheduler.enterabs(now + 0.03, 1, fun)
Giampaolo Rodola'6a5dcd42011-11-26 12:17:42 +0100109 # queue property is supposed to return an order list of
110 # upcoming events
111 self.assertEqual(list(scheduler.queue), [e1, e2, e3, e4, e5])
Giampaolo Rodolàb5c23762010-08-04 09:28:05 +0000112
Giampaolo Rodola'be55d992011-11-22 13:33:34 +0100113 def test_args_kwargs(self):
114 flag = []
115
116 def fun(*a, **b):
117 flag.append(None)
118 self.assertEqual(a, (1,2,3))
119 self.assertEqual(b, {"foo":1})
120
121 scheduler = sched.scheduler(time.time, time.sleep)
122 z = scheduler.enterabs(0.01, 1, fun, argument=(1,2,3), kwargs={"foo":1})
123 scheduler.run()
124 self.assertEqual(flag, [None])
Giampaolo Rodolàb5c23762010-08-04 09:28:05 +0000125
Giampaolo Rodola'556ba042011-12-14 14:38:45 +0100126 def test_run_non_blocking(self):
127 l = []
128 fun = lambda x: l.append(x)
129 scheduler = sched.scheduler(time.time, time.sleep)
130 for x in [10, 9, 8, 7, 6]:
131 scheduler.enter(x, 1, fun, (x,))
132 scheduler.run(blocking=False)
133 self.assertEqual(l, [])
134
135
Giampaolo Rodolàb5c23762010-08-04 09:28:05 +0000136def test_main():
137 support.run_unittest(TestCase)
138
139if __name__ == "__main__":
140 test_main()