mirror of
https://github.com/Droid-Deck/DroidDeck.git
synced 2026-11-11 02:51:10 +00:00
75 lines
3.4 KiB
Python
75 lines
3.4 KiB
Python
import hashlib
|
|
import os
|
|
import subprocess
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
REMEMBER = Path(__file__).resolve().parents[1] / "ubuntu/overlay-runtime/usr/share/droiddeck/apt/remember"
|
|
|
|
|
|
class AptRememberTest(unittest.TestCase):
|
|
def setUp(self):
|
|
temp = tempfile.TemporaryDirectory()
|
|
self.addCleanup(temp.cleanup)
|
|
self.top = Path(temp.name)
|
|
self.dir = self.top / "share/apt"
|
|
self.state = self.top / "state"
|
|
self.etc = self.top / "etc/apt"
|
|
self.keys = self.top / "keyrings"
|
|
self.autostart = self.top / "autostart"
|
|
for d in (self.dir, self.etc / "sources.list.d", self.keys, self.autostart, self.top / "bin"):
|
|
d.mkdir(parents=True)
|
|
(self.dir / "system-manual.txt").write_text("base\n")
|
|
(self.dir / "runtime-id").write_text("new\n")
|
|
system = self.keys / "ubuntu-archive.gpg"
|
|
system.write_text("system key")
|
|
(self.dir / "system-sources.txt").write_text("%s %s\n" % (system, hashlib.sha256(b"system key").hexdigest()))
|
|
apt_mark = self.top / "bin/apt-mark"
|
|
apt_mark.write_text("#!/bin/sh\nprintf 'base\\nvlc\\n'\n")
|
|
apt_mark.chmod(0o755)
|
|
script = REMEMBER.read_text()
|
|
script = script.replace("/usr/share/droiddeck/apt", str(self.dir))
|
|
script = script.replace("/root/.local/share/droiddeck/apt", str(self.state))
|
|
script = script.replace("/etc/xdg/autostart", str(self.autostart))
|
|
script = script.replace("/usr/share/keyrings", str(self.keys))
|
|
script = script.replace("/etc/apt", str(self.etc))
|
|
self.script = self.top / "remember"
|
|
self.script.write_text(script)
|
|
|
|
def run_remember(self):
|
|
env = dict(os.environ, PATH="%s:%s" % (self.top / "bin", os.environ["PATH"]))
|
|
env.pop("DROIDDECK_APT_RESTORING", None)
|
|
subprocess.run(["bash", str(self.script)], env=env, check=True, timeout=30)
|
|
|
|
def test_user_sources_and_keys_outside_etc_apt_are_kept(self):
|
|
(self.etc / "sources.list").write_text("deb http://example.invalid stable main\n")
|
|
(self.keys / "example.gpg").write_text("user key")
|
|
self.run_remember()
|
|
self.assertEqual("vlc\n", (self.state / "packages.txt").read_text())
|
|
self.assertTrue((self.state / "sources/sources.list").is_file())
|
|
self.assertEqual("user key", (self.state / "keyrings" / ("%s_example.gpg" % str(self.keys).lstrip("/").replace("/", "_"))).read_text())
|
|
self.assertFalse(any("ubuntu-archive" in p.name for p in (self.state / "keyrings").iterdir()))
|
|
|
|
def test_the_previous_runtime_snapshot_waits_for_the_desktop_restore(self):
|
|
(self.autostart / "droiddeck-apt-restore.desktop").write_text("")
|
|
self.state.mkdir()
|
|
(self.state / "packages.txt").write_text("old-app\n")
|
|
(self.state / "restored").write_text("old\n")
|
|
self.run_remember()
|
|
self.assertEqual("old-app\n", (self.state / "packages.txt").read_text())
|
|
(self.state / "attempted").write_text("new\n")
|
|
self.run_remember()
|
|
self.assertEqual("vlc\n", (self.state / "packages.txt").read_text())
|
|
|
|
def test_without_the_desktop_the_snapshot_follows_the_runtime(self):
|
|
self.state.mkdir()
|
|
(self.state / "packages.txt").write_text("old-app\n")
|
|
(self.state / "restored").write_text("old\n")
|
|
self.run_remember()
|
|
self.assertEqual("vlc\n", (self.state / "packages.txt").read_text())
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|