49 lines
2.3 KiB
Python
49 lines
2.3 KiB
Python
import importlib.util
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
|
|
MODULE_PATH = Path(__file__).parents[2] / "autoinstall/offline/recover-python-profile-on-boot.py"
|
|
SPEC = importlib.util.spec_from_file_location("recover_python_profile_on_boot", MODULE_PATH)
|
|
MODULE = importlib.util.module_from_spec(SPEC)
|
|
assert SPEC.loader
|
|
SPEC.loader.exec_module(MODULE)
|
|
|
|
|
|
class RecoverPythonProfileOnBootTests(unittest.TestCase):
|
|
def test_absent_and_terminal_states_are_noop(self):
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
root = Path(directory)
|
|
self.assertEqual(MODULE.recover(root / "missing", root / "cp", root / "target")["action"],
|
|
"none")
|
|
|
|
def test_installing_state_rolls_back(self):
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
root = Path(directory)
|
|
target = root / "venv"
|
|
target.mkdir()
|
|
(target / "marker").write_text("old")
|
|
checkpoint = root / "checkpoint"
|
|
manifest = MODULE.installer.checkpoint_api.create(target, checkpoint, "op-1")
|
|
journal = root / "journal.json"
|
|
identity = dict(operation_id="op-1", profile="cpu-only", manifest_sha256="a" * 64)
|
|
current = MODULE.journal_api.update(journal, expected_generation=0,
|
|
state="profile_selected", checkpoint_id=None, **identity)
|
|
current = MODULE.journal_api.update(journal, expected_generation=current["generation"],
|
|
state="checkpoint_ready",
|
|
checkpoint_id=manifest["inventory_sha256"], **identity)
|
|
MODULE.journal_api.update(journal, expected_generation=current["generation"],
|
|
state="installing", checkpoint_id=manifest["inventory_sha256"],
|
|
**identity)
|
|
(target / "marker").write_text("activated")
|
|
result = MODULE.recover(journal, checkpoint, target)
|
|
self.assertEqual(result["state"], "rolled_back")
|
|
self.assertEqual((target / "marker").read_text(), "old")
|
|
self.assertEqual(MODULE.recover(journal, checkpoint, target)["reason"],
|
|
"terminal_rolled_back")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|