Skip to content

Commit 049f90d

Browse files
committed
esp32_tests: Adds support for logging output from board's UART
1 parent 537722f commit 049f90d

File tree

1 file changed

+54
-4
lines changed

1 file changed

+54
-4
lines changed

testing/esp/run_tests.py

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import argparse
77
import unittest
88
import tempfile
9+
import serial
10+
import threading
911
import cProfile, pstats
1012
import debug_backend, debug_backend_tests
1113

@@ -27,7 +29,48 @@
2729
}
2830
}
2931

32+
class SerialPortReader(threading.Thread):
33+
def __init__(self, port_name):
34+
threading.Thread.__init__(self, name='serial_reader')
35+
# connect to serial port
36+
self.ser = serial.serial_for_url(port_name, do_not_open=True)
37+
self.ser.baudrate = 115200
38+
# self.ser.parity = serial.PARITY_NONE
39+
self.ser.dtr = False
40+
self.ser.rts = False
41+
# self.ser.rtscts = False
42+
# self.ser.xonxoff = False
43+
self.ser.timeout = 0
44+
self.ser.open()
45+
self.do_work = True
46+
self._logger = logging.getLogger('BOARD_UART')
47+
48+
def get_logger(self):
49+
return self._logger
50+
51+
def stop(self):
52+
self.do_work = False
53+
self._logger.debug('Wait for reader thread to finish...')
54+
self.join()
55+
self.ser.close()
56+
57+
def run(self):
58+
self._logger.debug('Start reading from "{}"'.format(self.ser.name))
59+
line = ''
60+
while self.do_work:
61+
line += self.ser.read(1)
62+
if line.endswith('\n'):
63+
self._logger.info(line.rstrip('\r\n'))
64+
line = ''
65+
3066
def main():
67+
board_uart_reader = None
68+
if args.serial_port:
69+
try:
70+
board_uart_reader = SerialPortReader(args.serial_port)
71+
except serial.SerialException as e:
72+
sys.stderr.write('Could not start reader for serial port {}: {}\n'.format(args.serial_port, e))
73+
sys.exit(1)
3174
log_formatter = logging.Formatter('%(asctime)-15s %(name)s: %(levelname)s - %(message)s')
3275
ch = logging.StreamHandler()
3376
ch.setFormatter(log_formatter)
@@ -58,6 +101,9 @@ def setup_logger(logger, conh, fileh):
58101
setup_logger(debug_backend.Oocd.get_logger(), ch, fh)
59102
setup_logger(debug_backend.Gdb.get_logger(), ch, fh)
60103
setup_logger(debug_backend_tests.get_logger(), ch, fh)
104+
if board_uart_reader:
105+
setup_logger(board_uart_reader.get_logger(), ch, fh)
106+
board_uart_reader.start()
61107
board_tcl = BOARD_TCL_CONFIG[args.board_type]
62108
# start debugger, ideally we should run all tests w/o restarting it
63109
debug_backend.start(args.toolchain, args.oocd, args.oocd_tcl, board_tcl['files'], board_tcl['commands'])
@@ -114,7 +160,7 @@ def load_tests_by_pattern(search_dir, pattern):
114160
for m in suite.modules:
115161
setup_logger(suite.modules[m].get_logger(), ch, fh)
116162
suite.load_app_bins = not args.no_load
117-
try:
163+
try:
118164
res = unittest.TextTestRunner(verbosity=2).run(suite)
119165
if not res.wasSuccessful() and args.retry:
120166
print '==========================================='
@@ -132,6 +178,8 @@ def load_tests_by_pattern(search_dir, pattern):
132178
finally:
133179
# stop debugger
134180
debug_backend.stop()
181+
if board_uart_reader:
182+
board_uart_reader.stop()
135183
# check results
136184
if not res.wasSuccessful():
137185
sys.exit(-1)
@@ -160,19 +208,21 @@ def load_tests_by_pattern(search_dir, pattern):
160208
User can specify several strings separated by space. Wildcards (*) are supported in <module> and <test_case> parts""",
161209
default='*')
162210
parser.add_argument('--no-load', '-n',
163-
help='Do not load test app binaries',
211+
help='Do not load test app binaries',
164212
action='store_true', default=False)
165213
parser.add_argument('--retry', '-r',
166-
help='Try to re0run failed tests',
214+
help='Try to re0run failed tests',
167215
action='store_true', default=False)
168216
parser.add_argument('--stats-file', '-k',
169217
help='Path to log file to store profiler stats. Use "stdout" to print.',
170218
default='')
171219
parser.add_argument('--debug', '-d',
172-
help='Debug level (0-4)',
220+
help='Debug level (0-4)',
173221
type=int, default=2)
174222
parser.add_argument('--log-file', '-l',
175223
help='Path to log file. Use "stdout" to log to console.')
224+
parser.add_argument('--serial-port', '-u',
225+
help='Name of serial port to grab ESP32 UART output.')
176226
args = parser.parse_args()
177227
if len(args.stats_file) > 0:
178228
if args.stats_file == 'stdout':

0 commit comments

Comments
 (0)