36
36
import platform
37
37
from multiprocessing import Pool
38
38
39
- ENUM_TIMEOUT = 30
39
+ ENUM_TIMEOUT = 20
40
40
41
41
42
42
# get usb serial by id
@@ -110,7 +110,8 @@ def run_cmd(cmd):
110
110
#print(cmd)
111
111
r = subprocess .run (cmd , shell = True , stdout = subprocess .PIPE , stderr = subprocess .STDOUT )
112
112
if r .returncode != 0 :
113
- title = 'command error'
113
+ title = f'COMMAND FAILED: { cmd } '
114
+ print ()
114
115
if os .getenv ('CI' ):
115
116
print (f"::group::{ title } " )
116
117
print (r .stdout .decode ("utf-8" ))
@@ -198,14 +199,15 @@ def flash_esptool(board, firmware):
198
199
# -------------------------------------------------------------
199
200
# Tests
200
201
# -------------------------------------------------------------
201
- def test_board_test (id ):
202
+ def test_board_test (board ):
202
203
# Dummy test
203
204
pass
204
205
205
206
206
- def test_cdc_dual_ports (id ):
207
- port1 = get_serial_dev (id , 'TinyUSB' , "TinyUSB_Device" , 0 )
208
- port2 = get_serial_dev (id , 'TinyUSB' , "TinyUSB_Device" , 2 )
207
+ def test_cdc_dual_ports (board ):
208
+ uid = board ['uid' ]
209
+ port1 = get_serial_dev (uid , 'TinyUSB' , "TinyUSB_Device" , 0 )
210
+ port2 = get_serial_dev (uid , 'TinyUSB' , "TinyUSB_Device" , 2 )
209
211
210
212
ser1 = open_serial_dev (port1 )
211
213
ser2 = open_serial_dev (port2 )
@@ -224,9 +226,10 @@ def test_cdc_dual_ports(id):
224
226
assert ser2 .read (100 ) == str2 .upper (), 'Port2 wrong data'
225
227
226
228
227
- def test_cdc_msc (id ):
229
+ def test_cdc_msc (board ):
230
+ uid = board ['uid' ]
228
231
# Echo test
229
- port = get_serial_dev (id , 'TinyUSB' , "TinyUSB_Device" , 0 )
232
+ port = get_serial_dev (uid , 'TinyUSB' , "TinyUSB_Device" , 0 )
230
233
ser = open_serial_dev (port )
231
234
232
235
str = b"test_str"
@@ -235,7 +238,7 @@ def test_cdc_msc(id):
235
238
assert ser .read (100 ) == str , 'CDC wrong data'
236
239
237
240
# Block test
238
- data = read_disk_file (id , 'README.TXT' )
241
+ data = read_disk_file (uid , 'README.TXT' )
239
242
readme = \
240
243
b"This is tinyusb's MassStorage Class demo.\r \n \r \n \
241
244
If you find any bugs or get any questions, feel free to file an\r \n \
@@ -244,26 +247,28 @@ def test_cdc_msc(id):
244
247
assert data == readme , 'MSC wrong data'
245
248
246
249
247
- def test_cdc_msc_freertos (id ):
248
- test_cdc_msc (id )
250
+ def test_cdc_msc_freertos (board ):
251
+ test_cdc_msc (board )
249
252
250
253
251
- def test_dfu (id ):
254
+ def test_dfu (board ):
255
+ uid = board ['uid' ]
256
+
252
257
# Wait device enum
253
258
timeout = ENUM_TIMEOUT
254
259
while timeout :
255
260
ret = subprocess .run (f'dfu-util -l' ,
256
261
shell = True , stdout = subprocess .PIPE , stderr = subprocess .STDOUT )
257
262
stdout = ret .stdout .decode ()
258
- if f'serial="{ id } "' in stdout and 'Found DFU: [cafe:4000]' in stdout :
263
+ if f'serial="{ uid } "' in stdout and 'Found DFU: [cafe:4000]' in stdout :
259
264
break
260
265
time .sleep (1 )
261
266
timeout = timeout - 1
262
267
263
268
assert timeout , 'Device not available'
264
269
265
- f_dfu0 = f'dfu0_{ id } '
266
- f_dfu1 = f'dfu1_{ id } '
270
+ f_dfu0 = f'dfu0_{ uid } '
271
+ f_dfu1 = f'dfu1_{ uid } '
267
272
268
273
# Test upload
269
274
try :
@@ -272,10 +277,10 @@ def test_dfu(id):
272
277
except OSError :
273
278
pass
274
279
275
- ret = run_cmd (f'dfu-util -S { id } -a 0 -U { f_dfu0 } ' )
280
+ ret = run_cmd (f'dfu-util -S { uid } -a 0 -U { f_dfu0 } ' )
276
281
assert ret .returncode == 0 , 'Upload failed'
277
282
278
- ret = run_cmd (f'dfu-util -S { id } -a 1 -U { f_dfu1 } ' )
283
+ ret = run_cmd (f'dfu-util -S { uid } -a 1 -U { f_dfu1 } ' )
279
284
assert ret .returncode == 0 , 'Upload failed'
280
285
281
286
with open (f_dfu0 ) as f :
@@ -288,25 +293,28 @@ def test_dfu(id):
288
293
os .remove (f_dfu1 )
289
294
290
295
291
- def test_dfu_runtime (id ):
296
+ def test_dfu_runtime (board ):
297
+ uid = board ['uid' ]
298
+
292
299
# Wait device enum
293
300
timeout = ENUM_TIMEOUT
294
301
while timeout :
295
302
ret = subprocess .run (f'dfu-util -l' ,
296
303
shell = True , stdout = subprocess .PIPE , stderr = subprocess .STDOUT )
297
304
stdout = ret .stdout .decode ()
298
- if f'serial="{ id } "' in stdout and 'Found Runtime: [cafe:4000]' in stdout :
305
+ if f'serial="{ uid } "' in stdout and 'Found Runtime: [cafe:4000]' in stdout :
299
306
break
300
307
time .sleep (1 )
301
308
timeout = timeout - 1
302
309
303
310
assert timeout , 'Device not available'
304
311
305
312
306
- def test_hid_boot_interface (id ):
307
- kbd = get_hid_dev (id , 'TinyUSB' , 'TinyUSB_Device' , 'event-kbd' )
308
- mouse1 = get_hid_dev (id , 'TinyUSB' , 'TinyUSB_Device' , 'if01-event-mouse' )
309
- mouse2 = get_hid_dev (id , 'TinyUSB' , 'TinyUSB_Device' , 'if01-mouse' )
313
+ def test_hid_boot_interface (board ):
314
+ uid = board ['uid' ]
315
+ kbd = get_hid_dev (uid , 'TinyUSB' , 'TinyUSB_Device' , 'event-kbd' )
316
+ mouse1 = get_hid_dev (uid , 'TinyUSB' , 'TinyUSB_Device' , 'if01-event-mouse' )
317
+ mouse2 = get_hid_dev (uid , 'TinyUSB' , 'TinyUSB_Device' , 'if01-mouse' )
310
318
# Wait device enum
311
319
timeout = ENUM_TIMEOUT
312
320
while timeout :
@@ -338,22 +346,23 @@ def test_hid_composite_freertos(id):
338
346
]
339
347
340
348
341
- def test_board (item ):
342
- name = item ['name' ]
343
- flasher = item ['flasher' ].lower ()
349
+ def test_board (board ):
350
+ name = board ['name' ]
351
+ flasher = board ['flasher' ].lower ()
344
352
345
353
# default to all tests
346
- if 'tests' in item :
347
- test_list = item ['tests' ] + ['board_test' ]
354
+ if 'tests' in board :
355
+ test_list = board ['tests' ] + ['board_test' ]
348
356
else :
349
357
test_list = list (all_tests )
350
358
351
359
# remove skip_tests
352
- if 'tests_skip' in item :
353
- for skip in item ['tests_skip' ]:
360
+ if 'tests_skip' in board :
361
+ for skip in board ['tests_skip' ]:
354
362
if skip in test_list :
355
363
test_list .remove (skip )
356
364
365
+ err_count = 0
357
366
for test in test_list :
358
367
fw_dir = f'cmake-build/cmake-build-{ name } /device/{ test } '
359
368
if not os .path .exists (fw_dir ):
@@ -367,19 +376,26 @@ def test_board(item):
367
376
368
377
# flash firmware. It may fail randomly, retry a few times
369
378
for i in range (3 ):
370
- ret = globals ()[f'flash_{ flasher } ' ](item , fw_name )
379
+ ret = globals ()[f'flash_{ flasher } ' ](board , fw_name )
371
380
if ret .returncode == 0 :
372
381
break
373
382
else :
374
383
print (f'Flashing failed, retry { i + 1 } ' )
375
384
time .sleep (1 )
376
385
377
- assert ret .returncode == 0 , 'Flash failed\n ' + ret .stdout .decode ()
378
-
379
- # run test
380
- globals ()[f'test_{ test } ' ](item ['uid' ])
381
- print ('OK' )
386
+ if ret .returncode == 0 :
387
+ try :
388
+ ret = globals ()[f'test_{ test } ' ](board )
389
+ print ('OK' )
390
+ except AssertionError as e :
391
+ err_count += 1
392
+ print ('Failed' )
393
+ print (f' { e } ' )
394
+ else :
395
+ err_count += 1
396
+ print ('Flash failed' )
382
397
398
+ return err_count
383
399
384
400
def main ():
385
401
"""
@@ -404,8 +420,11 @@ def main():
404
420
else :
405
421
config_boards = [e for e in config ['boards' ] if e ['name' ] in boards ]
406
422
423
+ err_count_list = 0
407
424
with Pool (processes = os .cpu_count ()) as pool :
408
- pool .map (test_board , config_boards )
425
+ err_count_list = pool .map (test_board , config_boards )
426
+
427
+ sys .exit (sum (err_count_list ))
409
428
410
429
411
430
if __name__ == '__main__' :
0 commit comments