blob: 7540da0439405f88f38d01d24e0505fb9cb65bee [file] [log] [blame]
#!/usr/bin/env python3
# Copyright (c) 2023 Google LLC
#
# SPDX-License-Identifier: Apache-2.0
"""
Tests for runner.py classes
"""
import mock
import os
import pytest
import sys
import yaml
from typing import List
ZEPHYR_BASE = os.getenv("ZEPHYR_BASE")
sys.path.insert(0, os.path.join(ZEPHYR_BASE, "scripts/pylib/twister"))
from twisterlib.runner import ProjectBuilder
@pytest.fixture
def mocked_instance(tmp_path):
instance = mock.Mock()
testsuite = mock.Mock()
testsuite.source_dir: str = ''
instance.testsuite = testsuite
platform = mock.Mock()
platform.binaries: List[str] = []
instance.platform = platform
build_dir = tmp_path / 'build_dir'
os.makedirs(build_dir)
instance.build_dir: str = str(build_dir)
return instance
@pytest.fixture
def mocked_env():
env = mock.Mock()
options = mock.Mock()
env.options = options
return env
@pytest.fixture
def mocked_jobserver():
jobserver = mock.Mock()
return jobserver
@pytest.fixture
def project_builder(mocked_instance, mocked_env, mocked_jobserver) -> ProjectBuilder:
project_builder = ProjectBuilder(mocked_instance, mocked_env, mocked_jobserver)
return project_builder
@pytest.fixture
def runners(project_builder: ProjectBuilder) -> dict:
"""
Create runners.yaml file in build_dir/zephyr directory and return file
content as dict.
"""
build_dir_zephyr_path = os.path.join(project_builder.instance.build_dir, 'zephyr')
os.makedirs(build_dir_zephyr_path)
runners_file_path = os.path.join(build_dir_zephyr_path, 'runners.yaml')
runners_content: dict = {
'config': {
'elf_file': 'zephyr.elf',
'hex_file': os.path.join(build_dir_zephyr_path, 'zephyr.elf'),
'bin_file': 'zephyr.bin',
}
}
with open(runners_file_path, 'w') as file:
yaml.dump(runners_content, file)
return runners_content
@mock.patch("os.path.exists")
def test_projectbuilder_cmake_assemble_args(m):
# Causes the additional_overlay_path to be appended
m.return_value = True
class MockHandler:
pass
handler = MockHandler()
handler.args = ["handler_arg1", "handler_arg2"]
handler.ready = True
assert(ProjectBuilder.cmake_assemble_args(
["basearg1"],
handler,
["a.conf;b.conf", "c.conf"],
["extra_overlay.conf"],
["x.overlay;y.overlay", "z.overlay"],
["cmake1=foo", "cmake2=bar"],
"/builddir/",
) == [
"-Dcmake1=foo", "-Dcmake2=bar",
"-Dbasearg1",
"-Dhandler_arg1", "-Dhandler_arg2",
"-DCONF_FILE=a.conf;b.conf;c.conf",
"-DDTC_OVERLAY_FILE=x.overlay;y.overlay;z.overlay",
"-DOVERLAY_CONFIG=extra_overlay.conf "
"/builddir/twister/testsuite_extra.conf",
])
def test_if_default_binaries_are_taken_properly(project_builder: ProjectBuilder):
default_binaries = [
os.path.join('zephyr', 'zephyr.hex'),
os.path.join('zephyr', 'zephyr.bin'),
os.path.join('zephyr', 'zephyr.elf'),
os.path.join('zephyr', 'zephyr.exe'),
]
binaries = project_builder._get_binaries()
assert sorted(binaries) == sorted(default_binaries)
def test_if_binaries_from_platform_are_taken_properly(project_builder: ProjectBuilder):
platform_binaries = ['spi_image.bin']
project_builder.platform.binaries = platform_binaries
platform_binaries_expected = [os.path.join('zephyr', bin) for bin in platform_binaries]
binaries = project_builder._get_binaries()
assert sorted(binaries) == sorted(platform_binaries_expected)
def test_if_binaries_from_runners_are_taken_properly(runners, project_builder: ProjectBuilder):
runners_binaries = list(runners['config'].values())
runners_binaries_expected = [bin if os.path.isabs(bin) else os.path.join('zephyr', bin) for bin in runners_binaries]
binaries = project_builder._get_binaries_from_runners()
assert sorted(binaries) == sorted(runners_binaries_expected)
def test_if_runners_file_is_sanitized_properly(runners, project_builder: ProjectBuilder):
runners_file_path = os.path.join(project_builder.instance.build_dir, 'zephyr', 'runners.yaml')
with open(runners_file_path, 'r') as file:
unsanitized_runners_content = yaml.safe_load(file)
unsanitized_runners_binaries = list(unsanitized_runners_content['config'].values())
abs_paths = [bin for bin in unsanitized_runners_binaries if os.path.isabs(bin)]
assert len(abs_paths) > 0
project_builder._sanitize_runners_file()
with open(runners_file_path, 'r') as file:
sanitized_runners_content = yaml.safe_load(file)
sanitized_runners_binaries = list(sanitized_runners_content['config'].values())
abs_paths = [bin for bin in sanitized_runners_binaries if os.path.isabs(bin)]
assert len(abs_paths) == 0
def test_if_zephyr_base_is_sanitized_properly(project_builder: ProjectBuilder):
sanitized_path_expected = os.path.join('sanitized', 'path')
path_to_sanitize = os.path.join(os.path.realpath(ZEPHYR_BASE), sanitized_path_expected)
cmakecache_file_path = os.path.join(project_builder.instance.build_dir, 'CMakeCache.txt')
with open(cmakecache_file_path, 'w') as file:
file.write(path_to_sanitize)
project_builder._sanitize_zephyr_base_from_files()
with open(cmakecache_file_path, 'r') as file:
sanitized_path = file.read()
assert sanitized_path == sanitized_path_expected