Files
powertrain-build/tests/powertrain_build/test_feature_configs.py
olindgre 2ece01e1d7 Make powertrain-build not overlap with pybuild in site-packages
Change-Id: I7b59f3f04f0f787d35db0b9389f295bf1ad24f56
2024-09-17 10:25:04 +02:00

157 lines
6.1 KiB
Python

# Copyright 2024 Volvo Car Corporation
# Licensed under Apache 2.0.
"""Unit tests for FeatureConfigs."""
import re
import unittest
from unittest.mock import MagicMock, patch
from pathlib import Path
from powertrain_build.build_proj_config import BuildProjConfig
from powertrain_build.feature_configs import FeatureConfigs
from .sw_cnfg import SW_DICT
SRC_DIR = Path(__file__).parent
def overwrite_read_config(f_cfg, wanted_config):
"""Overwrite the read config function in FeatureConfigs.
Args:
f_cfg (FeatureConfigs): The FeatureConfigs object.
wanted_config (dict): The wanted config.
"""
f_cfg._set_config(wanted_config)
class TestFeatureConfigs(unittest.TestCase):
"""Test case for testing the FeatureConfigs class."""
def setUp(self):
"""Set-up common data structures for all tests in the test case."""
self.build_cfg = MagicMock(spec_set=BuildProjConfig)
prj_cnf_dir = str(Path(SRC_DIR, 'cnfg_files'))
self.build_cfg.get_prj_cfg_dir = MagicMock(return_value=prj_cnf_dir)
self.build_cfg.get_did_cfg_file_name = MagicMock(return_value='DIDIds_FullRange')
self.build_cfg.get_prj_config = MagicMock(return_value='CFG1')
patcher_read_config_sw = patch(
'tests.powertrain_build.test_feature_configs.FeatureConfigs._parse_all_code_sw_configs',
MagicMock())
self.mock_read_config_sw = patcher_read_config_sw.start()
self.addCleanup(patcher_read_config_sw.stop)
@staticmethod
def check_header_file(f_cfg):
"""Helper function for reading config definition c-header file
"""
header_file = Path(SRC_DIR, 'output', 'cnfg_def.h')
f_cfg.gen_unit_cfg_header_file(str(header_file))
res_dict = {}
with header_file.open(encoding="utf-8") as f_ptr:
for define in re.finditer(r'#define\s+(\w+)\s+([\w\.]+)', f_ptr.read()):
res_dict[define.group(1)] = float(define.group(2))
return res_dict
def test_gen_unit_cfg_header_file_cfg1(self):
"""Test that the c-header file is correctly generated for CFG1
"""
self.build_cfg.get_prj_config = MagicMock(return_value='CFG1')
f_cfg = FeatureConfigs(self.build_cfg)
overwrite_read_config(f_cfg, SW_DICT['CFG1'])
res_dict = self.check_header_file(f_cfg)
self.assertEqual(res_dict, SW_DICT['CFG1'])
def test_gen_unit_cfg_header_file_cfg2(self):
"""Test that the c-header file is correctly generated for CFG2
"""
self.build_cfg.get_prj_config = MagicMock(return_value='CFG2')
f_cfg = FeatureConfigs(self.build_cfg)
overwrite_read_config(f_cfg, SW_DICT['CFG2'])
res_dict = self.check_header_file(f_cfg)
self.assertEqual(res_dict, SW_DICT['CFG2'])
def test_check_if_active_in_config_cfg1(self):
"""Check active in cfg1
"""
self.build_cfg.get_prj_config = MagicMock(return_value='CFG1')
f_cfg = FeatureConfigs(self.build_cfg)
overwrite_read_config(f_cfg, SW_DICT['CFG1'])
config_def = [['Vc_AcReg_B_CodegenPHEV == 1']]
result = f_cfg.check_if_active_in_config(config_def)
self.assertEqual(result, False)
config_def = ['Vc_AcReg_B_CodegenPHEV']
result = f_cfg.check_if_active_in_config(config_def)
self.assertEqual(result, False)
def test_check_if_active_in_config_cfg2(self):
"""Check active in cfg1
"""
self.build_cfg.get_prj_config = MagicMock(return_value='CFG2')
f_cfg = FeatureConfigs(self.build_cfg)
overwrite_read_config(f_cfg, SW_DICT['CFG2'])
config_def = 'Vc_AcReg_B_CodegenPHEV == 1'
result = f_cfg.check_if_active_in_config(config_def)
self.assertEqual(result, True)
config_def = ['Vc_AcReg_B_CodegenPHEV']
result = f_cfg.check_if_active_in_config(config_def)
self.assertEqual(result, True)
result = f_cfg.check_if_active_in_config(['all'])
self.assertEqual(result, True)
def test_get_if_macro_string(self):
"""Test generation if macro string."""
self.build_cfg.get_prj_config = MagicMock(return_value='CFG2')
f_cfg = FeatureConfigs(self.build_cfg)
overwrite_read_config(f_cfg, SW_DICT['CFG2'])
config_def = [['CS1', 'CS2'], ['CS3']]
result = f_cfg.get_preprocessor_macro(config_def)
expected = "#if ( CS1 && CS2 ) || ( CS3 )"
self.assertEqual(result, expected)
config_def = [['all']]
result = f_cfg.get_preprocessor_macro(config_def)
expected = ""
self.assertEqual(result, expected)
config_def = ['all']
result = f_cfg.get_preprocessor_macro(config_def)
expected = ""
self.assertEqual(result, expected)
config_def = 'all'
result = f_cfg.get_preprocessor_macro(config_def)
expected = ""
self.assertEqual(result, expected)
config_def = ['CS1', 'CS2']
f_cfg.clear_log()
result = f_cfg.get_preprocessor_macro(config_def)
expected = "#if ( CS1 && CS2 )"
self.assertEqual(result, expected)
warnings_count = len(f_cfg.get_problems()['warning'])
self.assertEqual(warnings_count, 1)
def test_check_if_active_in_config_empty(self):
"""Check empty active config
"""
self.build_cfg.get_prj_config = MagicMock(return_value='CFG2')
f_cfg = FeatureConfigs(self.build_cfg)
overwrite_read_config(f_cfg, SW_DICT['CFG2'])
config_def = []
result = f_cfg.check_if_active_in_config(config_def)
self.assertEqual(result, True)
def test_check_invalid_in_config_cfg1(self):
"""Check active in cfg1
"""
self.build_cfg.get_prj_config = MagicMock(return_value='CFG1')
f_cfg = FeatureConfigs(self.build_cfg)
overwrite_read_config(f_cfg, SW_DICT['CFG1'])
config_def = [['Vc_AcReg_B_Invalid == 1']]
result = f_cfg.check_if_active_in_config(config_def)
self.assertEqual(result, False)
config_def = ['Vc_AcReg_B_Invalid']
result = f_cfg.check_if_active_in_config(config_def)
self.assertEqual(result, False)