This commit is contained in:
eric
2026-05-19 07:49:56 +00:00
parent 78e1308063
commit 585bcd9500
112 changed files with 61939 additions and 23 deletions

View File

@@ -25,6 +25,7 @@ class NekoConfigTests(unittest.TestCase):
self.assertIn("--start-maximized", script)
self.assertIn("--disable-background-mode", script)
self.assertNotIn("--disable-background-networking", script)
self.assertNotIn("--disable-sync", script)
self.assertNotIn("--disable-extensions", script)
self.assertIn('ui["developer_mode"] = True', script)
self.assertIn('"Local State"', script)
@@ -78,6 +79,17 @@ class NekoConfigTests(unittest.TestCase):
self.assertIn("./${NEKO_BROWSER_SUPERVISOR_CONF}:/etc/neko/supervisord/${NEKO_BROWSER_SUPERVISOR_CONF}:ro", compose)
self.assertIn("./browser-launch.sh:/etc/neko/browser-launch.sh:ro", compose)
self.assertIn("./provisioning:/var/www/provisioning:ro", compose)
self.assertIn('NEKO_MANAGED_POLICIES: "${NEKO_MANAGED_POLICIES:-0}"', compose)
self.assertIn("./no-managed-policies:/etc/chromium/policies/managed:ro", compose)
self.assertIn("./no-managed-policies:/etc/chromium-browser/policies/managed:ro", compose)
self.assertIn("./no-managed-policies:/etc/opt/chrome/policies/managed:ro", compose)
self.assertIn("./external-extensions:/opt/google/chrome/extensions:ro", compose)
self.assertIn("./external-extensions:/usr/share/chromium/extensions:ro", compose)
self.assertIn("./external-extensions:/usr/share/chromium-browser/extensions:ro", compose)
self.assertIn("./tampermonkey-seed:/etc/neko/tampermonkey-seed:ro", compose)
self.assertIn("./youtube-auto-dismiss-extension:/etc/neko/youtube-auto-dismiss-extension:ro", compose)
self.assertNotIn("./policies:/etc/chromium/policies/managed", compose)
self.assertNotIn("./policies:/etc/opt/chrome/policies/managed", compose)
self.assertIn("container_name: live-neko-1", compose)
self.assertIn("container_name: live-neko-2", compose)
self.assertIn("container_name: live-neko-3", compose)
@@ -113,6 +125,23 @@ class NekoConfigTests(unittest.TestCase):
self.assertIn('"52303:52303/tcp"', rendered)
self.assertIn('"52400-52499:52400-52499/udp"', rendered)
self.assertIn(f'"{tmp}/profile-4:/home/neko/.config/google-chrome"', rendered)
self.assertIn('NEKO_MANAGED_POLICIES: "0"', rendered)
self.assertIn('"./no-managed-policies:/etc/chromium/policies/managed:ro"', rendered)
self.assertIn('"./no-managed-policies:/etc/chromium-browser/policies/managed:ro"', rendered)
self.assertIn('"./no-managed-policies:/etc/opt/chrome/policies/managed:ro"', rendered)
self.assertIn('"./external-extensions:/opt/google/chrome/extensions:ro"', rendered)
self.assertIn('"./external-extensions:/usr/share/chromium/extensions:ro"', rendered)
self.assertIn('"./external-extensions:/usr/share/chromium-browser/extensions:ro"', rendered)
self.assertIn('"./tampermonkey-seed:/etc/neko/tampermonkey-seed:ro"', rendered)
self.assertIn('"./youtube-auto-dismiss-extension:/etc/neko/youtube-auto-dismiss-extension:ro"', rendered)
self.assertNotIn('"./policies:/etc/chromium/policies/managed:ro"', rendered)
self.assertNotIn('"./policies:/etc/opt/chrome/policies/managed:ro"', rendered)
with patch.dict(os.environ, {"NEKO_MANAGED_POLICIES": "1"}, clear=False):
managed_rendered = module.render(2)
self.assertIn('"./policies:/etc/chromium/policies/managed:ro"', managed_rendered)
self.assertIn('"./policies:/etc/chromium-browser/policies/managed:ro"', managed_rendered)
self.assertIn('"./policies:/etc/opt/chrome/policies/managed:ro"', managed_rendered)
def test_neko_runtime_scripts_use_generated_compose(self) -> None:
service_ctl = (ROOT / "scripts" / "linux" / "service_ctl.sh").read_text(encoding="utf-8")
@@ -123,6 +152,53 @@ class NekoConfigTests(unittest.TestCase):
self.assertIn("docker-compose.generated.yml", script)
self.assertIn("compose_file=\"$(render_neko_compose_file)\"", script)
self.assertIn("NEKO_MAX_INSTANCE_COUNT:-64", script)
self.assertIn("NEKO_MANAGED_POLICIES", script)
self.assertIn("find_neko_tampermonkey_seed_profile()", script)
self.assertIn("services/neko/tampermonkey-seed", script)
self.assertIn("sync_neko_tampermonkey_preferences()", script)
self.assertIn("neko_managed_policies_enabled()", script)
def test_tampermonkey_external_extension_seed_is_available_without_managed_policy(self) -> None:
external = json.loads(
(ROOT / "services" / "neko" / "external-extensions" / "dhdgffkkebhmkfjojejmpbldmpobfkfo.json").read_text(
encoding="utf-8"
)
)
self.assertEqual(external["external_update_url"], "https://clients2.google.com/service/update2/crx")
seed = ROOT / "services" / "neko" / "tampermonkey-seed" / "Default" / "Local Extension Settings" / "dhdgffkkebhmkfjojejmpbldmpobfkfo"
self.assertTrue(seed.is_dir())
seed_text = "\n".join(path.read_text(encoding="utf-8", errors="ignore") for path in seed.glob("*") if path.is_file())
self.assertIn("YouTube Studio Auto Dismiss", seed_text)
seed_extension = (
ROOT
/ "services"
/ "neko"
/ "tampermonkey-seed"
/ "Default"
/ "Extensions"
/ "dhdgffkkebhmkfjojejmpbldmpobfkfo"
/ "5.5.0_0"
/ "manifest.json"
)
self.assertTrue(seed_extension.is_file())
seed_preferences = json.loads(
(ROOT / "services" / "neko" / "tampermonkey-seed" / "Default" / "Preferences").read_text(encoding="utf-8")
)
self.assertEqual(seed_preferences["extensions"]["settings"]["dhdgffkkebhmkfjojejmpbldmpobfkfo"]["state"], 1)
launch = (ROOT / "services" / "neko" / "browser-launch.sh").read_text(encoding="utf-8")
self.assertIn("ensure_tampermonkey_seed", launch)
self.assertIn("sync_tampermonkey_preferences", launch)
self.assertIn("find_tampermonkey_extension_dir", launch)
self.assertIn("find_youtube_auto_dismiss_extension_dir", launch)
self.assertIn("--load-extension=$load_extension_dirs", launch)
self.assertIn("/etc/neko/tampermonkey-seed", launch)
self.assertIn("rm -rf \"$profile_dir/Default/Managed Extension Settings/$ext_id\"", launch)
dismiss_manifest = ROOT / "services" / "neko" / "youtube-auto-dismiss-extension" / "manifest.json"
self.assertTrue(dismiss_manifest.is_file())
dismiss_script = (ROOT / "services" / "neko" / "youtube-auto-dismiss-extension" / "youtube-studio-auto-dismiss.js").read_text(
encoding="utf-8"
)
self.assertIn('text === "Dismiss"', dismiss_script)
def test_supervisor_uses_browser_launch_script(self) -> None:
chrome = (ROOT / "services" / "neko" / "google-chrome.conf").read_text(encoding="utf-8")

