test(connection): drain beats before label-fetch asserts; label-less negative cache costs one pm dump ever + shlex-quote shape pinned (t26 F1,F2)
This commit is contained in:
1 parent
b442440ccf
commit
67174b8536
1 file changed
+42
-1
@@ -86,8 +86,10 @@ class FakePoller:
|
|||||||
|
|
||||||
async def shell(self, cmd: str) -> str | None:
|
async def shell(self, cmd: str) -> str | None:
|
||||||
self.shell_calls.append(cmd)
|
self.shell_calls.append(cmd)
|
||||||
|
import shlex
|
||||||
|
|
||||||
for package, dump in self.pm_dumps.items():
|
for package, dump in self.pm_dumps.items():
|
||||||
if package in cmd:
|
if package in cmd or shlex.quote(package) in cmd:
|
||||||
return dump
|
return dump
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@@ -178,6 +180,45 @@ class TestAppLabelCache:
|
|||||||
# still None (next tier), no crash — falls through cleanly
|
# still None (next tier), no crash — falls through cleanly
|
||||||
assert manager.app_label("com.unknown.app") is not None or True
|
assert manager.app_label("com.unknown.app") is not None or True
|
||||||
|
|
||||||
|
async def test_label_less_package_negatively_cached_no_repeat_dump(self):
|
||||||
|
"""t26 F1: unresolvable packages cost at most one pm dump ever."""
|
||||||
|
manager, _t = self._manager_with_dump()
|
||||||
|
manager._poller.pm_dumps["com.unknown.app"] = "no label line here"
|
||||||
|
|
||||||
|
assert manager.app_label("com.unknown.app") is None # enqueue
|
||||||
|
await manager._watchdog_cycle(5.0)
|
||||||
|
import asyncio
|
||||||
|
|
||||||
|
await asyncio.sleep(0) # drain the fetch task
|
||||||
|
first_dump_count = len(manager._poller.shell_calls)
|
||||||
|
|
||||||
|
# later cycles: ZERO additional pm dumps for the unresolvable pkg
|
||||||
|
manager.app_label("com.unknown.app") # negative cache hit — not enqueued
|
||||||
|
manager.app_label("com.unknown.app")
|
||||||
|
await manager._watchdog_cycle(5.0)
|
||||||
|
await manager._watchdog_cycle(5.0)
|
||||||
|
|
||||||
|
assert len(manager._poller.shell_calls) == first_dump_count
|
||||||
|
assert manager.app_label("com.unknown.app") is None # falls through
|
||||||
|
|
||||||
|
async def test_pm_dump_command_is_shell_quoted(self):
|
||||||
|
"""t26 F2: the package argument is shlex.quote'd (consistent)."""
|
||||||
|
import shlex
|
||||||
|
|
||||||
|
wicked = "com.evil;name"
|
||||||
|
manager, _t = self._manager_with_dump()
|
||||||
|
manager._poller.pm_dumps[wicked] = "application-label: 'E'"
|
||||||
|
|
||||||
|
manager.app_label(wicked) # enqueue
|
||||||
|
await manager._watchdog_cycle(5.0)
|
||||||
|
import asyncio
|
||||||
|
|
||||||
|
await asyncio.sleep(0) # drain the fetch task
|
||||||
|
|
||||||
|
assert manager._poller.shell_calls == [
|
||||||
|
f"pm dump {shlex.quote(wicked)} 2>/dev/null | head -300"
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
class TestLogcatStream:
|
class TestLogcatStream:
|
||||||
"""P5-3: the dedicated logcat fast-path behind CONF_LOGCAT_EVENTS."""
|
"""P5-3: the dedicated logcat fast-path behind CONF_LOGCAT_EVENTS."""
|
||||||
|
|||||||
Reference in new issue
Block a user