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()