blob: 8f83a40a39af36ea7e34974e94645903d63ceff0 [file] [log] [blame]
cliechtid6bf52c2003-10-01 02:28:12 +00001#!/usr/bin/env python
cliechtid6bf52c2003-10-01 02:28:12 +00002#
Chris Liechti7c032f12015-10-27 23:02:00 +01003# 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
cliechti7fa1a9c2009-07-21 21:11:58 +00007"""\
8Some tests for the serial module.
cliechtid6bf52c2003-10-01 02:28:12 +00009Part of pyserial (http://pyserial.sf.net) (C)2002 cliechti@gmx.net
10
11Intended to be run on different platforms, to ensure portability of
12the code.
13
14These tests open a serial port and change all the settings on the fly.
cliechti7fa1a9c2009-07-21 21:11:58 +000015If the port is really correctly configured cannot be determined - that
cliechtif16c7702009-08-02 00:00:55 +000016would require external hardware or a null modem cable and an other
cliechtid6bf52c2003-10-01 02:28:12 +000017serial port library... Thus it mainly tests that all features are
18correctly implemented and that the interface does what it should.
cliechti7fa1a9c2009-07-21 21:11:58 +000019
cliechtid6bf52c2003-10-01 02:28:12 +000020"""
21
22import unittest
23import serial
24
cliechti7fa1a9c2009-07-21 21:11:58 +000025# on which port should the tests be performed:
cliechtif16c7702009-08-02 00:00:55 +000026PORT = 0
cliechtid6bf52c2003-10-01 02:28:12 +000027
28class Test_ChangeAttributes(unittest.TestCase):
29 """Test with timeouts"""
cliechti7fa1a9c2009-07-21 21:11:58 +000030
cliechtid6bf52c2003-10-01 02:28:12 +000031 def setUp(self):
cliechtif16c7702009-08-02 00:00:55 +000032 # create a closed serial port
cliechtie3ab3532009-08-05 12:40:38 +000033 self.s = serial.serial_for_url(PORT, do_not_open=True)
cliechti7fa1a9c2009-07-21 21:11:58 +000034
cliechtid6bf52c2003-10-01 02:28:12 +000035 def tearDown(self):
36 self.s.close()
37
38 def test_PortSetting(self):
39 self.s.port = PORT
cliechti7fa1a9c2009-07-21 21:11:58 +000040 # portstr has to be set
cliechti764c88c2008-06-24 11:56:48 +000041 if isinstance(PORT, str):
Chris Liechtidedd3b72015-12-11 20:44:22 +010042 self.assertEqual(self.s.portstr.lower(), PORT.lower())
cliechti764c88c2008-06-24 11:56:48 +000043 else:
Chris Liechtidedd3b72015-12-11 20:44:22 +010044 self.assertEqual(self.s.portstr, serial.device(PORT))
cliechti7fa1a9c2009-07-21 21:11:58 +000045 # test internals
Chris Liechtidedd3b72015-12-11 20:44:22 +010046 self.assertEqual(self.s._port, PORT)
cliechti7fa1a9c2009-07-21 21:11:58 +000047 # test on the fly change
cliechtid6bf52c2003-10-01 02:28:12 +000048 self.s.open()
Chris Liechtidedd3b72015-12-11 20:44:22 +010049 self.assertTrue(self.s.isOpen())
Chris Liechtia6f0b762015-08-03 15:48:56 +020050 #~ try:
51 #~ self.s.port = 0
52 #~ except serial.SerialException: # port not available on system
53 #~ pass # can't test on this machine...
54 #~ else:
55 #~ self.failUnless(self.s.isOpen())
56 #~ self.failUnlessEqual(self.s.port, 0)
57 #~ self.failUnlessEqual(self.s.portstr, serial.device(0))
58 #~ try:
59 #~ self.s.port = 1
60 #~ except serial.SerialException: # port not available on system
61 #~ pass # can't test on this machine...
62 #~ else:
63 #~ self.failUnless(self.s.isOpen())
64 #~ self.failUnlessEqual(self.s.port, 1)
65 #~ self.failUnlessEqual(self.s.portstr, serial.device(1))
cliechtid6bf52c2003-10-01 02:28:12 +000066
cliechti8f69e702011-03-19 00:22:32 +000067 def test_DoubleOpen(self):
68 self.s.port = PORT
69 self.s.open()
70 # calling open for a second time is an error
Chris Liechtidedd3b72015-12-11 20:44:22 +010071 self.assertRaises(serial.SerialException, self.s.open)
cliechti8f69e702011-03-19 00:22:32 +000072
73
cliechtid6bf52c2003-10-01 02:28:12 +000074 def test_BaudrateSetting(self):
cliechti107db8d2004-01-15 01:20:23 +000075 self.s.port = PORT
76 self.s.open()
cliechtid6bf52c2003-10-01 02:28:12 +000077 for baudrate in (300, 9600, 19200, 115200):
78 self.s.baudrate = baudrate
cliechti7fa1a9c2009-07-21 21:11:58 +000079 # test get method
Chris Liechtidedd3b72015-12-11 20:44:22 +010080 self.assertEqual(self.s.baudrate, baudrate)
cliechti7fa1a9c2009-07-21 21:11:58 +000081 # test internals
Chris Liechtidedd3b72015-12-11 20:44:22 +010082 self.assertEqual(self.s._baudrate, baudrate)
cliechti7fa1a9c2009-07-21 21:11:58 +000083 # test illegal values
cliechti62611612004-04-20 01:55:43 +000084 for illegal_value in (-300, -1, 'a', None):
Chris Liechtidedd3b72015-12-11 20:44:22 +010085 self.assertRaises(ValueError, setattr, self.s, 'baudrate', illegal_value)
cliechti107db8d2004-01-15 01:20:23 +000086
cliechti7fa1a9c2009-07-21 21:11:58 +000087 # skip this test as pyserial now tries to set even non standard baud rates.
88 # therefore the test can not choose a value that fails on any system.
89 def disabled_test_BaudrateSetting2(self):
90 # test illegal values, depending on machine/port some of these may be valid...
cliechti107db8d2004-01-15 01:20:23 +000091 self.s.port = PORT
92 self.s.open()
cliechtif16c7702009-08-02 00:00:55 +000093 for illegal_value in (500000, 576000, 921600, 92160):
Chris Liechtidedd3b72015-12-11 20:44:22 +010094 self.assertRaises(ValueError, setattr, self.s, 'baudrate', illegal_value)
cliechtid6bf52c2003-10-01 02:28:12 +000095
96 def test_BytesizeSetting(self):
97 for bytesize in (5,6,7,8):
98 self.s.bytesize = bytesize
cliechti7fa1a9c2009-07-21 21:11:58 +000099 # test get method
Chris Liechtidedd3b72015-12-11 20:44:22 +0100100 self.assertEqual(self.s.bytesize, bytesize)
cliechti7fa1a9c2009-07-21 21:11:58 +0000101 # test internals
Chris Liechtidedd3b72015-12-11 20:44:22 +0100102 self.assertEqual(self.s._bytesize, bytesize)
cliechti7fa1a9c2009-07-21 21:11:58 +0000103 # test illegal values
cliechtid6bf52c2003-10-01 02:28:12 +0000104 for illegal_value in (0, 1, 3, 4, 9, 10, 'a', None):
Chris Liechtidedd3b72015-12-11 20:44:22 +0100105 self.assertRaises(ValueError, setattr, self.s, 'bytesize', illegal_value)
cliechtid6bf52c2003-10-01 02:28:12 +0000106
107 def test_ParitySetting(self):
108 for parity in (serial.PARITY_NONE, serial.PARITY_EVEN, serial.PARITY_ODD):
109 self.s.parity = parity
cliechti7fa1a9c2009-07-21 21:11:58 +0000110 # test get method
Chris Liechtidedd3b72015-12-11 20:44:22 +0100111 self.assertEqual(self.s.parity, parity)
cliechti7fa1a9c2009-07-21 21:11:58 +0000112 # test internals
Chris Liechtidedd3b72015-12-11 20:44:22 +0100113 self.assertEqual(self.s._parity, parity)
cliechti7fa1a9c2009-07-21 21:11:58 +0000114 # test illegal values
cliechtid6bf52c2003-10-01 02:28:12 +0000115 for illegal_value in (0, 57, 'a', None):
Chris Liechtidedd3b72015-12-11 20:44:22 +0100116 self.assertRaises(ValueError, setattr, self.s, 'parity', illegal_value)
cliechtid6bf52c2003-10-01 02:28:12 +0000117
118 def test_StopbitsSetting(self):
119 for stopbits in (1, 2):
120 self.s.stopbits = stopbits
cliechti7fa1a9c2009-07-21 21:11:58 +0000121 # test get method
Chris Liechtidedd3b72015-12-11 20:44:22 +0100122 self.assertEqual(self.s.stopbits, stopbits)
cliechti7fa1a9c2009-07-21 21:11:58 +0000123 # test internals
Chris Liechtidedd3b72015-12-11 20:44:22 +0100124 self.assertEqual(self.s._stopbits, stopbits)
cliechti7fa1a9c2009-07-21 21:11:58 +0000125 # test illegal values
cliechti5fe48d42009-07-24 12:18:49 +0000126 for illegal_value in (0, 3, 2.5, 57, 'a', None):
Chris Liechtidedd3b72015-12-11 20:44:22 +0100127 self.assertRaises(ValueError, setattr, self.s, 'stopbits', illegal_value)
cliechtid6bf52c2003-10-01 02:28:12 +0000128
129 def test_TimeoutSetting(self):
130 for timeout in (None, 0, 1, 3.14159, 10, 1000, 3600):
131 self.s.timeout = timeout
cliechti7fa1a9c2009-07-21 21:11:58 +0000132 # test get method
Chris Liechtidedd3b72015-12-11 20:44:22 +0100133 self.assertEqual(self.s.timeout, timeout)
cliechti7fa1a9c2009-07-21 21:11:58 +0000134 # test internals
Chris Liechtidedd3b72015-12-11 20:44:22 +0100135 self.assertEqual(self.s._timeout, timeout)
cliechti7fa1a9c2009-07-21 21:11:58 +0000136 # test illegal values
cliechtid6bf52c2003-10-01 02:28:12 +0000137 for illegal_value in (-1, 'a'):
Chris Liechtidedd3b72015-12-11 20:44:22 +0100138 self.assertRaises(ValueError, setattr, self.s, 'timeout', illegal_value)
cliechtid6bf52c2003-10-01 02:28:12 +0000139
140 def test_XonXoffSetting(self):
141 for xonxoff in (True, False):
142 self.s.xonxoff = xonxoff
cliechti7fa1a9c2009-07-21 21:11:58 +0000143 # test get method
Chris Liechtidedd3b72015-12-11 20:44:22 +0100144 self.assertEqual(self.s.xonxoff, xonxoff)
cliechti7fa1a9c2009-07-21 21:11:58 +0000145 # test internals
Chris Liechtidedd3b72015-12-11 20:44:22 +0100146 self.assertEqual(self.s._xonxoff, xonxoff)
cliechti7fa1a9c2009-07-21 21:11:58 +0000147 # no illegal values here, normal rules for the boolean value of an
148 # object are used thus all objects have a truth value.
cliechtid6bf52c2003-10-01 02:28:12 +0000149
150 def test_RtsCtsSetting(self):
151 for rtscts in (True, False):
152 self.s.rtscts = rtscts
cliechti7fa1a9c2009-07-21 21:11:58 +0000153 # test get method
Chris Liechtidedd3b72015-12-11 20:44:22 +0100154 self.assertEqual(self.s.rtscts, rtscts)
cliechti7fa1a9c2009-07-21 21:11:58 +0000155 # test internals
Chris Liechtidedd3b72015-12-11 20:44:22 +0100156 self.assertEqual(self.s._rtscts, rtscts)
cliechti7fa1a9c2009-07-21 21:11:58 +0000157 # no illegal values here, normal rules for the boolean value of an
158 # object are used thus all objects have a truth value.
cliechtid6bf52c2003-10-01 02:28:12 +0000159
cliechtie3ab3532009-08-05 12:40:38 +0000160 # this test does not work anymore since serial_for_url that is used
cliechtic110bf22009-08-02 23:46:29 +0000161 # now, already sets a port
162 def disabled_test_UnconfiguredPort(self):
cliechti7fa1a9c2009-07-21 21:11:58 +0000163 # an unconfigured port cannot be opened
Chris Liechtidedd3b72015-12-11 20:44:22 +0100164 self.assertRaises(serial.SerialException, self.s.open)
cliechti7fa1a9c2009-07-21 21:11:58 +0000165
cliechtid6bf52c2003-10-01 02:28:12 +0000166 def test_PortOpenClose(self):
167 self.s.port = PORT
168 for i in range(3):
cliechti7fa1a9c2009-07-21 21:11:58 +0000169 # open the port and check flag
Chris Liechtidedd3b72015-12-11 20:44:22 +0100170 self.assertTrue(not self.s.isOpen())
cliechtid6bf52c2003-10-01 02:28:12 +0000171 self.s.open()
Chris Liechtidedd3b72015-12-11 20:44:22 +0100172 self.assertTrue(self.s.isOpen())
cliechtid6bf52c2003-10-01 02:28:12 +0000173 self.s.close()
Chris Liechtidedd3b72015-12-11 20:44:22 +0100174 self.assertTrue(not self.s.isOpen())
cliechtid6bf52c2003-10-01 02:28:12 +0000175
cliechtif16c7702009-08-02 00:00:55 +0000176
cliechtid6bf52c2003-10-01 02:28:12 +0000177if __name__ == '__main__':
178 import sys
cliechti8f9e5772009-02-07 00:30:53 +0000179 sys.stdout.write(__doc__)
cliechti764c88c2008-06-24 11:56:48 +0000180 if len(sys.argv) > 1:
181 PORT = sys.argv[1]
cliechti7fa1a9c2009-07-21 21:11:58 +0000182 sys.stdout.write("Testing port: %r\n" % PORT)
cliechti764c88c2008-06-24 11:56:48 +0000183 sys.argv[1:] = ['-v']
cliechtid6bf52c2003-10-01 02:28:12 +0000184 # When this module is executed from the command-line, it runs all its tests
185 unittest.main()