serialutil: add tests for Timeout class
diff --git a/test/test_timeout_class.py b/test/test_timeout_class.py
new file mode 100644
index 0000000..37c38b1
--- /dev/null
+++ b/test/test_timeout_class.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+#
+# This file is part of pySerial - Cross platform serial port support for Python
+# (C) 2016 Chris Liechti <cliechti@gmx.net>
+#
+# SPDX-License-Identifier:    BSD-3-Clause
+"""
+Test Timeout helper class.
+"""
+import sys
+import unittest
+import time
+from serial import serialutil
+
+
+class TestTimeoutClass(unittest.TestCase):
+    """Test the Timeout class"""
+
+    def test_simple_timeout(self):
+        """Test simple timeout"""
+        t = serialutil.Timeout(2)
+        self.assertFalse(t.expired())
+        self.assertTrue(t.time_left() > 0)
+        time.sleep(2.1)
+        self.assertTrue(t.expired())
+        self.assertEqual(t.time_left(), 0)
+
+    def test_non_blocking(self):
+        """Test nonblocking case (0)"""
+        t = serialutil.Timeout(0)
+        self.assertTrue(t.is_non_blocking)
+        self.assertFalse(t.is_infinite)
+        self.assertTrue(t.expired())
+
+    def test_blocking(self):
+        """Test no timeout (None)"""
+        t = serialutil.Timeout(None)
+        self.assertFalse(t.is_non_blocking)
+        self.assertTrue(t.is_infinite)
+        #~ self.assertFalse(t.expired())
+
+    def test_changing_clock(self):
+        """Test recovery from chaning clock"""
+        class T(serialutil.Timeout):
+            def TIME(self):
+                return test_time
+        test_time = 1000
+        t = T(10)
+        self.assertEqual(t.target_time, 1010)
+        self.assertFalse(t.expired())
+        self.assertTrue(t.time_left() > 0)
+        test_time = 100  # clock jumps way back
+        self.assertTrue(t.time_left() > 0)
+        self.assertTrue(t.time_left() <= 10)
+        self.assertEqual(t.target_time, 110)
+        test_time = 10000  # jump way forward
+        self.assertEqual(t.time_left(), 0)  # if will expire immediately
+
+
+if __name__ == '__main__':
+    sys.stdout.write(__doc__)
+    if len(sys.argv) > 1:
+        PORT = sys.argv[1]
+    sys.argv[1:] = ['-v']
+    # When this module is executed from the command-line, it runs all its tests
+    unittest.main()