View File

@@ -89,6 +89,8 @@ class VerifyLocalInstallTests(unittest.TestCase):
def fake_docker_exec(container: str, command: str, *, timeout: float = 8.0):
if "supervisorctl status google-chrome" in command:
return 0, "google-chrome RUNNING pid 8", ""
if "policies/managed" in command and "-name '*.json'" in command:
return 0, "", ""
if "supervisorctl status tampermonkey-provisioning" in command:
return 0, "tampermonkey-provisioning RUNNING pid 9", ""
if "tampermonkey-provisioning.json" in command:
@@ -126,6 +128,7 @@ class VerifyLocalInstallTests(unittest.TestCase):
"neko_ip_watch_service",
"youtube_pro_neko_capacity",
"neko_1_browser",
"neko_1_personal_policy_mode",
"neko_1_tm_payload",
"neko_1_tm_storage",
"android_devices",
@@ -134,6 +137,66 @@ class VerifyLocalInstallTests(unittest.TestCase):
):
self.assertIn(check_id, ids)
def test_neko_personal_policy_mode_rejects_managed_policy_json(self) -> None:
checks: list[dict[str, object]] = []
def fake_docker_exec(container: str, command: str, *, timeout: float = 8.0):
if "supervisorctl status google-chrome" in command:
return 0, "google-chrome RUNNING pid 8", ""
if "policies/managed" in command and "-name '*.json'" in command:
return 0, "/etc/opt/chrome/policies/managed/policies.json\n", ""
if "supervisorctl status tampermonkey-provisioning" in command:
return 0, "tampermonkey-provisioning RUNNING pid 9", ""
if "tampermonkey-provisioning.json" in command:
return 0, "", ""
if "grep -R -a -l" in command:
return 1, "", ""
self.fail(f"unexpected docker exec: {container} {command}")
with patch.object(verify_local_install, "docker_ps_names", return_value=(True, ["live-neko-1", "live-neko-2"], "")):
with patch.object(verify_local_install, "systemd_active", return_value=(True, "active")):
with patch.object(verify_local_install, "docker_exec", side_effect=fake_docker_exec):
verify_local_install.verify_neko(
checks,
{"ENABLE_NEKO": "1", "NEKO_INSTANCE_COUNT": "2", "NEKO_MANAGED_POLICIES": "0"},
timeout=5.0,
)
report = verify_local_install.summarize(checks)
self.assertFalse(report["ready"])
self.assertEqual(report["failing_checks"][0]["id"], "neko_1_personal_policy_mode")
tm_storage = next(item for item in checks if item["id"] == "neko_1_tm_storage")
self.assertTrue(tm_storage["required"])
def test_neko_managed_policy_mode_allows_policy_json_and_requires_tm_storage(self) -> None:
checks: list[dict[str, object]] = []
def fake_docker_exec(container: str, command: str, *, timeout: float = 8.0):
if "supervisorctl status google-chrome" in command:
return 0, "google-chrome RUNNING pid 8", ""
if "policies/managed" in command and "-name '*.json'" in command:
return 0, "/etc/opt/chrome/policies/managed/policies.json\n", ""
if "supervisorctl status tampermonkey-provisioning" in command:
return 0, "tampermonkey-provisioning RUNNING pid 9", ""
if "tampermonkey-provisioning.json" in command:
return 0, "", ""
if "grep -R -a -l" in command:
return 1, "", ""
self.fail(f"unexpected docker exec: {container} {command}")
with patch.object(verify_local_install, "docker_ps_names", return_value=(True, ["live-neko-1", "live-neko-2"], "")):
with patch.object(verify_local_install, "systemd_active", return_value=(True, "active")):
with patch.object(verify_local_install, "docker_exec", side_effect=fake_docker_exec):
verify_local_install.verify_neko(
checks,
{"ENABLE_NEKO": "1", "NEKO_INSTANCE_COUNT": "2", "NEKO_MANAGED_POLICIES": "1"},
timeout=5.0,
)
report = verify_local_install.summarize(checks)
self.assertFalse(report["ready"])
self.assertEqual(report["failing_checks"][0]["id"], "neko_1_tm_storage")
def test_android_endpoint_without_devices_is_not_a_required_install_failure(self) -> None:
checks: list[dict[str, object]] = []
with patch.object(