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