cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 1 | #!/usr/bin/env python |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 2 | # |
Chris Liechti | 7c032f1 | 2015-10-27 23:02:00 +0100 | [diff] [blame] | 3 | # This file is part of pySerial - Cross platform serial port support for Python |
| 4 | # (C) 2001-2015 Chris Liechti <cliechti@gmx.net> |
| 5 | # |
| 6 | # SPDX-License-Identifier: BSD-3-Clause |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 7 | """\ |
| 8 | Some tests for the serial module. |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 9 | Part of pyserial (http://pyserial.sf.net) (C)2002 cliechti@gmx.net |
| 10 | |
| 11 | Intended to be run on different platforms, to ensure portability of |
| 12 | the code. |
| 13 | |
| 14 | These tests open a serial port and change all the settings on the fly. |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 15 | If the port is really correctly configured cannot be determined - that |
cliechti | f16c770 | 2009-08-02 00:00:55 +0000 | [diff] [blame] | 16 | would require external hardware or a null modem cable and an other |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 17 | serial port library... Thus it mainly tests that all features are |
| 18 | correctly implemented and that the interface does what it should. |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 19 | |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 20 | """ |
| 21 | |
| 22 | import unittest |
| 23 | import serial |
| 24 | |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 25 | # on which port should the tests be performed: |
Chris Liechti | 8880264 | 2016-10-07 01:17:27 +0200 | [diff] [blame] | 26 | PORT = 'loop://' |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 27 | |
Chris Liechti | 8e37ba9 | 2016-02-03 01:22:22 +0100 | [diff] [blame] | 28 | |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 29 | class Test_ChangeAttributes(unittest.TestCase): |
| 30 | """Test with timeouts""" |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 31 | |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 32 | def setUp(self): |
cliechti | f16c770 | 2009-08-02 00:00:55 +0000 | [diff] [blame] | 33 | # create a closed serial port |
cliechti | e3ab353 | 2009-08-05 12:40:38 +0000 | [diff] [blame] | 34 | self.s = serial.serial_for_url(PORT, do_not_open=True) |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 35 | |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 36 | def tearDown(self): |
| 37 | self.s.close() |
| 38 | |
| 39 | def test_PortSetting(self): |
| 40 | self.s.port = PORT |
Chris Liechti | 8880264 | 2016-10-07 01:17:27 +0200 | [diff] [blame] | 41 | self.assertEqual(self.s.portstr.lower(), PORT.lower()) |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 42 | # test internals |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 43 | self.assertEqual(self.s._port, PORT) |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 44 | # test on the fly change |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 45 | self.s.open() |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 46 | self.assertTrue(self.s.isOpen()) |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 47 | |
cliechti | 8f69e70 | 2011-03-19 00:22:32 +0000 | [diff] [blame] | 48 | def test_DoubleOpen(self): |
cliechti | 8f69e70 | 2011-03-19 00:22:32 +0000 | [diff] [blame] | 49 | self.s.open() |
| 50 | # calling open for a second time is an error |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 51 | self.assertRaises(serial.SerialException, self.s.open) |
cliechti | 8f69e70 | 2011-03-19 00:22:32 +0000 | [diff] [blame] | 52 | |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 53 | def test_BaudrateSetting(self): |
cliechti | 107db8d | 2004-01-15 01:20:23 +0000 | [diff] [blame] | 54 | self.s.open() |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 55 | for baudrate in (300, 9600, 19200, 115200): |
| 56 | self.s.baudrate = baudrate |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 57 | # test get method |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 58 | self.assertEqual(self.s.baudrate, baudrate) |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 59 | # test internals |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 60 | self.assertEqual(self.s._baudrate, baudrate) |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 61 | # test illegal values |
cliechti | 6261161 | 2004-04-20 01:55:43 +0000 | [diff] [blame] | 62 | for illegal_value in (-300, -1, 'a', None): |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 63 | self.assertRaises(ValueError, setattr, self.s, 'baudrate', illegal_value) |
cliechti | 107db8d | 2004-01-15 01:20:23 +0000 | [diff] [blame] | 64 | |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 65 | # skip this test as pyserial now tries to set even non standard baud rates. |
| 66 | # therefore the test can not choose a value that fails on any system. |
| 67 | def disabled_test_BaudrateSetting2(self): |
| 68 | # test illegal values, depending on machine/port some of these may be valid... |
cliechti | 107db8d | 2004-01-15 01:20:23 +0000 | [diff] [blame] | 69 | self.s.open() |
cliechti | f16c770 | 2009-08-02 00:00:55 +0000 | [diff] [blame] | 70 | for illegal_value in (500000, 576000, 921600, 92160): |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 71 | self.assertRaises(ValueError, setattr, self.s, 'baudrate', illegal_value) |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 72 | |
| 73 | def test_BytesizeSetting(self): |
Chris Liechti | 8e37ba9 | 2016-02-03 01:22:22 +0100 | [diff] [blame] | 74 | for bytesize in (5, 6, 7, 8): |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 75 | self.s.bytesize = bytesize |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 76 | # test get method |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 77 | self.assertEqual(self.s.bytesize, bytesize) |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 78 | # test internals |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 79 | self.assertEqual(self.s._bytesize, bytesize) |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 80 | # test illegal values |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 81 | for illegal_value in (0, 1, 3, 4, 9, 10, 'a', None): |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 82 | self.assertRaises(ValueError, setattr, self.s, 'bytesize', illegal_value) |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 83 | |
| 84 | def test_ParitySetting(self): |
| 85 | for parity in (serial.PARITY_NONE, serial.PARITY_EVEN, serial.PARITY_ODD): |
| 86 | self.s.parity = parity |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 87 | # test get method |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 88 | self.assertEqual(self.s.parity, parity) |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 89 | # test internals |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 90 | self.assertEqual(self.s._parity, parity) |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 91 | # test illegal values |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 92 | for illegal_value in (0, 57, 'a', None): |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 93 | self.assertRaises(ValueError, setattr, self.s, 'parity', illegal_value) |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 94 | |
| 95 | def test_StopbitsSetting(self): |
| 96 | for stopbits in (1, 2): |
| 97 | self.s.stopbits = stopbits |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 98 | # test get method |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 99 | self.assertEqual(self.s.stopbits, stopbits) |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 100 | # test internals |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 101 | self.assertEqual(self.s._stopbits, stopbits) |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 102 | # test illegal values |
cliechti | 5fe48d4 | 2009-07-24 12:18:49 +0000 | [diff] [blame] | 103 | for illegal_value in (0, 3, 2.5, 57, 'a', None): |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 104 | self.assertRaises(ValueError, setattr, self.s, 'stopbits', illegal_value) |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 105 | |
| 106 | def test_TimeoutSetting(self): |
| 107 | for timeout in (None, 0, 1, 3.14159, 10, 1000, 3600): |
| 108 | self.s.timeout = timeout |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 109 | # test get method |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 110 | self.assertEqual(self.s.timeout, timeout) |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 111 | # test internals |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 112 | self.assertEqual(self.s._timeout, timeout) |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 113 | # test illegal values |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 114 | for illegal_value in (-1, 'a'): |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 115 | self.assertRaises(ValueError, setattr, self.s, 'timeout', illegal_value) |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 116 | |
| 117 | def test_XonXoffSetting(self): |
| 118 | for xonxoff in (True, False): |
| 119 | self.s.xonxoff = xonxoff |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 120 | # test get method |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 121 | self.assertEqual(self.s.xonxoff, xonxoff) |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 122 | # test internals |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 123 | self.assertEqual(self.s._xonxoff, xonxoff) |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 124 | # no illegal values here, normal rules for the boolean value of an |
| 125 | # object are used thus all objects have a truth value. |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 126 | |
| 127 | def test_RtsCtsSetting(self): |
| 128 | for rtscts in (True, False): |
| 129 | self.s.rtscts = rtscts |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 130 | # test get method |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 131 | self.assertEqual(self.s.rtscts, rtscts) |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 132 | # test internals |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 133 | self.assertEqual(self.s._rtscts, rtscts) |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 134 | # no illegal values here, normal rules for the boolean value of an |
| 135 | # object are used thus all objects have a truth value. |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 136 | |
cliechti | e3ab353 | 2009-08-05 12:40:38 +0000 | [diff] [blame] | 137 | # this test does not work anymore since serial_for_url that is used |
cliechti | c110bf2 | 2009-08-02 23:46:29 +0000 | [diff] [blame] | 138 | # now, already sets a port |
| 139 | def disabled_test_UnconfiguredPort(self): |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 140 | # an unconfigured port cannot be opened |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 141 | self.assertRaises(serial.SerialException, self.s.open) |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 142 | |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 143 | def test_PortOpenClose(self): |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 144 | for i in range(3): |
cliechti | 7fa1a9c | 2009-07-21 21:11:58 +0000 | [diff] [blame] | 145 | # open the port and check flag |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 146 | self.assertTrue(not self.s.isOpen()) |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 147 | self.s.open() |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 148 | self.assertTrue(self.s.isOpen()) |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 149 | self.s.close() |
Chris Liechti | dedd3b7 | 2015-12-11 20:44:22 +0100 | [diff] [blame] | 150 | self.assertTrue(not self.s.isOpen()) |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 151 | |
cliechti | f16c770 | 2009-08-02 00:00:55 +0000 | [diff] [blame] | 152 | |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 153 | if __name__ == '__main__': |
| 154 | import sys |
cliechti | 8f9e577 | 2009-02-07 00:30:53 +0000 | [diff] [blame] | 155 | sys.stdout.write(__doc__) |
cliechti | 764c88c | 2008-06-24 11:56:48 +0000 | [diff] [blame] | 156 | if len(sys.argv) > 1: |
| 157 | PORT = sys.argv[1] |
Chris Liechti | 3debab2 | 2016-06-20 22:52:22 +0200 | [diff] [blame] | 158 | sys.stdout.write("Testing port: {!r}\n".format(PORT)) |
cliechti | 764c88c | 2008-06-24 11:56:48 +0000 | [diff] [blame] | 159 | sys.argv[1:] = ['-v'] |
cliechti | d6bf52c | 2003-10-01 02:28:12 +0000 | [diff] [blame] | 160 | # When this module is executed from the command-line, it runs all its tests |
| 161 | unittest.main() |