def run_tests(args, iut_config, tty): """Run test cases :param args: AutoPTS arguments :param iut_config: IUT configuration :param tty path :return: tuple of (status, results) dictionaries """ results = {} status = {} descriptions = {} total_regressions = [] _args = {} config_default = "prj.conf" _args[config_default] = PtsInitArgs(args) for config, value in list(iut_config.items()): if 'test_cases' not in value: # Rename default config _args[config] = _args.pop(config_default) config_default = config continue if config != config_default: _args[config] = PtsInitArgs(args) _args[config].test_cases = value.get('test_cases', []) if 'overlay' in value: _args[config_default].excluded += _args[config].test_cases while True: try: ptses = autoptsclient.init_pts(_args[config_default], "zephyr_" + str(args["board"])) btp.init(get_iut) # Main instance of PTS pts = ptses[0] # Read PTS Version and keep it for later use args['pts_ver'] = "%s" % pts.get_version() except Exception as exc: if _args[config_default].recovery: ptses = exc.args[1] for pts in ptses: autoptsclient.recover_autoptsserver(pts) time.sleep(20) continue else: raise exc break stack.init_stack() stack_inst = stack.get_stack() stack_inst.synch_init([pts.callback_thread for pts in ptses]) for config, value in list(iut_config.items()): if 'overlay' in value: apply_overlay(args["project_path"], config_default, config, value['overlay']) build_and_flash(args["project_path"], autopts2board[args["board"]], tty, config) logging.debug("TTY path: %s" % tty) flush_serial(tty) time.sleep(10) autoprojects.iutctl.init(args["kernel_image"], tty, args["board"]) # Setup project PIXITS autoprojects.gap.set_pixits(ptses[0]) autoprojects.gatt.set_pixits(ptses) autoprojects.sm.set_pixits(ptses[0]) autoprojects.l2cap.set_pixits(ptses[0]) autoprojects.mesh.set_pixits(ptses) test_cases = get_test_cases(ptses) status_count, results_dict, regressions = autoptsclient.run_test_cases( ptses, test_cases, _args[config]) total_regressions += regressions for k, v in list(status_count.items()): if k in list(status.keys()): status[k] += v else: status[k] = v results.update(results_dict) autoprojects.iutctl.cleanup() for test_case_name in list(results.keys()): project_name = test_case_name.split('/')[0] descriptions[test_case_name] = \ pts.get_test_case_description(project_name, test_case_name) for pts in ptses: pts.unregister_xmlrpc_ptscallback() return status, results, descriptions, total_regressions
# not the cleanest but the easiest way to exit the server thread os._exit(0) if __name__ == "__main__": while True: try: main() break # os._exit: not the cleanest but the easiest way to exit the server thread except KeyboardInterrupt: # Ctrl-C os._exit(14) # SystemExit is thrown in arg_parser.parse_args and in sys.exit except SystemExit: raise # let the default handlers do the work except Exception as exc: traceback.print_exc() try: ptses = exc.args[1] for pts in ptses: autoptsclient.recover_autoptsserver(pts) time.sleep(20) except: traceback.print_exc() except: os._exit(16)