From 9f4bd1fc319dc50d6e2f14790b0c0ca211c34729 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Thu, 9 Nov 2023 12:27:24 +0100 Subject: [PATCH] stages(kickstart): ensure test inputs pass schema validation Now that inputs can be relatively easily validated against the schema this should also be used for all the "good" test inputs to ensure that all tests test against valid inputs. --- stages/test/test_kickstart.py | 65 +++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/stages/test/test_kickstart.py b/stages/test/test_kickstart.py index 31318d24..45d8956e 100644 --- a/stages/test/test_kickstart.py +++ b/stages/test/test_kickstart.py @@ -58,13 +58,17 @@ TEST_INPUT = [ + "user --name someusr --password $1$notreally --iscrypted --shell /bin/ksh --uid 1337 --gid 1337 --groups grp1,grp2 --homedir /other/home/someusr\n" + 'sshkey --username someusr "ssh-rsa not-really-a-real-key"', ), - ({"zerombr": "true"}, "zerombr"), + ({"zerombr": True}, "zerombr"), ({"clearpart": {"all": True}}, "clearpart --all"), ( - {"clearpart": {"drives": ["hda", "hdb"]}}, - "clearpart --drives=hda,hdb", + {"clearpart": {"drives": ["sd*|hd*|vda", "/dev/vdc"]}}, + "clearpart --drives=sd*|hd*|vda,/dev/vdc", ), ({"clearpart": {"drives": ["hda"]}}, "clearpart --drives=hda"), + ( + {"clearpart": {"drives": ["disk/by-id/scsi-58095BEC5510947BE8C0360F604351918"]}}, + "clearpart --drives=disk/by-id/scsi-58095BEC5510947BE8C0360F604351918" + ), ({"clearpart": {"list": ["sda2", "sda3"]}}, "clearpart --list=sda2,sda3"), ({"clearpart": {"list": ["sda2"]}}, "clearpart --list=sda2"), ( @@ -104,6 +108,28 @@ TEST_INPUT = [ ] +def schema_validate_kickstart_stage(test_data): + name = "org.osbuild.kickstart" + root = os.path.join(os.path.dirname(__file__), "../..") + mod_info = osbuild.meta.ModuleInfo.load(root, "Stage", name) + schema = osbuild.meta.Schema(mod_info.get_schema(), name) + test_input = { + "name": "org.osbuild.kickstart", + "options": { + "path": "some-path", + } + } + test_input["options"].update(test_data) + return schema.validate(test_input) + + +@pytest.mark.parametrize("test_input,expected", TEST_INPUT) +def test_kickstart_test_cases_valid(test_input, expected): # pylint: disable=unused-argument + """ ensure all test inputs are valid """ + res = schema_validate_kickstart_stage(test_input) + assert res.valid is True, f"input: {test_input}\nerr: {[e.as_dict() for e in res.errors]}" + + @pytest.mark.parametrize("test_input,expected", TEST_INPUT) def test_kickstart_write(tmp_path, test_input, expected): ks_stage_path = os.path.join(os.path.dirname(__file__), "../org.osbuild.kickstart") @@ -156,33 +182,12 @@ def test_kickstart_valid(tmp_path, test_input, expected): # pylint: disable=unu ({"reboot": {}}, "{} is not valid under any of the given schemas"), ({"reboot": "random-string"}, "'random-string' is not valid "), ({"reboot": {"random": "option"}}, "{'random': 'option'} is not valid "), - # GOOD pattern we want to keep working - ({"clearpart": {"drives": ["sd*|hd*|vda", "/dev/vdc"]}}, ""), - ({"clearpart": {"drives": ["disk/by-id/scsi-58095BEC5510947BE8C0360F604351918"]}}, ""), - ({"clearpart": {"list": ["sda2", "sda3", "sdb1"]}}, ""), - ({"reboot": True}, ""), - ({"reboot": {"kexec": False}}, ""), ], ) -def test_schema_validation_smoke(test_data, expected_err): - name = "org.osbuild.kickstart" - root = os.path.join(os.path.dirname(__file__), "../..") - mod_info = osbuild.meta.ModuleInfo.load(root, "Stage", name) - schema = osbuild.meta.Schema(mod_info.get_schema(), name) +def test_schema_validation_bad_apples(test_data, expected_err): + res = schema_validate_kickstart_stage(test_data) - test_input = { - "name": "org.osbuild.kickstart", - "options": { - "path": "some-path", - }, - } - test_input["options"].update(test_data) - res = 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 len(res.errors) == 1 - err_msgs = [e.as_dict()["message"] for e in res.errors] - assert expected_err in err_msgs[0] + assert res.valid is False + assert len(res.errors) == 1 + err_msgs = [e.as_dict()["message"] for e in res.errors] + assert expected_err in err_msgs[0]