From d076962f73d34958afec98ac2a0ba5932b3ed111 Mon Sep 17 00:00:00 2001 From: Maciej Dubiel Date: Tue, 12 Dec 2023 10:13:57 +0100 Subject: [PATCH] twister: ut for config_parser.py initial commit Signed-off-by: Maciej Dubiel --- scripts/tests/twister/test_config_parser.py | 195 ++++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 scripts/tests/twister/test_config_parser.py diff --git a/scripts/tests/twister/test_config_parser.py b/scripts/tests/twister/test_config_parser.py new file mode 100644 index 0000000000..7518958837 --- /dev/null +++ b/scripts/tests/twister/test_config_parser.py @@ -0,0 +1,195 @@ +#!/usr/bin/env python3 +# Copyright (c) 2024 Intel Corporation +# +# SPDX-License-Identifier: Apache-2.0 +""" +Tests for config_parser.py +""" + +import os +import pytest +import mock +import scl + +from twisterlib.config_parser import TwisterConfigParser, extract_fields_from_arg_list, ConfigurationError +from contextlib import nullcontext + +def test_extract_single_field_from_string_argument(): + target_fields = {"FIELD1"} + arg_list = "FIELD1=value1 FIELD2=value2 FIELD3=value3" + extracted_fields, other_fields = extract_fields_from_arg_list( + target_fields, arg_list) + + assert extracted_fields == {"FIELD1": ["value1"]} + assert other_fields == "FIELD2=value2 FIELD3=value3" + + +def test_no_fields_to_extract(): + target_fields = set() + arg_list = "arg1 arg2 arg3" + + extracted_fields, other_fields = extract_fields_from_arg_list( + target_fields, arg_list) + + assert extracted_fields == {} + assert other_fields == "arg1 arg2 arg3" + + +def test_missing_fields(): + target_fields = {"CONF_FILE", "OVERLAY_CONFIG", "DTC_OVERLAY_FILE"} + arg_list = "arg1 arg2 arg3" + extracted_fields, other_fields = extract_fields_from_arg_list( + target_fields, arg_list) + + assert extracted_fields == {"CONF_FILE": [], "OVERLAY_CONFIG": [], "DTC_OVERLAY_FILE": []} + assert other_fields == "arg1 arg2 arg3" + +def test_load_yaml_with_extra_args_and_retrieve_scenario_data(zephyr_base): + filename = "test_data.yaml" + + yaml_data = ''' + tests: + scenario1: + tags: ['tag1', 'tag2'] + extra_args: '--CONF_FILE=file1.conf --OVERLAY_CONFIG=config1.conf' + filter: 'filter1' + common: + filter: 'filter2' + ''' + + loaded_schema = scl.yaml_load( + os.path.join(zephyr_base, 'scripts', 'schemas','twister', 'testsuite-schema.yaml') + ) + + with mock.patch('builtins.open', mock.mock_open(read_data=yaml_data)): + parser = TwisterConfigParser(filename, loaded_schema) + parser.load() + + scenario_data = parser.get_scenario('scenario1') + scenario_common = parser.common + + assert scenario_data['tags'] == {'tag1', 'tag2'} + assert scenario_data['extra_args'] == ['--CONF_FILE=file1.conf', '--OVERLAY_CONFIG=config1.conf'] + assert scenario_common == {'filter': 'filter2'} + + +def test_default_values(zephyr_base): + filename = "test_data.yaml" + + yaml_data = ''' + tests: + scenario1: + tags: 'tag1' + extra_args: '' + ''' + + loaded_schema = scl.yaml_load( + os.path.join(zephyr_base, 'scripts', 'schemas', 'twister','testsuite-schema.yaml') + ) + + with mock.patch('builtins.open', mock.mock_open(read_data=yaml_data)): + parser = TwisterConfigParser(filename, loaded_schema) + parser.load() + + expected_scenario_data = { 'type': 'integration', + 'extra_args': [], + 'extra_configs': [], + 'extra_conf_files': [], + 'extra_overlay_confs': [], + 'extra_dtc_overlay_files': [], + 'required_snippets': [], + 'build_only': False, + 'build_on_all': False, + 'skip': False, 'slow': False, + 'timeout': 60, + 'min_ram': 8, + 'modules': [], + 'depends_on': set(), + 'min_flash': 32, + 'arch_allow': set(), + 'arch_exclude': set(), + 'extra_sections': [], + 'integration_platforms': [], + 'ignore_faults': False, + 'ignore_qemu_crash': False, + 'testcases': [], + 'platform_type': [], + 'platform_exclude': set(), + 'platform_allow': set(), + 'platform_key': [], + 'toolchain_exclude': set(), + 'toolchain_allow': set(), + 'filter': '', + 'levels': [], + 'harness': 'test', + 'harness_config': {}, + 'seed': 0, 'sysbuild': False + } + + assert expected_scenario_data.items() <= expected_scenario_data.items() + +@pytest.mark.parametrize( + 'value, typestr, expected', + [ + (' hello ', 'str', 'hello'), + ('3.14', 'float', 3.14), + ('10', 'int', 10), + ('True', 'bool', 'True'), # do-nothing cast + ('key: val', 'map', 'key: val'), # do-nothing cast + ('test', 'int', ValueError), + ('test', 'unknown', ConfigurationError), + ('1 2 2 3', 'list', ['1', '2', '2','3']), + ('1 2 2 3', 'set', {'1', '2', '3'}) + ], + ids=['str to str', 'str to float', 'str to int', 'str to bool', 'str to map', + 'invalid', 'to unknown', "to list", "to set"] +) + +def test_cast_value(zephyr_base, value, typestr, expected): + loaded_schema = scl.yaml_load( + os.path.join(zephyr_base, 'scripts', 'schemas', 'twister','testsuite-schema.yaml') + ) + + parser = TwisterConfigParser("config.yaml", loaded_schema) + with pytest.raises(expected) if \ + isinstance(expected, type) and issubclass(expected, Exception) else nullcontext(): + result = parser._cast_value(value, typestr) + assert result == expected + +def test_load_invalid_test_config_yaml(zephyr_base): + filename = "test_data.yaml" + + yaml_data = ''' + gibberish data + ''' + + loaded_schema = scl.yaml_load( + os.path.join(zephyr_base, 'scripts', 'schemas','twister', 'test-config-schema.yaml') + ) + + with mock.patch('builtins.open', mock.mock_open(read_data=yaml_data)): + parser = TwisterConfigParser(filename, loaded_schema) + with pytest.raises(Exception): + parser.load() + + +def test_load_yaml_with_no_scenario_data(zephyr_base): + filename = "test_data.yaml" + + yaml_data = ''' + tests: + common: + extra_args: '--CONF_FILE=file2.conf --OVERLAY_CONFIG=config2.conf' + ''' + + loaded_schema = scl.yaml_load( + os.path.join(zephyr_base, 'scripts', 'schemas','twister', 'testsuite-schema.yaml') + ) + + with mock.patch('builtins.open', mock.mock_open(read_data=yaml_data)): + parser = TwisterConfigParser(filename, loaded_schema) + parser.load() + + with pytest.raises(KeyError): + scenario_data = parser.get_scenario('scenario1') + assert scenario_data is None