def discover(self): self.handle_modules() if self.options.test: self.run_individual_testsuite = self.options.test num = self.add_testsuites(testsuite_filter=self.run_individual_testsuite) if num == 0: raise TwisterRuntimeError("No test cases found at the specified location...") self.find_subtests() self.add_configurations() if self.load_errors: raise TwisterRuntimeError("Errors while loading configurations") # handle quarantine ql = self.options.quarantine_list if ql: self.load_quarantine(ql) qv = self.options.quarantine_verify if qv: if not ql: logger.error("No quarantine list given to be verified") raise TwisterRuntimeError("No quarantine list given to be verified")
def load(self): if self.options.report_suffix: last_run = os.path.join( self.options.outdir, "twister_{}.json".format(self.options.report_suffix)) else: last_run = os.path.join(self.options.outdir, "twister.json") if self.options.only_failed: self.load_from_file(last_run) self.selected_platforms = set(p.platform.name for p in self.instances.values()) elif self.options.load_tests: self.load_from_file(self.options.load_tests) self.selected_platforms = set(p.platform.name for p in self.instances.values()) elif self.options.test_only: # Get list of connected hardware and filter tests to only be run on connected hardware # in cases where no platform was specified when running the tests. # If the platform does not exist in the hardware map, just skip it. connected_list = [] if not self.options.platform: for connected in self.hwm.duts: if connected['connected']: connected_list.append(connected['platform']) self.load_from_file(last_run, filter_platform=connected_list) self.selected_platforms = set(p.platform.name for p in self.instances.values()) else: self.apply_filters() if self.options.subset: s = self.options.subset try: subset, sets = (int(x) for x in s.split("/")) except ValueError: raise TwisterRuntimeError("Bad subset value.") if subset > sets: raise TwisterRuntimeError( "subset should not exceed the total number of sets") if int(subset) > 0 and int(sets) >= int(subset): logger.info("Running only a subset: %s/%s" % (subset, sets)) else: raise TwisterRuntimeError( f"You have provided a wrong subset value: {self.options.subset}." ) self.generate_subset(subset, int(sets))
def scan_testsuite_path(testsuite_path): subcases = [] has_registered_test_suites = False has_run_registered_test_suites = False has_test_main = False ztest_suite_names = [] src_dir_path = _find_src_dir_path(testsuite_path) for filename in glob.glob(os.path.join(src_dir_path, "*.c*")): try: result: ScanPathResult = scan_file(filename) if result.warnings: logger.error("%s: %s" % (filename, result.warnings)) raise TwisterRuntimeError("%s: %s" % (filename, result.warnings)) if result.matches: subcases += result.matches if result.has_registered_test_suites: has_registered_test_suites = True if result.has_run_registered_test_suites: has_run_registered_test_suites = True if result.has_test_main: has_test_main = True if result.ztest_suite_names: ztest_suite_names += result.ztest_suite_names except ValueError as e: logger.error("%s: can't find: %s" % (filename, e)) for filename in glob.glob(os.path.join(testsuite_path, "*.c")): try: result: ScanPathResult = scan_file(filename) if result.warnings: logger.error("%s: %s" % (filename, result.warnings)) if result.matches: subcases += result.matches if result.ztest_suite_names: ztest_suite_names += result.ztest_suite_names except ValueError as e: logger.error("%s: can't find: %s" % (filename, e)) if (has_registered_test_suites and has_test_main and not has_run_registered_test_suites): warning = \ "Found call to 'ztest_register_test_suite()' but no "\ "call to 'ztest_run_registered_test_suites()'" logger.error(warning) raise TwisterRuntimeError(warning) return subcases, ztest_suite_names
def __init__(self, filename, extra_sections): """Constructor @param filename Path to the output binary The <filename> is parsed by objdump to determine section sizes """ # Make sure this is an ELF binary with open(filename, "rb") as f: magic = f.read(4) try: if magic != b'\x7fELF': raise TwisterRuntimeError("%s is not an ELF binary" % filename) except Exception as e: print(str(e)) sys.exit(2) # Search for CONFIG_XIP in the ELF's list of symbols using NM and AWK. # GREP can not be used as it returns an error if the symbol is not # found. is_xip_command = "nm " + filename + \ " | awk '/CONFIG_XIP/ { print $3 }'" is_xip_output = subprocess.check_output( is_xip_command, shell=True, stderr=subprocess.STDOUT).decode("utf-8").strip() try: if is_xip_output.endswith("no symbols"): raise TwisterRuntimeError("%s has no symbol information" % filename) except Exception as e: print(str(e)) sys.exit(2) self.is_xip = (len(is_xip_output) != 0) self.filename = filename self.sections = [] self.rom_size = 0 self.ram_size = 0 self.extra_sections = extra_sections self._calculate_sizes()
def get_toolchain(self): toolchain_script = Path(ZEPHYR_BASE) / Path('cmake/modules/verify-toolchain.cmake') result = self.run_cmake_script([toolchain_script, "FORMAT=json"]) try: if result['returncode']: raise TwisterRuntimeError(f"E: {result['returnmsg']}") except Exception as e: print(str(e)) sys.exit(2) self.toolchain = json.loads(result['stdout'])['ZEPHYR_TOOLCHAIN_VARIANT'] logger.info(f"Using '{self.toolchain}' toolchain.")
def report_platform_tests(self, platforms=[]): if len(platforms) > 1: raise TwisterRuntimeError("When exporting tests, only one platform " "should be specified.") for p in platforms: inst = self.get_platform_instances(p) count = 0 for i in inst.values(): for c in i.testsuite.cases: print(f"- {c}") count += 1 print(f"Tests found: {count}")
def find_subtests(self): sub_tests = self.options.sub_test if sub_tests: for subtest in sub_tests: _subtests = self.get_testcase(subtest) for _subtest in _subtests: self.run_individual_testsuite.append(_subtest.name) if self.run_individual_testsuite: logger.info("Running the following tests:") for test in self.run_individual_testsuite: print(" - {}".format(test)) else: raise TwisterRuntimeError("Tests not found")