blob: 37c38b1e6fce0ea2308e28f740b7ed5bd0af4be4 [file] [log] [blame]
Chris Liechti012df5c2016-09-05 00:11:18 +02001#!/usr/bin/env python
2#
3# This file is part of pySerial - Cross platform serial port support for Python
4# (C) 2016 Chris Liechti <cliechti@gmx.net>
5#
6# SPDX-License-Identifier: BSD-3-Clause
7"""
8Test Timeout helper class.
9"""
10import sys
11import unittest
12import time
13from serial import serialutil
14
15
16class TestTimeoutClass(unittest.TestCase):
17 """Test the Timeout class"""
18
19 def test_simple_timeout(self):
20 """Test simple timeout"""
21 t = serialutil.Timeout(2)
22 self.assertFalse(t.expired())
23 self.assertTrue(t.time_left() > 0)
24 time.sleep(2.1)
25 self.assertTrue(t.expired())
26 self.assertEqual(t.time_left(), 0)
27
28 def test_non_blocking(self):
29 """Test nonblocking case (0)"""
30 t = serialutil.Timeout(0)
31 self.assertTrue(t.is_non_blocking)
32 self.assertFalse(t.is_infinite)
33 self.assertTrue(t.expired())
34
35 def test_blocking(self):
36 """Test no timeout (None)"""
37 t = serialutil.Timeout(None)
38 self.assertFalse(t.is_non_blocking)
39 self.assertTrue(t.is_infinite)
40 #~ self.assertFalse(t.expired())
41
42 def test_changing_clock(self):
43 """Test recovery from chaning clock"""
44 class T(serialutil.Timeout):
45 def TIME(self):
46 return test_time
47 test_time = 1000
48 t = T(10)
49 self.assertEqual(t.target_time, 1010)
50 self.assertFalse(t.expired())
51 self.assertTrue(t.time_left() > 0)
52 test_time = 100 # clock jumps way back
53 self.assertTrue(t.time_left() > 0)
54 self.assertTrue(t.time_left() <= 10)
55 self.assertEqual(t.target_time, 110)
56 test_time = 10000 # jump way forward
57 self.assertEqual(t.time_left(), 0) # if will expire immediately
58
59
60if __name__ == '__main__':
61 sys.stdout.write(__doc__)
62 if len(sys.argv) > 1:
63 PORT = sys.argv[1]
64 sys.argv[1:] = ['-v']
65 # When this module is executed from the command-line, it runs all its tests
66 unittest.main()