Blame test/mod/test_osbuild.py

Packit a20ca0
#
Packit a20ca0
# Basic tests for a collection of osbuild modules.
Packit a20ca0
#
Packit a20ca0
Packit a20ca0
import json
Packit a20ca0
import os
Packit Service 2d981f
import pathlib
Packit Service 2d981f
import sys
Packit Service 2d981f
import tempfile
Packit a20ca0
import unittest
Packit a20ca0
Packit a20ca0
import osbuild
Packit a20ca0
import osbuild.meta
Packit Service 2d981f
from osbuild.monitor import NullMonitor
Packit Service c94ef3
from osbuild.objectstore import ObjectStore
Packit Service c94ef3
from osbuild.pipeline import Manifest, detect_host_runner
Packit Service 2d981f
from .. import test
Packit a20ca0
Packit a20ca0
Packit a20ca0
class TestDescriptions(unittest.TestCase):
Packit a20ca0
Packit Service 2d981f
    @unittest.skipUnless(test.TestBase.can_bind_mount(), "root-only")
Packit Service 2d981f
    def test_stage_run(self):
Packit Service c94ef3
        index = osbuild.meta.Index(os.curdir)
Packit Service c94ef3
        info = index.get_module_info("Stage", "org.osbuild.noop")
Packit Service c94ef3
        stage = osbuild.Stage(info, {}, None, None, {})
Packit Service 2d981f
Packit Service 2d981f
        with tempfile.TemporaryDirectory() as tmpdir:
Packit Service 2d981f
Packit Service 2d981f
            data = pathlib.Path(tmpdir, "data")
Packit Service c94ef3
            storedir = pathlib.Path(tmpdir, "store")
Packit Service 2d981f
            root = pathlib.Path("/")
Packit Service 2d981f
            runner = detect_host_runner()
Packit Service 2d981f
            monitor = NullMonitor(sys.stderr.fileno())
Packit Service 2d981f
            libdir = os.path.abspath(os.curdir)
Packit Service c94ef3
            store = ObjectStore(storedir)
Packit Service c94ef3
            data.mkdir()
Packit Service 2d981f
Packit Service c94ef3
            res = stage.run(data, runner, root, store, monitor, libdir)
Packit Service 2d981f
Packit Service 2d981f
        self.assertEqual(res.success, True)
Packit Service 2d981f
        self.assertEqual(res.id, stage.id)
Packit Service 2d981f
Packit Service c94ef3
    def test_manifest(self):
Packit Service c94ef3
        index = osbuild.meta.Index(os.curdir)
Packit a20ca0
Packit Service c94ef3
        info = index.get_module_info("Stage", "org.osbuild.noop")
Packit Service 2d981f
Packit Service 4f7b0c
        manifest = Manifest()
Packit Service 2d981f
Packit Service c94ef3
        # each pipeline gets a noop stage with different
Packit Service c94ef3
        # options so that their ids are different
Packit Service c94ef3
        build = manifest.add_pipeline("build", None, None)
Packit Service c94ef3
        build.add_stage(info, {"option": 1})
Packit Service 2d981f
Packit Service c94ef3
        tree = manifest.add_pipeline("tree",
Packit Service c94ef3
                                     "org.osbuild.linux",
Packit Service c94ef3
                                     build.id)
Packit Service c94ef3
        tree.add_stage(info, {"option": 2})
Packit Service 2d981f
Packit Service c94ef3
        assmelber = manifest.add_pipeline("assembler",
Packit Service c94ef3
                                          "org.osbuild.inux",
Packit Service c94ef3
                                          build.id)
Packit Service c94ef3
        assmelber.add_stage(info, {"option": 3})
Packit Service 2d981f
Packit Service c94ef3
        self.assertEqual(len(manifest.pipelines), 3)
Packit Service c94ef3
Packit Service c94ef3
        self.assertIn("build", manifest.pipelines)
Packit Service c94ef3
        self.assertIn("tree", manifest.pipelines)
Packit Service c94ef3
        self.assertIn("assembler", manifest.pipelines)
Packit Service c94ef3
Packit Service c94ef3
        self.assertIn("build", manifest)
Packit Service c94ef3
        self.assertIn("tree", manifest)
Packit Service c94ef3
        self.assertIn("assembler", manifest)
Packit Service c94ef3
Packit Service c94ef3
        # make sure the order is correct
Packit Service c94ef3
        lst = ["build", "tree", "assembler"]
Packit Service c94ef3
        for a, b in zip(manifest.pipelines, lst):
