From 48a5ce1b914f3a56c77b599316a1c50f675b3212 Mon Sep 17 00:00:00 2001 From: Guillaume Galeazzi Date: Wed, 28 Jun 2017 16:21:46 +0200 Subject: serial: SerialBase with is idempotent --- serial/serialutil.py | 2 ++ test/test_context.py | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100755 test/test_context.py diff --git a/serial/serialutil.py b/serial/serialutil.py index e4df90f..7d51752 100644 --- a/serial/serialutil.py +++ b/serial/serialutil.py @@ -557,6 +557,8 @@ class SerialBase(io.RawIOBase): # context manager def __enter__(self): + if not self.is_open: + self.open() return self def __exit__(self, *args, **kwargs): diff --git a/test/test_context.py b/test/test_context.py new file mode 100755 index 0000000..456c85a --- /dev/null +++ b/test/test_context.py @@ -0,0 +1,49 @@ +#! /usr/bin/env python +# +# This file is part of pySerial - Cross platform serial port support for Python +# (C) 2017 Guillaume Galeazzi +# +# SPDX-License-Identifier: BSD-3-Clause +"""\ +Some tests for the serial module. +Part of pySerial (http://pyserial.sf.net) (C)2001-2011 cliechti@gmx.net + +Intended to be run on different platforms, to ensure portability of +the code. + +Cover some of the aspects of context managment +""" + +import unittest +import serial + +# on which port should the tests be performed: +PORT = 'loop://' + + +class Test_Context(unittest.TestCase): + """Test context""" + + def setUp(self): + # create a closed serial port + self.s = serial.serial_for_url(PORT) + + def tearDown(self): + self.s.close() + + def test_with_idempotent(self): + with self.s as stream: + stream.write(b'1234') + + # do other stuff like calling an exe which use COM4 + + with self.s as stream: + stream.write(b'5678') + + +if __name__ == '__main__': + import sys + sys.stdout.write(__doc__) + sys.argv[1:] = ['-v'] + # When this module is executed from the command-line, it runs all its tests + unittest.main() -- cgit v1.2.1