This makes all remaining Python scripts in doc compliant w.r.t current Ruff rules Signed-off-by: Benjamin Cabé <benjamin@zephyrproject.org>
93 lines
3.2 KiB
Python
93 lines
3.2 KiB
Python
#!/usr/bin/env python3
|
|
# Copyright (c) 2024 Intel Corporation
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
import importlib
|
|
import json
|
|
import os
|
|
import sys
|
|
from unittest import mock
|
|
|
|
import pytest
|
|
from conftest import TEST_DATA, ZEPHYR_BASE, testsuite_filename_mock
|
|
from twisterlib.testplan import TestPlan
|
|
|
|
|
|
class TestDummy:
|
|
TESTDATA_X = [
|
|
("smoke", 5),
|
|
("acceptance", 6),
|
|
]
|
|
|
|
@classmethod
|
|
def setup_class(cls):
|
|
apath = os.path.join(ZEPHYR_BASE, "scripts", "twister")
|
|
cls.loader = importlib.machinery.SourceFileLoader("__main__", apath)
|
|
cls.spec = importlib.util.spec_from_loader(cls.loader.name, cls.loader)
|
|
cls.twister_module = importlib.util.module_from_spec(cls.spec)
|
|
|
|
@classmethod
|
|
def teardown_class(cls):
|
|
pass
|
|
|
|
@pytest.mark.parametrize(
|
|
"level, expected_tests", TESTDATA_X, ids=["smoke", "acceptance"]
|
|
)
|
|
@mock.patch.object(TestPlan, "TESTSUITE_FILENAME", testsuite_filename_mock)
|
|
def test_level(self, capfd, out_path, level, expected_tests):
|
|
# Select platforms used for the tests
|
|
test_platforms = ["qemu_x86", "frdm_k64f"]
|
|
# Select test root
|
|
path = os.path.join(TEST_DATA, "tests")
|
|
config_path = os.path.join(TEST_DATA, "test_config.yaml")
|
|
|
|
# Set flags for our Twister command as a list of strs
|
|
args = (
|
|
# Flags related to the generic test setup:
|
|
# * Control the level of detail in stdout/err
|
|
# * Establish the output directory
|
|
# * Select Zephyr tests to use
|
|
# * Control whether to only build or build and run aforementioned tests
|
|
["-i", "--outdir", out_path, "-T", path, "-y"]
|
|
# Flags under test
|
|
+ ["--level", level]
|
|
# Flags required for the test
|
|
+ ["--test-config", config_path]
|
|
# Flags related to platform selection
|
|
+ [
|
|
val
|
|
for pair in zip(["-p"] * len(test_platforms), test_platforms, strict=False)
|
|
for val in pair
|
|
]
|
|
)
|
|
|
|
# First, provide the args variable as our Twister command line arguments.
|
|
# Then, catch the exit code in the sys_exit variable.
|
|
with mock.patch.object(sys, "argv", [sys.argv[0]] + args), pytest.raises(
|
|
SystemExit
|
|
) as sys_exit:
|
|
# Execute the Twister call itself.
|
|
self.loader.exec_module(self.twister_module)
|
|
|
|
# Check whether the Twister call succeeded
|
|
assert str(sys_exit.value) == "0"
|
|
|
|
# Access to the test file output
|
|
with open(os.path.join(out_path, "testplan.json")) as f:
|
|
j = json.load(f)
|
|
filtered_j = [
|
|
(ts["platform"], ts["name"], tc["identifier"])
|
|
for ts in j["testsuites"]
|
|
for tc in ts["testcases"]
|
|
if "reason" not in tc
|
|
]
|
|
|
|
# Read stdout and stderr to out and err variables respectively
|
|
out, err = capfd.readouterr()
|
|
# Rewrite the captured buffers to stdout and stderr so the user can still read them
|
|
sys.stdout.write(out)
|
|
sys.stderr.write(err)
|
|
|
|
# Test-relevant checks
|
|
assert expected_tests == len(filtered_j)
|