debian-forge/test/run/test_exports.py
Michael Vogt 945209a80c test: use del os.environ[] instead of os.unsetenv (thanks Simon)
Simon discovered that `os.unsetenv()` will not remove the env
from os.environ so this commit fixes this.

Thanks for figuring this out!
2024-03-11 14:20:27 +01:00

93 lines
3 KiB
Python

import contextlib
import json
import os
import pathlib
import shutil
import subprocess
import pytest
from .. import test
@pytest.fixture(name="jsondata", scope="module")
def jsondata_fixture():
return json.dumps({
"version": "2",
"pipelines": [
{
"name": "image",
"stages": [
{
"type": "org.osbuild.truncate",
"options": {
"filename": "foo.img",
"size": "10",
},
},
{
# cannot use org.osbuild.chown as it needs the chown
# binary in the stage
"type": "org.osbuild.testing.injectpy",
"options": {
"code": [
'import os',
'os.chown(f"{tree}/foo.img", 1000, 1000)',
],
},
},
]
}
]
})
@pytest.fixture(name="osb", scope="module")
def osbuild_fixture():
with test.OSBuild() as osb:
yield osb
@pytest.fixture(name="testing_libdir", scope="module")
def testing_libdir_fixture(tmpdir_factory):
tests_path = pathlib.Path(__file__).parent.parent
project_path = tests_path.parent
testing_libdir_path = tests_path / "stages"
fake_libdir_path = tmpdir_factory.mktemp("fake-libdir")
# there must be an empty "osbild" dir for a "os.listdir(self._libdir)"
# in buildroot.py
(fake_libdir_path / "osbuild").mkdir()
# construct minimal viable libdir from current checkout
for d in ["stages", "runners", "schemas", "assemblers"]:
subprocess.run(
["cp", "-a", os.fspath(project_path / d), f"{fake_libdir_path}"],
check=True)
# now inject testing stages
for p in testing_libdir_path.glob("org.osbuild.testing.*"):
shutil.copy2(p, fake_libdir_path / "stages")
yield fake_libdir_path
@pytest.mark.skipif(os.getuid() != 0, reason="root-only")
def test_exports_normal(osb, tmp_path, jsondata, testing_libdir): # pylint: disable=unused-argument
osb.compile(jsondata, output_dir=tmp_path, exports=["image"], libdir=testing_libdir)
expected_export = tmp_path / "image/foo.img"
assert expected_export.exists()
assert expected_export.stat().st_uid == 1000
@pytest.mark.skipif(os.getuid() != 0, reason="root-only")
def test_exports_with_force_no_preserve_owner(osb, tmp_path, jsondata, testing_libdir):
k = "OSBUILD_EXPORT_FORCE_NO_PRESERVE_OWNER"
with contextlib.ExitStack() as cm:
os.environ[k] = "1"
def _delenv():
del os.environ[k]
cm.callback(_delenv)
osb.compile(jsondata, output_dir=tmp_path, exports=["image"], libdir=testing_libdir)
expected_export = tmp_path / "image/foo.img"
assert expected_export.exists()
assert expected_export.stat().st_uid == 0
assert k not in os.environ