Packit Service c94ef3
            self.assertEqual(a, b)
Packit Service c94ef3
Packit Service c94ef3
        for a, b in zip(manifest, [build, tree, assmelber]):
Packit Service c94ef3
            self.assertEqual(a.name, b.name)
Packit Service c94ef3
Packit Service c94ef3
        # check we get exceptions on unknown names
Packit Service c94ef3
        with self.assertRaises(KeyError):
Packit Service c94ef3
            _ = manifest.pipelines["foo"]
Packit Service c94ef3
Packit Service c94ef3
        with self.assertRaises(KeyError):
Packit Service c94ef3
            _ = manifest["foo"]
Packit Service c94ef3
Packit Service c94ef3
        # check helper functions
Packit Service c94ef3
        #  access by name
Packit Service c94ef3
        check = manifest["build"]
Packit Service c94ef3
        self.assertEqual(build.name, check.name)
Packit Service c94ef3
Packit Service c94ef3
        check = manifest["tree"]
Packit Service c94ef3
        self.assertEqual(tree.name, check.name)
Packit Service c94ef3
Packit Service c94ef3
        check = manifest["assembler"]
Packit Service c94ef3
        self.assertEqual(assmelber.name, check.name)
Packit Service c94ef3
Packit Service c94ef3
        #  `None` return for unknown items
Packit Service c94ef3
        check = manifest.get("foo")
Packit Service c94ef3
        self.assertIsNone(check)
Packit Service c94ef3
Packit Service c94ef3
        #  id based access
Packit Service c94ef3
        for i in [build, tree, assmelber]:
Packit Service c94ef3
            check = manifest[i.id]
Packit Service c94ef3
            self.assertEqual(i.name, check.name)
Packit a20ca0
Packit Service 4f7b0c
    def check_moduleinfo(self, version):
Packit a20ca0
        index = osbuild.meta.Index(os.curdir)
Packit a20ca0
Packit a20ca0
        modules = []
Packit Service c94ef3
        for klass in ("Assembler", "Input", "Source", "Stage"):
Packit a20ca0
            mods = index.list_modules_for_class(klass)
Packit a20ca0
            modules += [(klass, module) for module in mods]
Packit a20ca0
Packit a20ca0
        self.assertTrue(modules)
Packit a20ca0
Packit a20ca0
        for module in modules:
Packit a20ca0
            klass, name = module
Packit a20ca0
            try:
Packit a20ca0
                info = osbuild.meta.ModuleInfo.load(os.curdir, klass, name)
Packit Service 4f7b0c
                schema = osbuild.meta.Schema(info.get_schema(version), name)
Packit a20ca0
                res = schema.check()
Packit a20ca0
                if not res:
Packit Service 4f7b0c
                    err = "SCHEMA: " + json.dumps(schema.data, indent=2) + "\n"
Packit Service 4f7b0c
                    err += "\n  ".join(str(e) for e in res)
Packit a20ca0
                    self.fail(str(res) + "\n  " + err)
Packit a20ca0
            except json.decoder.JSONDecodeError as e:
Packit a20ca0
                msg = f"{klass} '{name}' has invalid STAGE_OPTS\n\t" + str(e)
Packit a20ca0
                self.fail(msg)
Packit a20ca0
Packit Service 4f7b0c
    def test_moduleinfo(self):
Packit Service 4f7b0c
        for version in ["1", "2"]:
Packit Service 4f7b0c
            with self.subTest(version=version):
Packit Service 4f7b0c
                self.check_moduleinfo(version)
Packit Service 4f7b0c
Packit Service 4f7b0c
Packit a20ca0
    def test_schema(self):
Packit a20ca0
        schema = osbuild.meta.Schema(None)
Packit a20ca0
        self.assertFalse(schema)
Packit a20ca0
Packit a20ca0
        schema = osbuild.meta.Schema({"type": "bool"})  # should be 'boolean'
Packit a20ca0
        self.assertFalse(schema.check().valid)
Packit a20ca0
        self.assertFalse(schema)
Packit a20ca0
Packit a20ca0
        schema = osbuild.meta.Schema({"type": "array", "minItems": 3})
Packit a20ca0
        self.assertTrue(schema.check().valid)
Packit a20ca0
        self.assertTrue(schema)
Packit a20ca0
Packit a20ca0
        res = schema.validate([1, 2])
Packit a20ca0
        self.assertFalse(res)
Packit a20ca0
        res = schema.validate([1, 2, 3])
Packit a20ca0
        self.assertTrue(res)