blob: a297471c7b4f9201047aa12072c7021175b400fa [file] [log] [blame]
cliechtid6bf52c2003-10-01 02:28:12 +00001#!/usr/bin/env python
cliechti7fa1a9c2009-07-21 21:11:58 +00002# needs at least python 2.2.3
cliechtid6bf52c2003-10-01 02:28:12 +00003
cliechti7fa1a9c2009-07-21 21:11:58 +00004# Python Serial Port Extension for Win32, Linux, BSD, Jython
5# see __init__.py
cliechtid6bf52c2003-10-01 02:28:12 +00006#
cliechti7fa1a9c2009-07-21 21:11:58 +00007# (C) 2001-2003 Chris Liechti <cliechti@gmx.net>
cliechtid6bf52c2003-10-01 02:28:12 +00008# this is distributed under a free software license, see license.txt
9
cliechti7fa1a9c2009-07-21 21:11:58 +000010"""\
11Some tests for the serial module.
cliechtid6bf52c2003-10-01 02:28:12 +000012Part of pyserial (http://pyserial.sf.net) (C)2002 cliechti@gmx.net
13
14Intended to be run on different platforms, to ensure portability of
15the code.
16
17These tests open a serial port and change all the settings on the fly.
cliechti7fa1a9c2009-07-21 21:11:58 +000018If the port is really correctly configured cannot be determined - that
cliechtif16c7702009-08-02 00:00:55 +000019would require external hardware or a null modem cable and an other
cliechtid6bf52c2003-10-01 02:28:12 +000020serial port library... Thus it mainly tests that all features are
21correctly implemented and that the interface does what it should.
cliechti7fa1a9c2009-07-21 21:11:58 +000022
cliechtid6bf52c2003-10-01 02:28:12 +000023"""
24
25import unittest
26import serial
27
cliechti7fa1a9c2009-07-21 21:11:58 +000028# on which port should the tests be performed:
cliechtif16c7702009-08-02 00:00:55 +000029PORT = 0
cliechtid6bf52c2003-10-01 02:28:12 +000030
31class Test_ChangeAttributes(unittest.TestCase):
32 """Test with timeouts"""
cliechti7fa1a9c2009-07-21 21:11:58 +000033
cliechtid6bf52c2003-10-01 02:28:12 +000034 def setUp(self):
cliechtif16c7702009-08-02 00:00:55 +000035 # create a closed serial port
cliechtie3ab3532009-08-05 12:40:38 +000036 self.s = serial.serial_for_url(PORT, do_not_open=True)
cliechti7fa1a9c2009-07-21 21:11:58 +000037
cliechtid6bf52c2003-10-01 02:28:12 +000038 def tearDown(self):
39 self.s.close()
40
41 def test_PortSetting(self):
42 self.s.port = PORT
cliechti7fa1a9c2009-07-21 21:11:58 +000043 # portstr has to be set
cliechti764c88c2008-06-24 11:56:48 +000044 if isinstance(PORT, str):
45 self.failUnlessEqual(self.s.portstr.lower(), PORT.lower())
46 else:
47 self.failUnlessEqual(self.s.portstr, serial.device(PORT))
cliechti7fa1a9c2009-07-21 21:11:58 +000048 # test internals
cliechtid6bf52c2003-10-01 02:28:12 +000049 self.failUnlessEqual(self.s._port, PORT)
cliechti7fa1a9c2009-07-21 21:11:58 +000050 # test on the fly change
cliechtid6bf52c2003-10-01 02:28:12 +000051 self.s.open()
52 self.failUnless(self.s.isOpen())
Chris Liechtia6f0b762015-08-03 15:48:56 +020053 #~ 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))
cliechtid6bf52c2003-10-01 02:28:12 +000069
cliechti8f69e702011-03-19 00:22:32 +000070 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
cliechtid6bf52c2003-10-01 02:28:12 +000077 def test_BaudrateSetting(self):
cliechti107db8d2004-01-15 01:20:23 +000078 self.s.port = PORT
79 self.s.open()
cliechtid6bf52c2003-10-01 02:28:12 +000080 for baudrate in (300, 9600, 19200, 115200):
81 self.s.baudrate = baudrate
cliechti7fa1a9c2009-07-21 21:11:58 +000082 # test get method
cliechtid6bf52c2003-10-01 02:28:12 +000083 self.failUnlessEqual(self.s.baudrate, baudrate)
cliechti7fa1a9c2009-07-21 21:11:58 +000084 # test internals
cliechtid6bf52c2003-10-01 02:28:12 +000085 self.failUnlessEqual(self.s._baudrate, baudrate)
cliechti7fa1a9c2009-07-21 21:11:58 +000086 # test illegal values
cliechti62611612004-04-20 01:55:43 +000087 for illegal_value in (-300, -1, 'a', None):
cliechti107db8d2004-01-15 01:20:23 +000088 self.failUnlessRaises(ValueError, self.s.setBaudrate, illegal_value)
89
cliechti7fa1a9c2009-07-21 21:11:58 +000090 # 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...
cliechti107db8d2004-01-15 01:20:23 +000094 self.s.port = PORT
95 self.s.open()
cliechtif16c7702009-08-02 00:00:55 +000096 for illegal_value in (500000, 576000, 921600, 92160):
cliechtid6bf52c2003-10-01 02:28:12 +000097 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
cliechti7fa1a9c2009-07-21 21:11:58 +0000102 # test get method
cliechtid6bf52c2003-10-01 02:28:12 +0000103 self.failUnlessEqual(self.s.bytesize, bytesize)
cliechti7fa1a9c2009-07-21 21:11:58 +0000104 # test internals
cliechtid6bf52c2003-10-01 02:28:12 +0000105 self.failUnlessEqual(self.s._bytesize, bytesize)
cliechti7fa1a9c2009-07-21 21:11:58 +0000106 # test illegal values
cliechtid6bf52c2003-10-01 02:28:12 +0000107 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
cliechti7fa1a9c2009-07-21 21:11:58 +0000113 # test get method
cliechtid6bf52c2003-10-01 02:28:12 +0000114 self.failUnlessEqual(self.s.parity, parity)
cliechti7fa1a9c2009-07-21 21:11:58 +0000115 # test internals
cliechtid6bf52c2003-10-01 02:28:12 +0000116 self.failUnlessEqual(self.s._parity, parity)
cliechti7fa1a9c2009-07-21 21:11:58 +0000117 # test illegal values
cliechtid6bf52c2003-10-01 02:28:12 +0000118 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
cliechti7fa1a9c2009-07-21 21:11:58 +0000124 # test get method
cliechtid6bf52c2003-10-01 02:28:12 +0000125 self.failUnlessEqual(self.s.stopbits, stopbits)
cliechti7fa1a9c2009-07-21 21:11:58 +0000126 # test internals
cliechtid6bf52c2003-10-01 02:28:12 +0000127 self.failUnlessEqual(self.s._stopbits, stopbits)
cliechti7fa1a9c2009-07-21 21:11:58 +0000128 # test illegal values
cliechti5fe48d42009-07-24 12:18:49 +0000129 for illegal_value in (0, 3, 2.5, 57, 'a', None):
cliechtid6bf52c2003-10-01 02:28:12 +0000130 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
cliechti7fa1a9c2009-07-21 21:11:58 +0000135 # test get method
cliechtid6bf52c2003-10-01 02:28:12 +0000136 self.failUnlessEqual(self.s.timeout, timeout)
cliechti7fa1a9c2009-07-21 21:11:58 +0000137 # test internals
cliechtid6bf52c2003-10-01 02:28:12 +0000138 self.failUnlessEqual(self.s._timeout, timeout)
cliechti7fa1a9c2009-07-21 21:11:58 +0000139 # test illegal values
cliechtid6bf52c2003-10-01 02:28:12 +0000140 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
cliechti7fa1a9c2009-07-21 21:11:58 +0000146 # test get method
cliechtid6bf52c2003-10-01 02:28:12 +0000147 self.failUnlessEqual(self.s.xonxoff, xonxoff)
cliechti7fa1a9c2009-07-21 21:11:58 +0000148 # test internals
cliechtid6bf52c2003-10-01 02:28:12 +0000149 self.failUnlessEqual(self.s._xonxoff, xonxoff)
cliechti7fa1a9c2009-07-21 21:11:58 +0000150 # no illegal values here, normal rules for the boolean value of an
151 # object are used thus all objects have a truth value.
cliechtid6bf52c2003-10-01 02:28:12 +0000152
153 def test_RtsCtsSetting(self):
154 for rtscts in (True, False):
155 self.s.rtscts = rtscts
cliechti7fa1a9c2009-07-21 21:11:58 +0000156 # test get method
cliechtid6bf52c2003-10-01 02:28:12 +0000157 self.failUnlessEqual(self.s.rtscts, rtscts)
cliechti7fa1a9c2009-07-21 21:11:58 +0000158 # test internals
cliechtid6bf52c2003-10-01 02:28:12 +0000159 self.failUnlessEqual(self.s._rtscts, rtscts)
cliechti7fa1a9c2009-07-21 21:11:58 +0000160 # no illegal values here, normal rules for the boolean value of an
161 # object are used thus all objects have a truth value.
cliechtid6bf52c2003-10-01 02:28:12 +0000162
cliechtie3ab3532009-08-05 12:40:38 +0000163 # this test does not work anymore since serial_for_url that is used
cliechtic110bf22009-08-02 23:46:29 +0000164 # now, already sets a port
165 def disabled_test_UnconfiguredPort(self):
cliechti7fa1a9c2009-07-21 21:11:58 +0000166 # an unconfigured port cannot be opened
cliechtid6bf52c2003-10-01 02:28:12 +0000167 self.failUnlessRaises(serial.SerialException, self.s.open)
cliechti7fa1a9c2009-07-21 21:11:58 +0000168
cliechtid6bf52c2003-10-01 02:28:12 +0000169 def test_PortOpenClose(self):
170 self.s.port = PORT
171 for i in range(3):
cliechti7fa1a9c2009-07-21 21:11:58 +0000172 # open the port and check flag
cliechtid6bf52c2003-10-01 02:28:12 +0000173 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
cliechtif16c7702009-08-02 00:00:55 +0000179
cliechtid6bf52c2003-10-01 02:28:12 +0000180if __name__ == '__main__':
181 import sys
cliechti8f9e5772009-02-07 00:30:53 +0000182 sys.stdout.write(__doc__)
cliechti764c88c2008-06-24 11:56:48 +0000183 if len(sys.argv) > 1:
184 PORT = sys.argv[1]
cliechti7fa1a9c2009-07-21 21:11:58 +0000185 sys.stdout.write("Testing port: %r\n" % PORT)
cliechti764c88c2008-06-24 11:56:48 +0000186 sys.argv[1:] = ['-v']
cliechtid6bf52c2003-10-01 02:28:12 +0000187 # When this module is executed from the command-line, it runs all its tests
188 unittest.main()