From 85ebb084b5ad16d3c6b03f604e5a5a4e1832f1b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Budai?= Date: Wed, 2 Oct 2019 15:17:08 +0200 Subject: [PATCH] tests: introduce stage testing The stage testing is based on an output from the tree-diff tool. During one test two pipelines are run and their outputs are compared using tree-diff. The diff is then compared with expected diff included in the repository. --- .travis.yml | 8 ++- test/osbuildtest.py | 84 ++++++++++++++++++++++++++++ test/stages_tests/firewall/a.json | 43 ++++++++++++++ test/stages_tests/firewall/b.json | 61 ++++++++++++++++++++ test/stages_tests/firewall/diff.json | 8 +++ test/stages_tests/fstab/a.json | 43 ++++++++++++++ test/stages_tests/fstab/b.json | 58 +++++++++++++++++++ test/stages_tests/fstab/diff.json | 7 +++ test/stages_tests/hostname/a.json | 43 ++++++++++++++ test/stages_tests/hostname/b.json | 51 +++++++++++++++++ test/stages_tests/hostname/diff.json | 7 +++ test/stages_tests/keymap/a.json | 43 ++++++++++++++ test/stages_tests/keymap/b.json | 51 +++++++++++++++++ test/stages_tests/keymap/diff.json | 7 +++ test/stages_tests/locale/a.json | 43 ++++++++++++++ test/stages_tests/locale/b.json | 51 +++++++++++++++++ test/stages_tests/locale/diff.json | 7 +++ test/stages_tests/systemd/a.json | 43 ++++++++++++++ test/stages_tests/systemd/b.json | 52 +++++++++++++++++ test/stages_tests/systemd/diff.json | 9 +++ test/stages_tests/timezone/a.json | 43 ++++++++++++++ test/stages_tests/timezone/b.json | 51 +++++++++++++++++ test/stages_tests/timezone/diff.json | 12 ++++ test/stages_tests/users/a.json | 43 ++++++++++++++ test/stages_tests/users/b.json | 55 ++++++++++++++++++ test/stages_tests/users/diff.json | 80 ++++++++++++++++++++++++++ test/test_boot.py | 2 +- test/test_stages.py | 36 ++++++++++++ 28 files changed, 1038 insertions(+), 3 deletions(-) create mode 100644 test/stages_tests/firewall/a.json create mode 100644 test/stages_tests/firewall/b.json create mode 100644 test/stages_tests/firewall/diff.json create mode 100644 test/stages_tests/fstab/a.json create mode 100644 test/stages_tests/fstab/b.json create mode 100644 test/stages_tests/fstab/diff.json create mode 100644 test/stages_tests/hostname/a.json create mode 100644 test/stages_tests/hostname/b.json create mode 100644 test/stages_tests/hostname/diff.json create mode 100644 test/stages_tests/keymap/a.json create mode 100644 test/stages_tests/keymap/b.json create mode 100644 test/stages_tests/keymap/diff.json create mode 100644 test/stages_tests/locale/a.json create mode 100644 test/stages_tests/locale/b.json create mode 100644 test/stages_tests/locale/diff.json create mode 100644 test/stages_tests/systemd/a.json create mode 100644 test/stages_tests/systemd/b.json create mode 100644 test/stages_tests/systemd/diff.json create mode 100644 test/stages_tests/timezone/a.json create mode 100644 test/stages_tests/timezone/b.json create mode 100644 test/stages_tests/timezone/diff.json create mode 100644 test/stages_tests/users/a.json create mode 100644 test/stages_tests/users/b.json create mode 100644 test/stages_tests/users/diff.json create mode 100644 test/test_stages.py diff --git a/.travis.yml b/.travis.yml index c10313bb..1300c85d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,10 +31,14 @@ jobs: script: sudo env "PATH=$PATH" python3 -m test --case timezone --build-pipeline samples/build-from-yum.json - name: firewall before_install: sudo apt-get install -y systemd-container yum tar - script: sudo env "PATH=$PATH" python3 -m test --case firewall --build-pipeline samples/build-from-yum.json + script: sudo env "PATH=$PATH" python3 -m test --case firewall --build-pipeline samples/build-from-yum.json - name: locale before_install: sudo apt-get install -y systemd-container yum tar - script: sudo env "PATH=$PATH" python3 -m test --case locale --build-pipeline samples/build-from-yum.json + script: sudo env "PATH=$PATH" python3 -m test --case locale --build-pipeline samples/build-from-yum.json - name: assemblers before_install: sudo apt-get install -y systemd-container yum tar script: sudo env "PATH=$PATH" "OSBUILD_TEST_BUILD_PIPELINE=samples/build-from-yum.json" python3 -m unittest test.test_assemblers + - name: stage-tests + before_install: sudo apt-get install -y systemd-container yum + script: sudo env "PATH=$PATH" "OSBUILD_TEST_BUILD_PIPELINE=samples/build-from-yum.json" python3 -m unittest test.test_stages + diff --git a/test/osbuildtest.py b/test/osbuildtest.py index 5863b72d..8a149ea9 100644 --- a/test/osbuildtest.py +++ b/test/osbuildtest.py @@ -1,5 +1,8 @@ +import difflib + import json import os +import pprint import shutil import subprocess import tempfile @@ -42,3 +45,84 @@ class TestCase(unittest.TestCase): result = json.loads(r.stdout) return result["tree_id"], result["output_id"] + + def run_tree_diff(self, tree1, tree2): + tree_diff_cmd = ["./tree-diff", tree1, tree2] + + r = subprocess.run(tree_diff_cmd, encoding="utf-8", stdout=subprocess.PIPE, check=True) + + return json.loads(r.stdout) + + def get_path_to_store(self, tree_id): + return f"{self.store}/refs/{tree_id}" + + def assertTreeDiffsEqual(self, tree_diff1, tree_diff2): + """ + Asserts two tree diffs for equality. + + Before assertion, the two trees are sorted, therefore order of files + doesn't matter. + + There's a special rule for asserting differences where we don't + know the exact before/after value. This is useful for example if + the content of file is dependant on current datetime. You can use this + feature by putting null value in difference you don't care about. + + Example: + "/etc/shadow": {content: ["sha256:xxx", null]} + + In this case the after content of /etc/shadow doesn't matter. + The only thing that matters is the before content and that + the content modification happened. + """ + tree_diff1 = _sorted_tree(tree_diff1) + tree_diff2 = _sorted_tree(tree_diff2) + + def raise_assertion(msg): + raise TreeAssertionError(msg, tree_diff1, tree_diff2) + + self.assertEqual(tree_diff1['added_files'], tree_diff2['added_files']) + self.assertEqual(tree_diff1['deleted_files'], tree_diff2['deleted_files']) + + if len(tree_diff1['differences']) != len(tree_diff2['differences']): + raise_assertion('length of differences different') + + for (file1, differences1), (file2, differences2) in \ + zip(tree_diff1['differences'].items(), tree_diff2['differences'].items()): + + if file1 != file2: + raise_assertion(f"filename different: {file1}, {file2}") + + if len(differences1) != len(differences2): + raise_assertion("length of file differences different") + + for (difference1_kind, difference1_values), (difference2_kind, difference2_values) in \ + zip(differences1.items(), differences2.items()): + if difference1_kind != difference2_kind: + raise_assertion(f"different difference kinds: {difference1_kind}, {difference2_kind}") + + if difference1_values[0] is not None \ + and difference2_values[0] is not None \ + and difference1_values[0] != difference2_values[0]: + raise_assertion(f"before values are different: {difference1_values[0]}, {difference2_values[0]}") + + if difference1_values[1] is not None \ + and difference2_values[1] is not None \ + and difference1_values[1] != difference2_values[1]: + raise_assertion(f"after values are different: {difference1_values[1]}, {difference2_values[1]}") + + +def _sorted_tree(tree): + sorted_tree = json.loads(json.dumps(tree, sort_keys=True)) + sorted_tree["added_files"] = sorted(sorted_tree["added_files"]) + sorted_tree["deleted_files"] = sorted(sorted_tree["deleted_files"]) + + return sorted_tree + + +class TreeAssertionError(AssertionError): + def __init__(self, msg, tree_diff1, tree_diff2): + diff = ('\n'.join(difflib.ndiff( + pprint.pformat(tree_diff1).splitlines(), + pprint.pformat(tree_diff2).splitlines()))) + super().__init__(f"{msg}\n\n{diff}") diff --git a/test/stages_tests/firewall/a.json b/test/stages_tests/firewall/a.json new file mode 100644 index 00000000..00b41497 --- /dev/null +++ b/test/stages_tests/firewall/a.json @@ -0,0 +1,43 @@ +{ + "build": { + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "install_weak_deps": false, + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "dnf" + ] + } + } + ] + }, + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "@Core" + ] + } + } + ] +} diff --git a/test/stages_tests/firewall/b.json b/test/stages_tests/firewall/b.json new file mode 100644 index 00000000..038b570a --- /dev/null +++ b/test/stages_tests/firewall/b.json @@ -0,0 +1,61 @@ +{ + "build": { + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "install_weak_deps": false, + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "dnf" + ] + } + } + ] + }, + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "@Core" + ] + } + }, + { + "name": "org.osbuild.firewall", + "options": { + "ports": [ + "53:tcp", + "88:udp" + ], + "enabled_services": [ + "http", + "ftp" + ], + "disabled_services": [ + "telnet" + ] + } + } + ] +} + + diff --git a/test/stages_tests/firewall/diff.json b/test/stages_tests/firewall/diff.json new file mode 100644 index 00000000..c59c4e08 --- /dev/null +++ b/test/stages_tests/firewall/diff.json @@ -0,0 +1,8 @@ +{ + "added_files": [ + "/etc/firewalld/zones/public.xml", + "/etc/firewalld/zones/public.xml.old" + ], + "deleted_files": [], + "differences": {} +} diff --git a/test/stages_tests/fstab/a.json b/test/stages_tests/fstab/a.json new file mode 100644 index 00000000..00b41497 --- /dev/null +++ b/test/stages_tests/fstab/a.json @@ -0,0 +1,43 @@ +{ + "build": { + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "install_weak_deps": false, + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "dnf" + ] + } + } + ] + }, + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "@Core" + ] + } + } + ] +} diff --git a/test/stages_tests/fstab/b.json b/test/stages_tests/fstab/b.json new file mode 100644 index 00000000..d2bd5fa4 --- /dev/null +++ b/test/stages_tests/fstab/b.json @@ -0,0 +1,58 @@ +{ + "build": { + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "install_weak_deps": false, + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "dnf" + ] + } + } + ] + }, + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "@Core" + ] + } + }, + { + "name": "org.osbuild.fstab", + "options": { + "filesystems": [ + { + "uuid": "76a22bf4-f153-4541-b6c7-0332c0dfaeac", + "vfs_type": "ext4", + "path": "/", + "freq": "1", + "passno": "1" + } + ] + } + } ] +} + + diff --git a/test/stages_tests/fstab/diff.json b/test/stages_tests/fstab/diff.json new file mode 100644 index 00000000..1345799b --- /dev/null +++ b/test/stages_tests/fstab/diff.json @@ -0,0 +1,7 @@ +{ + "added_files": [ + "/etc/fstab" + ], + "deleted_files": [], + "differences": {} +} diff --git a/test/stages_tests/hostname/a.json b/test/stages_tests/hostname/a.json new file mode 100644 index 00000000..00b41497 --- /dev/null +++ b/test/stages_tests/hostname/a.json @@ -0,0 +1,43 @@ +{ + "build": { + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "install_weak_deps": false, + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "dnf" + ] + } + } + ] + }, + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "@Core" + ] + } + } + ] +} diff --git a/test/stages_tests/hostname/b.json b/test/stages_tests/hostname/b.json new file mode 100644 index 00000000..31a95212 --- /dev/null +++ b/test/stages_tests/hostname/b.json @@ -0,0 +1,51 @@ +{ + "build": { + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "install_weak_deps": false, + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "dnf" + ] + } + } + ] + }, + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "@Core" + ] + } + }, + { + "name": "org.osbuild.hostname", + "options": { + "hostname": "testing.hostname.local" + } + } + ] +} + + diff --git a/test/stages_tests/hostname/diff.json b/test/stages_tests/hostname/diff.json new file mode 100644 index 00000000..433c7520 --- /dev/null +++ b/test/stages_tests/hostname/diff.json @@ -0,0 +1,7 @@ +{ + "added_files": [ + "/etc/hostname" + ], + "deleted_files": [], + "differences": {} +} diff --git a/test/stages_tests/keymap/a.json b/test/stages_tests/keymap/a.json new file mode 100644 index 00000000..00b41497 --- /dev/null +++ b/test/stages_tests/keymap/a.json @@ -0,0 +1,43 @@ +{ + "build": { + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "install_weak_deps": false, + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "dnf" + ] + } + } + ] + }, + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "@Core" + ] + } + } + ] +} diff --git a/test/stages_tests/keymap/b.json b/test/stages_tests/keymap/b.json new file mode 100644 index 00000000..c384ed75 --- /dev/null +++ b/test/stages_tests/keymap/b.json @@ -0,0 +1,51 @@ +{ + "build": { + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "install_weak_deps": false, + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "dnf" + ] + } + } + ] + }, + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "@Core" + ] + } + }, + { + "name": "org.osbuild.keymap", + "options": { + "keymap": "se-dvorak" + } + } + ] +} + + diff --git a/test/stages_tests/keymap/diff.json b/test/stages_tests/keymap/diff.json new file mode 100644 index 00000000..42853225 --- /dev/null +++ b/test/stages_tests/keymap/diff.json @@ -0,0 +1,7 @@ +{ + "added_files": [ + "/etc/vconsole.conf" + ], + "deleted_files": [], + "differences": {} +} diff --git a/test/stages_tests/locale/a.json b/test/stages_tests/locale/a.json new file mode 100644 index 00000000..00b41497 --- /dev/null +++ b/test/stages_tests/locale/a.json @@ -0,0 +1,43 @@ +{ + "build": { + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "install_weak_deps": false, + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "dnf" + ] + } + } + ] + }, + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "@Core" + ] + } + } + ] +} diff --git a/test/stages_tests/locale/b.json b/test/stages_tests/locale/b.json new file mode 100644 index 00000000..2f2471c5 --- /dev/null +++ b/test/stages_tests/locale/b.json @@ -0,0 +1,51 @@ +{ + "build": { + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "install_weak_deps": false, + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "dnf" + ] + } + } + ] + }, + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "@Core" + ] + } + }, + { + "name": "org.osbuild.locale", + "options": { + "language": "nn_NO.utf8" + } + } + ] +} + + diff --git a/test/stages_tests/locale/diff.json b/test/stages_tests/locale/diff.json new file mode 100644 index 00000000..7066f862 --- /dev/null +++ b/test/stages_tests/locale/diff.json @@ -0,0 +1,7 @@ +{ + "added_files": [ + "/etc/locale.conf" + ], + "deleted_files": [], + "differences": {} +} diff --git a/test/stages_tests/systemd/a.json b/test/stages_tests/systemd/a.json new file mode 100644 index 00000000..00b41497 --- /dev/null +++ b/test/stages_tests/systemd/a.json @@ -0,0 +1,43 @@ +{ + "build": { + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "install_weak_deps": false, + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "dnf" + ] + } + } + ] + }, + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "@Core" + ] + } + } + ] +} diff --git a/test/stages_tests/systemd/b.json b/test/stages_tests/systemd/b.json new file mode 100644 index 00000000..d0642de6 --- /dev/null +++ b/test/stages_tests/systemd/b.json @@ -0,0 +1,52 @@ +{ + "build": { + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "install_weak_deps": false, + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "dnf" + ] + } + } + ] + }, + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "@Core" + ] + } + }, + { + "name": "org.osbuild.systemd", + "options": { + "enabled_services": ["nftables"], + "disabled_services": ["sshd"] + } + } + ] +} + + diff --git a/test/stages_tests/systemd/diff.json b/test/stages_tests/systemd/diff.json new file mode 100644 index 00000000..3d59c16f --- /dev/null +++ b/test/stages_tests/systemd/diff.json @@ -0,0 +1,9 @@ +{ + "added_files": [ + "/etc/systemd/system/multi-user.target.wants/nftables.service" + ], + "deleted_files": [ + "/etc/systemd/system/multi-user.target.wants/sshd.service" + ], + "differences": {} +} diff --git a/test/stages_tests/timezone/a.json b/test/stages_tests/timezone/a.json new file mode 100644 index 00000000..00b41497 --- /dev/null +++ b/test/stages_tests/timezone/a.json @@ -0,0 +1,43 @@ +{ + "build": { + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "install_weak_deps": false, + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "dnf" + ] + } + } + ] + }, + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "@Core" + ] + } + } + ] +} diff --git a/test/stages_tests/timezone/b.json b/test/stages_tests/timezone/b.json new file mode 100644 index 00000000..a2c2e6a0 --- /dev/null +++ b/test/stages_tests/timezone/b.json @@ -0,0 +1,51 @@ +{ + "build": { + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "install_weak_deps": false, + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "dnf" + ] + } + } + ] + }, + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "@Core" + ] + } + }, + { + "name": "org.osbuild.timezone", + "options": { + "zone": "Europe/Prague" + } + } + ] +} + + diff --git a/test/stages_tests/timezone/diff.json b/test/stages_tests/timezone/diff.json new file mode 100644 index 00000000..748b7519 --- /dev/null +++ b/test/stages_tests/timezone/diff.json @@ -0,0 +1,12 @@ +{ + "added_files": [], + "deleted_files": [], + "differences": { + "/etc/localtime": { + "symlink": [ + "../usr/share/zoneinfo/UTC", + "../usr/share/zoneinfo/Europe/Prague" + ] + } + } +} diff --git a/test/stages_tests/users/a.json b/test/stages_tests/users/a.json new file mode 100644 index 00000000..00b41497 --- /dev/null +++ b/test/stages_tests/users/a.json @@ -0,0 +1,43 @@ +{ + "build": { + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "install_weak_deps": false, + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "dnf" + ] + } + } + ] + }, + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "@Core" + ] + } + } + ] +} diff --git a/test/stages_tests/users/b.json b/test/stages_tests/users/b.json new file mode 100644 index 00000000..518e34e3 --- /dev/null +++ b/test/stages_tests/users/b.json @@ -0,0 +1,55 @@ +{ + "build": { + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "install_weak_deps": false, + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "dnf" + ] + } + } + ] + }, + "stages": [ + { + "name": "org.osbuild.dnf", + "options": { + "releasever": "30", + "basearch": "x86_64", + "repos": [ + { + "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch", + "gpgkey": "F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9", + "checksum": "sha256:9f596e18f585bee30ac41c11fb11a83ed6b11d5b341c1cb56ca4015d7717cb97" + } + ], + "packages": [ + "@Core" + ] + } + }, + { + "name": "org.osbuild.users", + "options": { + "users": { + "test": { + "password": "$6$s06sY2/bZbmuyE4a$JTn/Ki2jbNG.wGeCvt6mcjaIZ2HV.H8VjLzIMZs7f2G48NMFlcB2/OhbHZ6HhZAOcb.CmUb2qywSW2DkKe6gn0" + } + } + } + } + ] +} + + diff --git a/test/stages_tests/users/diff.json b/test/stages_tests/users/diff.json new file mode 100644 index 00000000..b3fa781f --- /dev/null +++ b/test/stages_tests/users/diff.json @@ -0,0 +1,80 @@ +{ + "added_files": [ + "/etc/subgid-", + "/etc/subuid-", + "/home/test", + "/home/test/.bash_logout", + "/home/test/.bashrc", + "/home/test/.bash_profile", + "/var/spool/mail/test" + ], + "deleted_files": [], + "differences": { + "/etc/shadow-": { + "content": [ + null, + null + ] + }, + "/etc/passwd": { + "content": [ + "sha256:9f38297afcc8f09e9e313db2628402f4448b92f5e5c41fdef8a859063703b09f", + "sha256:323c887dd9cc7f6ec7a2cb70daf54b56d74054153a8759983d84e92dc2393127" + ] + }, + "/etc/group": { + "content": [ + "sha256:302bff1ff0e98dfee5bddea461138a3f584695aceb590f8452e11e343e5eea2d", + "sha256:1bfe88ec0b2125a00a6e423bed2fbd562f426ddcb7cd28a27e21df90ee516bee" + ] + }, + "/etc/gshadow": { + "content": [ + null, + null + ] + }, + "/etc/subuid": { + "content": [ + "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "sha256:26d48e295489c012dd33c13df566059d0f97215e1990d80192026e5a162dc3a0" + ] + }, + "/etc/group-": { + "content": [ + "sha256:ca63b6808736bb195f8a0576d0ed96a1d290a5e95da53beba9841ad59e17edc8", + "sha256:302bff1ff0e98dfee5bddea461138a3f584695aceb590f8452e11e343e5eea2d" + ] + }, + "/etc/passwd-": { + "content": [ + "sha256:8feaad3131f7f2842a96c2b4c054e2e32c8d2472de26fb29d7beb2b603753d53", + "sha256:9f38297afcc8f09e9e313db2628402f4448b92f5e5c41fdef8a859063703b09f" + ] + }, + "/etc/gshadow-": { + "content": [ + null, + null + ] + }, + "/etc/subgid": { + "content": [ + "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "sha256:26d48e295489c012dd33c13df566059d0f97215e1990d80192026e5a162dc3a0" + ] + }, + "/etc/shadow": { + "content": [ + null, + null + ] + }, + "/var/log/lastlog": { + "content": [ + "sha256:a29839a75996714fe64f0d3dc9e21b58a66f8465a0e1a248ef76fcc822b1d078", + "sha256:d1024fa7ebf79a2dd6d553fef19bf1d1234616885979e533b345b7c54968079b" + ] + } + } +} diff --git a/test/test_boot.py b/test/test_boot.py index 0d93c941..692d0d44 100644 --- a/test/test_boot.py +++ b/test/test_boot.py @@ -23,7 +23,7 @@ class TestBoot(osbuildtest.TestCase): "-device", "virtio-serial", "-device", "virtserialport,chardev=stdio", - f"{self.store}/refs/{output_id}/f30-boot.qcow2" + f"{self.get_path_to_store(output_id)}/f30-boot.qcow2" ], encoding="utf-8", stdout=subprocess.PIPE, check=True) self.assertEqual(r.stdout.strip(), "running") diff --git a/test/test_stages.py b/test/test_stages.py new file mode 100644 index 00000000..6b02e225 --- /dev/null +++ b/test/test_stages.py @@ -0,0 +1,36 @@ +import json +import os + +from test import osbuildtest + + +class TestDescriptions(osbuildtest.TestCase): + + def run_stage_test(self, test_dir: str): + pipeline1 = f"{test_dir}/a.json" + pipeline2 = f"{test_dir}/b.json" + tree_id1, _ = self.run_osbuild(pipeline1) + tree_id2, _ = self.run_osbuild(pipeline2) + + actual_diff = self.run_tree_diff(self.get_path_to_store(tree_id1), self.get_path_to_store(tree_id2)) + + with open(f"{test_dir}/diff.json") as f: + expected_diff = json.load(f) + + self.assertTreeDiffsEqual(expected_diff, actual_diff) + + +def generate_test_case(test): + def test_case(self): + self.run_stage_test(test) + + return test_case + + +def init_tests(): + test_dir = 'test/stages_tests' + for test in os.listdir(test_dir): + setattr(TestDescriptions, f"test_{test}", generate_test_case(f"{test_dir}/{test}")) + + +init_tests()