From d7d41b477bd0bebcc4495a32f4f9a02e49354269 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Fri, 20 Dec 2024 12:52:46 +0100 Subject: [PATCH] Stages/tuned: add unit tests for the stage. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix #1941 Signed-off-by: Tomáš Hozza --- stages/test/test_tuned.py | 151 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 stages/test/test_tuned.py diff --git a/stages/test/test_tuned.py b/stages/test/test_tuned.py new file mode 100644 index 00000000..eebeb060 --- /dev/null +++ b/stages/test/test_tuned.py @@ -0,0 +1,151 @@ +#!/usr/bin/python3 + +import pytest + +from osbuild.testutil import ( + assert_jsonschema_error_contains, + make_fake_tree, +) + +STAGE_NAME = "org.osbuild.tuned" + + +@pytest.mark.parametrize("test_data,expected_err", [ + # bad + ({"profiles": {}}, "{} is not of type 'array'"), + ({"profiles": ""}, "'' is not of type 'array'"), + ({"profiles": []}, "[] is too short"), + ({"profiles": [0]}, "0 is not of type 'string'"), + ({"profiles": [""]}, "'' is too short"), + ({}, "'profiles' is a required property"), + # good + ({"profiles": ["balanced"]}, ""), + ({"profiles": ["balanced", "sap-hana"]}, ""), +]) +def test_schema_validation(stage_schema, test_data, expected_err): + test_input = { + "type": STAGE_NAME, + "options": {}, + } + test_input["options"].update(test_data) + res = stage_schema.validate(test_input) + + if expected_err == "": + assert res.valid is True, f"err: {[e.as_dict() for e in res.errors]}" + else: + assert res.valid is False + assert_jsonschema_error_contains(res, expected_err, expected_num_errs=1) + + +@pytest.mark.parametrize("fake_tree,available_profiles", ( + ({}, []), + # simple case with just installed profiles + ( + { + "/usr/lib/tuned/balanced/tuned.conf": "", + "/usr/lib/tuned/sap/tuned.conf": "" + }, + ["balanced", "sap"] + ), + # simple case with installed and custom profiles + ( + { + "/usr/lib/tuned/balanced/tuned.conf": "", + "/usr/lib/tuned/sap/tuned.conf": "", + "/etc/tuned/custom/tuned.conf": "" + }, + ["balanced", "sap", "custom"] + ), + # Tuned 2.23.0+ with profiles under profiles/ directory + # in which case we ignore profiles not under profiles/ + ( + { + "/usr/lib/tuned/profiles/balanced/tuned.conf": "", + "/usr/lib/tuned/sap/tuned.conf": "" + }, + ["balanced"] + ), + ( + { + "/usr/lib/tuned/profiles/balanced/tuned.conf": "", + "/etc/tuned/sap/tuned.conf": "" + }, + ["balanced", "sap"] + ), + ( + { + "/usr/lib/tuned/profiles/balanced/tuned.conf": "", + "/etc/tuned/profiles/sap/tuned.conf": "" + }, + ["balanced", "sap"] + ), + ( + { + "/etc/tuned/profiles/balanced/tuned.conf": "", + "/etc/tuned/sap/tuned.conf": "" + }, + ["balanced"] + ), + ( + { + "/usr/lib/tuned/profiles/profile1/tuned.conf": "", + "/usr/lib/tuned/profiles/profile2/tuned.conf": "", + "/usr/lib/tuned/profile3/tuned.conf": "", + "/etc/tuned/profiles/profile11/tuned.conf": "", + "/etc/tuned/profiles/profile12/tuned.conf": "", + "/etc/tuned/profile13/tuned.conf": "", + }, + ["profile1", "profile2", "profile11", "profile12"] + ), +)) +def test_tunedprofilesdb__load_available_profiles(tmp_path, stage_module, fake_tree, available_profiles): + make_fake_tree(tmp_path, fake_tree) + # pylint: disable=protected-access + assert sorted(stage_module.TunedProfilesDB._load_available_profiles(tmp_path)) == sorted(available_profiles) + + +def test_tuned_happy(tmp_path, stage_module): + make_fake_tree(tmp_path, { + "/usr/lib/tuned/balanced/tuned.conf": "", + "/usr/lib/tuned/sap/tuned.conf": "", + "/etc/tuned/custom/tuned.conf": "", + }) + + options = { + "profiles": ["balanced", "sap", "custom"] + } + + assert stage_module.main(tmp_path.as_posix(), options) == 0 + + active_profile_file = tmp_path / "etc/tuned/active_profile" + assert active_profile_file.is_file() + assert active_profile_file.read_text() == "balanced sap custom\n" + + profile_mode_file = tmp_path / "etc/tuned/profile_mode" + assert profile_mode_file.is_file() + assert profile_mode_file.read_text() == "manual\n" + + +def test_tuned_unhappy(tmp_path, stage_module): + make_fake_tree(tmp_path, { + "/usr/lib/tuned/balanced/tuned.conf": "", + "/usr/lib/tuned/sap/tuned.conf": "", + "/etc/tuned/custom/tuned.conf": "", + }) + + options = { + "profiles": ["balanced", "non-existing"] + } + + try: + stage_module.main(tmp_path.as_posix(), options) + except ValueError as e: + assert "non-existing" in str(e) + else: + assert False, "Exception not raised" + + active_profile_file = tmp_path / "etc/tuned/active_profile" + assert not active_profile_file.exists() + + profile_mode_file = tmp_path / "etc/tuned/profile_mode" + assert not profile_mode_file.exists()