test: add tests for new monitor and its components

Signed-off-by: Achilleas Koutsou <achilleas@koutsou.net>
This commit is contained in:
Achilleas Koutsou 2021-10-05 17:54:35 +02:00 committed by Ondřej Budai
parent 5510d0c42e
commit 1a2dfb0070

View file

@ -3,6 +3,7 @@
# #
import io import io
import json
import os import os
import sys import sys
import tempfile import tempfile
@ -12,6 +13,7 @@ from collections import defaultdict
import osbuild import osbuild
import osbuild.meta import osbuild.meta
from osbuild.monitor import LogMonitor from osbuild.monitor import LogMonitor
from osbuild.monitor import JSONProgressMonitor, Context, Progress, LogLine
from osbuild.objectstore import ObjectStore from osbuild.objectstore import ObjectStore
from osbuild.pipeline import Runner from osbuild.pipeline import Runner
@ -45,7 +47,7 @@ class TapeMonitor(osbuild.monitor.BaseMonitor):
self.counter["result"] += 1 self.counter["result"] += 1
self.results.add(result.id) self.results.add(result.id)
def log(self, message: str): def log(self, message: str, origin: str = None):
self.counter["log"] += 1 self.counter["log"] += 1
self.logger.write(message) self.logger.write(message)
@ -114,3 +116,127 @@ class TestMonitor(unittest.TestCase):
self.assertIn(pipeline.stages[0].id, tape.stages) self.assertIn(pipeline.stages[0].id, tape.stages)
self.assertIn("isthisthereallife", tape.output) self.assertIn("isthisthereallife", tape.output)
self.assertIn("isthisjustfantasy", tape.output) self.assertIn("isthisjustfantasy", tape.output)
def test_context():
index = osbuild.meta.Index(os.curdir)
runner = Runner(index.detect_host_runner())
pipeline = osbuild.Pipeline(name="test-pipeline", runner=runner)
index = osbuild.meta.Index(os.curdir)
info = index.get_module_info("Stage", "org.osbuild.noop")
stage = osbuild.Stage(info, {}, None, None, {}, None)
ctx = Context("org.osbuild.test", pipeline, stage)
assert ctx.id == "e6305b7e8ccbc39ec88415ea955b89149faf6f51fb6c89831658068bc6850411"
ctx_dict = ctx.as_dict()
# should be a full dict
assert "origin" in ctx_dict
assert ctx_dict["id"] == "e6305b7e8ccbc39ec88415ea955b89149faf6f51fb6c89831658068bc6850411"
assert "pipeline" in ctx_dict
assert ctx_dict["pipeline"]["name"] == "test-pipeline"
assert ctx_dict["pipeline"]["stage"]["name"] == "org.osbuild.noop"
ctx_dict = ctx.as_dict()
# should only have id
assert ctx_dict["id"] == "e6305b7e8ccbc39ec88415ea955b89149faf6f51fb6c89831658068bc6850411"
assert len(ctx_dict) == 1
ctx.origin = "org.osbuild.test-2"
ctx_dict = ctx.as_dict()
# should be a full dict again
assert "origin" in ctx_dict
assert "pipeline" in ctx_dict
assert ctx_dict["pipeline"]["name"] == "test-pipeline"
assert ctx_dict["pipeline"]["stage"]["name"] == "org.osbuild.noop"
ctx.origin = "org.osbuild.test"
ctx_dict = ctx.as_dict()
# should only have id again (old context ID)
assert ctx_dict["id"] == "e6305b7e8ccbc39ec88415ea955b89149faf6f51fb6c89831658068bc6850411"
assert len(ctx_dict) == 1
def test_progress():
prog = Progress("test", total=12, unit="tests")
subprog = Progress("test-sub1", total=3)
prog.sub_progress(subprog)
assert prog.done is None # starts with None until the first incr()
prog.incr()
prog.incr(depth=1)
progdict = prog.as_dict()
assert progdict["done"] == 0
assert progdict["progress"]["done"] == 0
prog.incr(depth=1)
progdict = prog.as_dict()
assert progdict["done"] == 0
assert progdict["progress"]["done"] == 1
prog.incr()
progdict = prog.as_dict()
assert progdict["done"] == 1
assert progdict["progress"]["done"] is None, "sub-progress did not reset"
def test_json_progress_monitor():
index = osbuild.meta.Index(os.curdir)
info = index.get_module_info("Stage", "org.osbuild.noop")
manifest = osbuild.Manifest()
pl1 = manifest.add_pipeline("test-pipeline-first", "", "")
first_stage = pl1.add_stage(info, {})
pl1.add_stage(info, {})
pl2 = manifest.add_pipeline("test-pipeline-second", "", "")
pl2.add_stage(info, {})
pl2.add_stage(info, {})
manifest.add_pipeline(pl2, "", "")
with tempfile.TemporaryFile() as tf:
mon = JSONProgressMonitor(tf.fileno(), manifest)
mon.log("test-message-1")
mon.log("test-message-2", origin="test.origin.override")
mon.begin(manifest.pipelines["test-pipeline-first"])
mon.log("pipeline 1 message 1")
mon.stage(first_stage)
mon.log("pipeline 1 message 2")
mon.log("pipeline 1 finished", origin="org.osbuild")
mon.begin(manifest.pipelines["test-pipeline-second"])
mon.log("pipeline 2 starting", origin="org.osbuild")
mon.log("pipeline 2 message 2")
tf.seek(0)
log = tf.read().decode().strip().split("\n")
assert len(log) == 7
logitem = json.loads(log[0])
assert logitem["message"] == "test-message-1"
assert logitem["context"]["origin"] == "org.osbuild"
logitem = json.loads(log[1])
assert logitem["message"] == "test-message-2"
assert logitem["context"]["origin"] == "test.origin.override"
logitem = json.loads(log[2])
assert logitem["message"] == "pipeline 1 message 1"
assert logitem["context"]["origin"] == "org.osbuild"
assert logitem["context"]["pipeline"]["name"] == "test-pipeline-first"
assert logitem["context"]["pipeline"]["stage"]["name"] is None
logitem = json.loads(log[3])
assert logitem["message"] == "pipeline 1 message 2"
assert logitem["context"]["origin"] == "org.osbuild"
assert logitem["context"]["pipeline"]["name"] == "test-pipeline-first"
assert logitem["context"]["pipeline"]["stage"]["name"] == "org.osbuild.noop"
logitem = json.loads(log[4])
assert logitem["message"] == "pipeline 1 finished"
assert "origin" not in logitem["context"]
assert len(logitem["context"]) == 1
logitem = json.loads(log[5])
assert logitem["message"] == "pipeline 2 starting"
assert logitem["context"]["origin"] == "org.osbuild"
assert logitem["context"]["pipeline"]["name"] == "test-pipeline-second"