mirror of
https://github.com/espressif/esp-idf.git
synced 2025-07-31 03:07:21 +02:00
Merge branch 'feature/panic_test_multi_target_support' into 'master'
CI: Add multi-target support for panic test See merge request espressif/esp-idf!11451
This commit is contained in:
@ -315,7 +315,6 @@ example_test_016:
|
||||
|
||||
test_app_test_001:
|
||||
extends: .test_app_template
|
||||
parallel: 4
|
||||
tags:
|
||||
- ESP32
|
||||
- test_jtag_arm
|
||||
@ -324,7 +323,6 @@ test_app_test_001:
|
||||
- $CI_PROJECT_DIR/tools/test_apps/system/*/*.log
|
||||
variables:
|
||||
SETUP_TOOLS: "1"
|
||||
PYTHON_VER: 3
|
||||
|
||||
test_app_test_002:
|
||||
extends: .test_app_template
|
||||
@ -344,6 +342,15 @@ test_app_test_004:
|
||||
- ESP32S2
|
||||
- Example_GENERIC
|
||||
|
||||
test_app_test_esp32_generic:
|
||||
extends: .test_app_template
|
||||
parallel: 4
|
||||
tags:
|
||||
- ESP32
|
||||
- Example_GENERIC
|
||||
variables:
|
||||
SETUP_TOOLS: "1"
|
||||
|
||||
component_ut_test_001:
|
||||
extends: .component_ut_32_template
|
||||
tags:
|
||||
|
@ -49,7 +49,7 @@ class Search(object):
|
||||
test_functions_out += cls.replicate_case(case)
|
||||
|
||||
for i, test_function in enumerate(test_functions_out):
|
||||
print("\t{}. ".format(i + 1) + test_function.case_info["name"])
|
||||
print("\t{}. {} <{}>".format(i + 1, test_function.case_info["name"], test_function.case_info["target"]))
|
||||
test_function.case_info['app_dir'] = os.path.dirname(file_name)
|
||||
return test_functions_out
|
||||
|
||||
|
@ -4,6 +4,7 @@ import json
|
||||
import logging
|
||||
import os
|
||||
from collections import defaultdict
|
||||
from copy import deepcopy
|
||||
|
||||
from find_apps import find_apps
|
||||
from find_build_apps import BUILD_SYSTEMS, BUILD_SYSTEM_CMAKE
|
||||
@ -124,7 +125,7 @@ def main():
|
||||
scan_info_dict = defaultdict(dict)
|
||||
# store the test cases dir, exclude these folders when scan for standalone apps
|
||||
default_exclude = args.exclude if args.exclude else []
|
||||
exclude_apps = default_exclude
|
||||
exclude_apps = deepcopy(default_exclude)
|
||||
|
||||
build_system = args.build_system.lower()
|
||||
build_system_class = BUILD_SYSTEMS[build_system]
|
||||
|
@ -16,6 +16,7 @@ import json
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
from copy import deepcopy
|
||||
|
||||
import junit_xml
|
||||
|
||||
@ -73,11 +74,11 @@ def local_test_check(decorator_target):
|
||||
try:
|
||||
idf_target = sdkconfig['IDF_TARGET'].upper()
|
||||
except KeyError:
|
||||
logging.warning('IDF_TARGET not in {}. IDF_TARGET set to esp32'.format(os.path.abspath(expected_json_path)))
|
||||
logging.debug('IDF_TARGET not in {}. IDF_TARGET set to esp32'.format(os.path.abspath(expected_json_path)))
|
||||
else:
|
||||
logging.info('IDF_TARGET: {}'.format(idf_target))
|
||||
logging.debug('IDF_TARGET: {}'.format(idf_target))
|
||||
else:
|
||||
logging.warning('{} not found. IDF_TARGET set to esp32'.format(os.path.abspath(expected_json_path)))
|
||||
logging.debug('{} not found. IDF_TARGET set to esp32'.format(os.path.abspath(expected_json_path)))
|
||||
|
||||
if isinstance(decorator_target, list):
|
||||
if idf_target not in decorator_target:
|
||||
@ -88,11 +89,11 @@ def local_test_check(decorator_target):
|
||||
return idf_target
|
||||
|
||||
|
||||
def get_dut_class(target, erase_nvs=None):
|
||||
if target not in TARGET_DUT_CLS_DICT:
|
||||
raise Exception('target can only be {%s} (case insensitive)' % ', '.join(TARGET_DUT_CLS_DICT.keys()))
|
||||
def get_dut_class(target, dut_class_dict, erase_nvs=None):
|
||||
if target not in dut_class_dict:
|
||||
raise Exception('target can only be {%s} (case insensitive)' % ', '.join(dut_class_dict.keys()))
|
||||
|
||||
dut = TARGET_DUT_CLS_DICT[target.upper()]
|
||||
dut = dut_class_dict[target.upper()]
|
||||
if erase_nvs:
|
||||
dut.ERASE_NVS = 'erase_nvs'
|
||||
return dut
|
||||
@ -111,16 +112,19 @@ def ci_target_check(func):
|
||||
return wrapper
|
||||
|
||||
|
||||
def test_func_generator(func, app, target, ci_target, module, execution_time, level, erase_nvs, drop_kwargs_dut=False, **kwargs):
|
||||
def test_func_generator(func, app, target, ci_target, module, execution_time, level, erase_nvs, **kwargs):
|
||||
target = upper_list_or_str(target)
|
||||
test_target = local_test_check(target)
|
||||
dut = get_dut_class(test_target, erase_nvs)
|
||||
if drop_kwargs_dut and 'dut' in kwargs: # panic_test() will inject dut, resolve conflicts here
|
||||
dut = kwargs['dut']
|
||||
del kwargs['dut']
|
||||
if 'additional_duts' in kwargs:
|
||||
dut_classes = deepcopy(TARGET_DUT_CLS_DICT)
|
||||
dut_classes.update(kwargs['additional_duts'])
|
||||
else:
|
||||
dut_classes = TARGET_DUT_CLS_DICT
|
||||
dut = get_dut_class(test_target, dut_classes, erase_nvs)
|
||||
original_method = TinyFW.test_method(
|
||||
app=app, dut=dut, target=upper_list_or_str(target), ci_target=upper_list_or_str(ci_target),
|
||||
app=app, dut=dut, target=target, ci_target=upper_list_or_str(ci_target),
|
||||
module=module, execution_time=execution_time, level=level, erase_nvs=erase_nvs,
|
||||
dut_dict=TARGET_DUT_CLS_DICT, **kwargs
|
||||
dut_dict=dut_classes, **kwargs
|
||||
)
|
||||
test_func = original_method(func)
|
||||
test_func.case_info["ID"] = format_case_id(target, test_func.case_info["name"])
|
||||
@ -188,7 +192,7 @@ def idf_custom_test(app=TestApp, target="ESP32", ci_target=None, module="misc",
|
||||
:return: test method
|
||||
"""
|
||||
def test(func):
|
||||
return test_func_generator(func, app, target, ci_target, module, execution_time, level, erase_nvs, drop_kwargs_dut=True, **kwargs)
|
||||
return test_func_generator(func, app, target, ci_target, module, execution_time, level, erase_nvs, **kwargs)
|
||||
return test
|
||||
|
||||
|
||||
|
@ -6,7 +6,7 @@ from test_panic_util.test_panic_util import panic_test, run_all
|
||||
|
||||
# test_task_wdt
|
||||
|
||||
@panic_test()
|
||||
@panic_test(target=['ESP32', 'ESP32S2'])
|
||||
def test_panic_task_wdt(env, _extra_data):
|
||||
test.task_wdt_inner(env, "panic")
|
||||
|
||||
@ -134,7 +134,7 @@ def test_gdbstub_cache_error(env, _extra_data):
|
||||
|
||||
# test_stack_overflow
|
||||
|
||||
@panic_test()
|
||||
@panic_test(target=['ESP32', 'ESP32S2'])
|
||||
def test_panic_stack_overflow(env, _extra_data):
|
||||
test.stack_overflow_inner(env, "panic")
|
||||
|
||||
@ -166,7 +166,7 @@ def test_gdbstub_stack_overflow(env, _extra_data):
|
||||
|
||||
# test_instr_fetch_prohibited
|
||||
|
||||
@panic_test()
|
||||
@panic_test(target=['ESP32', 'ESP32S2'])
|
||||
def test_panic_instr_fetch_prohibited(env, _extra_data):
|
||||
test.instr_fetch_prohibited_inner(env, "panic")
|
||||
|
||||
@ -198,7 +198,7 @@ def test_gdbstub_instr_fetch_prohibited(env, _extra_data):
|
||||
|
||||
# test_illegal_instruction
|
||||
|
||||
@panic_test()
|
||||
@panic_test(target=['ESP32', 'ESP32S2'])
|
||||
def test_panic_illegal_instruction(env, _extra_data):
|
||||
test.illegal_instruction_inner(env, "panic")
|
||||
|
||||
@ -230,7 +230,7 @@ def test_gdbstub_illegal_instruction(env, _extra_data):
|
||||
|
||||
# test_storeprohibited
|
||||
|
||||
@panic_test()
|
||||
@panic_test(target=['ESP32', 'ESP32S2'])
|
||||
def test_panic_storeprohibited(env, _extra_data):
|
||||
test.storeprohibited_inner(env, "panic")
|
||||
|
||||
@ -262,7 +262,7 @@ def test_gdbstub_storeprohibited(env, _extra_data):
|
||||
|
||||
# test_abort
|
||||
|
||||
@panic_test()
|
||||
@panic_test(target=['ESP32', 'ESP32S2'])
|
||||
def test_panic_abort(env, _extra_data):
|
||||
test.abort_inner(env, "panic")
|
||||
|
||||
|
@ -234,9 +234,25 @@ class ESP32PanicTestDUT(ttfw_idf.ESP32DUT, PanicTestMixin):
|
||||
return self.port
|
||||
|
||||
|
||||
class ESP32S2PanicTestDUT(ttfw_idf.ESP32S2DUT, PanicTestMixin):
|
||||
def get_gdb_remote(self):
|
||||
return self.port
|
||||
|
||||
|
||||
PANIC_TEST_DUT_DICT = {
|
||||
'ESP32': ESP32PanicTestDUT,
|
||||
'ESP32S2': ESP32S2PanicTestDUT
|
||||
}
|
||||
|
||||
|
||||
def panic_test(**kwargs):
|
||||
""" Decorator for the panic tests, sets correct App and DUT classes """
|
||||
return ttfw_idf.idf_custom_test(app=PanicTestApp, dut=ESP32PanicTestDUT, env_tag="test_jtag_arm", **kwargs)
|
||||
if 'target' not in kwargs:
|
||||
kwargs['target'] = ['ESP32']
|
||||
|
||||
if 'additional_duts' not in kwargs:
|
||||
kwargs['additional_duts'] = PANIC_TEST_DUT_DICT
|
||||
return ttfw_idf.idf_custom_test(app=PanicTestApp, env_tag="Example_GENERIC", **kwargs)
|
||||
|
||||
|
||||
def get_dut(env, app_config_name, test_name, qemu_wdt_enable=False):
|
||||
|
@ -6,7 +6,7 @@ import ttfw_idf
|
||||
from tiny_test_fw import Utility
|
||||
|
||||
|
||||
@ttfw_idf.idf_custom_test(env_tag="test_jtag_arm", group="test-apps")
|
||||
@ttfw_idf.idf_custom_test(env_tag="Example_GENERIC", group="test-apps")
|
||||
def test_startup(env, extra_data):
|
||||
config_files = glob.glob(os.path.join(os.path.dirname(__file__), "sdkconfig.ci.*"))
|
||||
config_names = [os.path.basename(s).replace("sdkconfig.ci.", "") for s in config_files]
|
||||
|
Reference in New Issue
Block a user