|
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)
|