1
1
"""
2
2
mbed SDK
3
- Copyright (c) 2018-2018 ARM Limited
3
+ Copyright (c) 2018-2019 ARM Limited
4
4
SPDX-License-Identifier: Apache-2.0
5
5
6
6
Licensed under the Apache License, Version 2.0 (the "License");
26
26
import array
27
27
import random
28
28
import os
29
+ import traceback
29
30
30
31
import usb .core
31
32
from usb .util import build_request_type
@@ -122,6 +123,35 @@ def get_interface(dev, interface, alternate=0):
122
123
usb .ENDPOINT_TYPE_INTERRUPT : 'INTERRUPT' ,
123
124
usb .ENDPOINT_TYPE_ISOCHRONOUS : 'ISOCHRONOUS' }
124
125
126
+ def format_local_error_msg (fmt ):
127
+ """Return an error message formatted with the last traceback entry from this file.
128
+
129
+ The message is formatted according to fmt with data from the last traceback
130
+ enrty internal to this file. There are 4 arguments supplied to the format
131
+ function: filename, line_number, exc_type and exc_value.
132
+
133
+ Returns None if formatting fails.
134
+ """
135
+ try :
136
+ exc_type , exc_value , exc_traceback = sys .exc_info ()
137
+ # A list of 4-tuples (filename, line_number, function_name, text).
138
+ tb_entries = traceback .extract_tb (exc_traceback )
139
+ # Reuse the filename from the first tuple instead of relying on __file__:
140
+ # 1. No need for path handling.
141
+ # 2. No need for file extension handling (i.e. .py vs .pyc).
142
+ name_of_this_file = tb_entries [0 ][0 ]
143
+ last_internal_tb_entry = [tb for tb in tb_entries if tb [0 ] == name_of_this_file ][- 1 ]
144
+ msg = fmt .format (
145
+ filename = last_internal_tb_entry [0 ],
146
+ line_number = last_internal_tb_entry [1 ],
147
+ exc_type = str (exc_type ).strip (),
148
+ exc_value = str (exc_value ).strip (),
149
+ )
150
+ except (IndexError , KeyError ):
151
+ msg = None
152
+ return msg
153
+
154
+
125
155
class PyusbBasicTest (BaseHostTest ):
126
156
127
157
def _callback_control_basic_test (self , key , value , timestamp ):
@@ -137,8 +167,11 @@ def _callback_control_basic_test(self, key, value, timestamp):
137
167
try :
138
168
control_basic_test (dev , int (vendor_id ), int (product_id ), log = print )
139
169
self .report_success ()
140
- except ( RuntimeError ) as exc :
170
+ except RuntimeError as exc :
141
171
self .report_error (exc )
172
+ except usb .core .USBError as exc :
173
+ error_msg = format_local_error_msg ('[{filename}]:{line_number}, Dev-host transfer error ({exc_value}).' )
174
+ self .report_error (error_msg if error_msg is not None else exc )
142
175
143
176
144
177
def _callback_control_stall_test (self , key , value , timestamp ):
@@ -151,8 +184,11 @@ def _callback_control_stall_test(self, key, value, timestamp):
151
184
try :
152
185
control_stall_test (dev , log = print )
153
186
self .report_success ()
154
- except ( RuntimeError ) as exc :
187
+ except RuntimeError as exc :
155
188
self .report_error (exc )
189
+ except usb .core .USBError as exc :
190
+ error_msg = format_local_error_msg ('[{filename}]:{line_number}, Dev-host transfer error ({exc_value}).' )
191
+ self .report_error (error_msg if error_msg is not None else exc )
156
192
157
193
158
194
def _callback_control_sizes_test (self , key , value , timestamp ):
@@ -165,8 +201,11 @@ def _callback_control_sizes_test(self, key, value, timestamp):
165
201
try :
166
202
control_sizes_test (dev , log = print )
167
203
self .report_success ()
168
- except ( RuntimeError ) as exc :
204
+ except RuntimeError as exc :
169
205
self .report_error (exc )
206
+ except usb .core .USBError as exc :
207
+ error_msg = format_local_error_msg ('[{filename}]:{line_number}, Dev-host transfer error ({exc_value}).' )
208
+ self .report_error (error_msg if error_msg is not None else exc )
170
209
171
210
172
211
def _callback_control_stress_test (self , key , value , timestamp ):
@@ -179,8 +218,11 @@ def _callback_control_stress_test(self, key, value, timestamp):
179
218
try :
180
219
control_stress_test (dev , log = print )
181
220
self .report_success ()
182
- except ( RuntimeError ) as exc :
221
+ except RuntimeError as exc :
183
222
self .report_error (exc )
223
+ except usb .core .USBError as exc :
224
+ error_msg = format_local_error_msg ('[{filename}]:{line_number}, Dev-host transfer error ({exc_value}).' )
225
+ self .report_error (error_msg if error_msg is not None else exc )
184
226
185
227
def _callback_device_reset_test (self , key , value , timestamp ):
186
228
self .log ("Received serial %s" % (value ))
@@ -192,8 +234,11 @@ def _callback_device_reset_test(self, key, value, timestamp):
192
234
try :
193
235
self .device_reset_test .send (dev )
194
236
self .report_success ()
195
- except ( RuntimeError ) as exc :
237
+ except RuntimeError as exc :
196
238
self .report_error (exc )
239
+ except usb .core .USBError as exc :
240
+ error_msg = format_local_error_msg ('[{filename}]:{line_number}, Dev-host transfer error ({exc_value}).' )
241
+ self .report_error (error_msg if error_msg is not None else exc )
197
242
198
243
def _callback_device_soft_reconnection_test (self , key , value , timestamp ):
199
244
self .log ("Received serial %s" % (value ))
@@ -205,8 +250,11 @@ def _callback_device_soft_reconnection_test(self, key, value, timestamp):
205
250
try :
206
251
self .device_soft_reconnection_test .send (dev )
207
252
self .report_success ()
208
- except ( RuntimeError ) as exc :
253
+ except RuntimeError as exc :
209
254
self .report_error (exc )
255
+ except usb .core .USBError as exc :
256
+ error_msg = format_local_error_msg ('[{filename}]:{line_number}, Dev-host transfer error ({exc_value}).' )
257
+ self .report_error (error_msg if error_msg is not None else exc )
210
258
211
259
212
260
def _callback_device_suspend_resume_test (self , key , value , timestamp ):
@@ -219,8 +267,11 @@ def _callback_device_suspend_resume_test(self, key, value, timestamp):
219
267
try :
220
268
self .device_suspend_resume_test .send (dev )
221
269
self .report_success ()
222
- except ( RuntimeError ) as exc :
270
+ except RuntimeError as exc :
223
271
self .report_error (exc )
272
+ except usb .core .USBError as exc :
273
+ error_msg = format_local_error_msg ('[{filename}]:{line_number}, Dev-host transfer error ({exc_value}).' )
274
+ self .report_error (error_msg if error_msg is not None else exc )
224
275
225
276
226
277
def _callback_repeated_construction_destruction_test (self , key , value , timestamp ):
@@ -233,8 +284,11 @@ def _callback_repeated_construction_destruction_test(self, key, value, timestamp
233
284
try :
234
285
self .repeated_construction_destruction_test .send (dev )
235
286
self .report_success ()
236
- except ( RuntimeError ) as exc :
287
+ except RuntimeError as exc :
237
288
self .report_error (exc )
289
+ except usb .core .USBError as exc :
290
+ error_msg = format_local_error_msg ('[{filename}]:{line_number}, Dev-host transfer error ({exc_value}).' )
291
+ self .report_error (error_msg if error_msg is not None else exc )
238
292
239
293
def _callback_ep_test_data_correctness (self , key , value , timestamp ):
240
294
self .log ("Received serial %s" % (value ))
@@ -246,8 +300,11 @@ def _callback_ep_test_data_correctness(self, key, value, timestamp):
246
300
try :
247
301
ep_test_data_correctness (dev , log = print )
248
302
self .report_success ()
249
- except ( RuntimeError ) as exc :
303
+ except RuntimeError as exc :
250
304
self .report_error (exc )
305
+ except usb .core .USBError as exc :
306
+ error_msg = format_local_error_msg ('[{filename}]:{line_number}, Dev-host transfer error ({exc_value}).' )
307
+ self .report_error (error_msg if error_msg is not None else exc )
251
308
252
309
def _callback_ep_test_halt (self , key , value , timestamp ):
253
310
self .log ("Received serial %s" % (value ))
@@ -259,8 +316,11 @@ def _callback_ep_test_halt(self, key, value, timestamp):
259
316
try :
260
317
ep_test_halt (dev , log = print )
261
318
self .report_success ()
262
- except ( RuntimeError ) as exc :
319
+ except RuntimeError as exc :
263
320
self .report_error (exc )
321
+ except usb .core .USBError as exc :
322
+ error_msg = format_local_error_msg ('[{filename}]:{line_number}, Dev-host transfer error ({exc_value}).' )
323
+ self .report_error (error_msg if error_msg is not None else exc )
264
324
265
325
def _callback_ep_test_parallel_transfers (self , key , value , timestamp ):
266
326
self .log ("Received serial %s" % (value ))
@@ -272,8 +332,11 @@ def _callback_ep_test_parallel_transfers(self, key, value, timestamp):
272
332
try :
273
333
ep_test_parallel_transfers (dev , log = print )
274
334
self .report_success ()
275
- except ( RuntimeError ) as exc :
335
+ except RuntimeError as exc :
276
336
self .report_error (exc )
337
+ except usb .core .USBError as exc :
338
+ error_msg = format_local_error_msg ('[{filename}]:{line_number}, Dev-host transfer error ({exc_value}).' )
339
+ self .report_error (error_msg if error_msg is not None else exc )
277
340
278
341
def _callback_ep_test_parallel_transfers_ctrl (self , key , value , timestamp ):
279
342
self .log ("Received serial %s" % (value ))
@@ -285,8 +348,11 @@ def _callback_ep_test_parallel_transfers_ctrl(self, key, value, timestamp):
285
348
try :
286
349
ep_test_parallel_transfers_ctrl (dev , log = print )
287
350
self .report_success ()
288
- except ( RuntimeError ) as exc :
351
+ except RuntimeError as exc :
289
352
self .report_error (exc )
353
+ except usb .core .USBError as exc :
354
+ error_msg = format_local_error_msg ('[{filename}]:{line_number}, Dev-host transfer error ({exc_value}).' )
355
+ self .report_error (error_msg if error_msg is not None else exc )
290
356
291
357
def _callback_ep_test_abort (self , key , value , timestamp ):
292
358
self .log ("Received serial %s" % (value ))
@@ -298,8 +364,11 @@ def _callback_ep_test_abort(self, key, value, timestamp):
298
364
try :
299
365
ep_test_abort (dev , log = print )
300
366
self .report_success ()
301
- except ( RuntimeError ) as exc :
367
+ except RuntimeError as exc :
302
368
self .report_error (exc )
369
+ except usb .core .USBError as exc :
370
+ error_msg = format_local_error_msg ('[{filename}]:{line_number}, Dev-host transfer error ({exc_value}).' )
371
+ self .report_error (error_msg if error_msg is not None else exc )
303
372
304
373
def _callback_ep_test_data_toggle (self , key , value , timestamp ):
305
374
self .log ("Received serial %s" % (value ))
@@ -311,8 +380,11 @@ def _callback_ep_test_data_toggle(self, key, value, timestamp):
311
380
try :
312
381
ep_test_data_toggle (dev , log = print )
313
382
self .report_success ()
314
- except ( RuntimeError ) as exc :
383
+ except RuntimeError as exc :
315
384
self .report_error (exc )
385
+ except usb .core .USBError as exc :
386
+ error_msg = format_local_error_msg ('[{filename}]:{line_number}, Dev-host transfer error ({exc_value}).' )
387
+ self .report_error (error_msg if error_msg is not None else exc )
316
388
317
389
def _callback_reset_support (self , key , value , timestamp ):
318
390
status = "false" if sys .platform == "darwin" else "true"
0 commit comments