

















@@ -0,0 +1,98 @@
1+import { createTestPluginApi } from "openclaw/plugin-sdk/plugin-test-api";
2+import { describe, expect, it, vi } from "vitest";
3+4+const mocks = vi.hoisted(() => ({
5+advertiserModuleLoaded: vi.fn(),
6+runtimeModuleLoaded: vi.fn(),
7+startGatewayBonjourAdvertiser: vi.fn(async () => ({ stop: vi.fn() })),
8+registerUncaughtExceptionHandler: vi.fn(),
9+registerUnhandledRejectionHandler: vi.fn(),
10+}));
11+12+vi.mock("./src/advertiser.js", () => {
13+mocks.advertiserModuleLoaded();
14+return {
15+startGatewayBonjourAdvertiser: mocks.startGatewayBonjourAdvertiser,
16+};
17+});
18+19+vi.mock("openclaw/plugin-sdk/runtime", () => {
20+mocks.runtimeModuleLoaded();
21+return {
22+registerUncaughtExceptionHandler: mocks.registerUncaughtExceptionHandler,
23+registerUnhandledRejectionHandler: mocks.registerUnhandledRejectionHandler,
24+};
25+});
26+27+const { default: bonjourPlugin } = await import("./index.js");
28+29+describe("bonjour plugin entry", () => {
30+it("lazy-loads advertiser runtime when gateway discovery advertises", async () => {
31+let discoveryService:
32+| Parameters<ReturnType<typeof createTestPluginApi>["registerGatewayDiscoveryService"]>[0]
33+| undefined;
34+const logger = {
35+info: vi.fn(),
36+warn: vi.fn(),
37+error: vi.fn(),
38+debug: vi.fn(),
39+};
40+const api = createTestPluginApi({
41+ logger,
42+registerGatewayDiscoveryService(service) {
43+discoveryService = service;
44+},
45+});
46+47+expect(mocks.advertiserModuleLoaded).not.toHaveBeenCalled();
48+expect(mocks.runtimeModuleLoaded).not.toHaveBeenCalled();
49+50+bonjourPlugin.register(api);
51+52+expect(discoveryService?.id).toBe("bonjour");
53+expect(mocks.advertiserModuleLoaded).not.toHaveBeenCalled();
54+expect(mocks.runtimeModuleLoaded).not.toHaveBeenCalled();
55+56+if (!discoveryService) {
57+throw new Error("expected bonjour plugin to register a discovery service");
58+}
59+60+const stop = vi.fn();
61+mocks.startGatewayBonjourAdvertiser.mockResolvedValueOnce({ stop });
62+63+await expect(
64+discoveryService.advertise({
65+machineDisplayName: "Dev Box",
66+gatewayPort: 3210,
67+gatewayTlsEnabled: true,
68+gatewayTlsFingerprintSha256: "abc123",
69+canvasPort: 9876,
70+sshPort: 22,
71+tailnetDns: "dev.tailnet.ts.net",
72+cliPath: "/usr/local/bin/openclaw",
73+minimal: false,
74+}),
75+).resolves.toEqual({ stop });
76+77+expect(mocks.advertiserModuleLoaded).toHaveBeenCalledTimes(1);
78+expect(mocks.runtimeModuleLoaded).toHaveBeenCalledTimes(1);
79+expect(mocks.startGatewayBonjourAdvertiser).toHaveBeenCalledWith(
80+{
81+instanceName: "Dev Box (OpenClaw)",
82+gatewayPort: 3210,
83+gatewayTlsEnabled: true,
84+gatewayTlsFingerprintSha256: "abc123",
85+canvasPort: 9876,
86+sshPort: 22,
87+tailnetDns: "dev.tailnet.ts.net",
88+cliPath: "/usr/local/bin/openclaw",
89+minimal: false,
90+},
91+{
92+ logger,
93+registerUncaughtExceptionHandler: mocks.registerUncaughtExceptionHandler,
94+registerUnhandledRejectionHandler: mocks.registerUnhandledRejectionHandler,
95+},
96+);
97+});
98+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。