From ec1c5bb37cb6055d2c3d967bcee9ae005ae84986 Mon Sep 17 00:00:00 2001 From: Christian Kellner Date: Sat, 1 Oct 2022 15:17:46 +0200 Subject: [PATCH] test: checks for runner detection Add a test suite for the runner detection logic. --- test/mod/test_meta.py | 158 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) diff --git a/test/mod/test_meta.py b/test/mod/test_meta.py index 4a322f59..a185f841 100644 --- a/test/mod/test_meta.py +++ b/test/mod/test_meta.py @@ -1,7 +1,165 @@ +import os +from tempfile import TemporaryDirectory + +import pytest + import osbuild import osbuild.meta +@pytest.fixture(name="tempdir") +def tempdir_fixture(): + with TemporaryDirectory(prefix="meta-") as tmp: + yield tmp + + +def create_runners(path, distro: str, base: str, versions): + """Create runner""" + runners = [] + + basename = f"{distro}{base}" + basepath = os.path.join(path, basename) + with open(basepath, "x", encoding="utf-8") as f: + f.write("#!/bin/bash") + runners.append(basename) + + for x in versions: + name = f"{distro}{x}" + link = os.path.join(path, name) + os.symlink(basepath, link) + runners.append(name) + + return runners + + +def test_parse_name(): + table = { + "arch": { + "distro": "arch", + "version": 0, + }, + "fedora30": { + "distro": "fedora", + "version": 30, + }, + "rhel7": { + "distro": "rhel", + "version": 7, + }, + "ubuntu1804": { + "distro": "ubuntu", + "version": 1804, + } + } + + for name, want in table.items(): + d, v = osbuild.meta.RunnerInfo.parse_name(name) + + assert d == want["distro"] + assert v == want["version"] + + +def test_runner_detection(tempdir): + + runners = os.path.join(tempdir, "runners") + os.makedirs(runners) + + meta = osbuild.meta.Index(tempdir) + + table = { + "arch": { + "base": "", + "versions": [], + "check": {"": 0}, + "fail": [] + }, + "fedora": { + "base": 30, + "versions": list(range(31, 40)), + "check": {40: 39, 31: 31, 35: 35}, + "fail": [29], + }, + "ubuntu": { + "base": 1810, + "versions": [1904, 1910, 2004], + "check": {2010: 2004, 1912: 1910}, + "fail": [1804], + }, + "rhel": { + "base": 90, + "versions": [91, 92, 93], + "check": {94: 93}, + }, + "future": { + "base": 100, + "versions": [101, 102, 103], + "check": {110: 103}, + } + } + + want_all = [] + for distro, info in table.items(): + base = info["base"] or 0 + versions = info["versions"] + want = create_runners(runners, distro, str(base), versions) + have = meta.list_runners(distro) + assert len(want) == len(have) + want_all += want + + for v in [base] + versions: + name = f"{distro}{v}" + runner = meta.detect_runner(name) + assert runner + assert runner.distro == distro + assert runner.version == v + + for v, t in info["check"].items(): + name = f"{distro}{v}" + runner = meta.detect_runner(name) + assert runner + assert runner.distro == distro + assert runner.version == t + + for v in info.get("fail", []): + name = f"{distro}{v}" + with pytest.raises(ValueError): + runner = meta.detect_runner(name) + + have = meta.list_runners() + assert len(have) == len(want_all) + + +def test_runner_sorting(tempdir): + + runners = os.path.join(tempdir, "runners") + os.makedirs(runners) + + table = { + "A": { + "base": 1, + "versions": [2, 3] + }, + "B": { + "base": 1, + "versions": [2, 3] + } + } + + for distro, info in table.items(): + base = info["base"] or 0 + versions = info["versions"] + create_runners(runners, distro, str(base), versions) + + meta = osbuild.meta.Index(tempdir) + have = meta.list_runners() + + names = [ + f"{i.distro}{i.version}" for i in have + ] + + assert names == ["A1", "A2", "A3", "B1", "B2", "B3"] + + def test_schema(): schema = osbuild.meta.Schema(None) assert not schema