okami.mom/albedo

git clone https://git.nkp.pet/okami.mom/albedo

Aly Raffauffix(daemon): remove stopped session running marks8d97901

main
3.2 KiB76 linesraw
1"""Stopped turns and deleted sessions release their daemon-wide running marks."""
2
3import json
4import threading
5import unittest
6
7from harness import Albedo, Provider, ROOT, exclusive, text, wait_until
8from inspect_support import Inspection
9
10
11class RunningMarksTest(unittest.TestCase):
12    # exclusive: enables inspection at daemon startup
13    @exclusive
14    def test_completed_closed_and_deleted_sessions_release_running_marks(self):
15        ready, release = threading.Event(), threading.Event()
16        self.addCleanup(release.set)
17
18        def script(_request):
19            ready.set()
20            if not release.wait(30):
21                raise AssertionError("test did not release the provider")
22            return text("finished")
23
24        provider = Provider(script)
25        self.addCleanup(provider.close)
26        with Albedo(
27            provider,
28            prepare=lambda app: app.daemon.env.update(ALBEDO_INSPECT="1"),
29        ) as app:
30            inspection = Inspection(app, ROOT / "test/e2e/albedo_running_probe.erl")
31            for ending in ("completed", "closed", "deleted"):
32                with self.subTest(ending=ending):
33                    ready.clear()
34                    release.clear()
35                    session = app.session()
36                    arguments = f"[<<{json.dumps(session)}>>]"
37                    self.assertEqual(
38                        inspection.call_json("state", arguments),
39                        {"running": False, "records": 0},
40                    )
41                    app.prompt(session, ending).close()
42                    try:
43                        self.assertTrue(ready.wait(20), "provider was not reached")
44                        self.assertEqual(
45                            inspection.call_json("state", arguments),
46                            {"running": True, "records": 1},
47                        )
48                        if ending == "completed":
49                            release.set()
50                            app.idle(session)
51                        elif ending == "closed":
52                            self.assertEqual(
53                                inspection.call("close", arguments), "closed"
54                            )
55                        else:
56                            path = f"/sessions/{session}?view=configuration"
57                            with app.api(path) as response:
58                                configuration = json.load(response)
59                                revision = response.headers["ETag"]
60                            path += (
61                                "&scope=subtree&family_revision="
62                                + configuration["family_revision"]
63                            )
64                            app.api(
65                                path, method="DELETE", headers={"If-Match": revision}
66                            ).close()
67                        wait_until(
68                            lambda: (
69                                inspection.call_json("state", arguments)
70                                == {"running": False, "records": 0}
71                            ),
72                            10,
73                            "stopped session retained its running mark",
74                        )
75                    finally:
76                        release.set()