mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-05-20 15:50:51 +08:00
- 新增 JMX/Endpoint/Agent 三种 JVM 连接模式与配置归一化链路 - 支持资源浏览、变更预览、写入应用、审计记录与只读约束 - 接入 AI 结构化写入计划与诊断计划回填能力 - 新增 Agent Bridge、Arthas Tunnel、JMX Helper 诊断传输实现 - 增加诊断控制台、命令模板、输出历史与自动补全交互 - 补齐前后端契约、运行夹具与 JVM 相关回归测试
184 lines
6.1 KiB
TypeScript
184 lines
6.1 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import {
|
|
buildDefaultJVMConnectionValues,
|
|
buildJVMConnectionConfig,
|
|
hasUnsupportedJVMDiagnosticTransport,
|
|
hasUnsupportedJVMEditableModes,
|
|
normalizeEditableJVMModes,
|
|
resolveEditableJVMModeSelection,
|
|
} from "./jvmConnectionConfig";
|
|
|
|
describe("jvmConnectionConfig", () => {
|
|
it("defaults to readonly jmx mode", () => {
|
|
const values = buildDefaultJVMConnectionValues();
|
|
expect(values.type).toBe("jvm");
|
|
expect(values.jvmReadOnly).toBe(true);
|
|
expect(values.jvmAllowedModes).toEqual(["jmx"]);
|
|
expect(values.jvmPreferredMode).toBe("jmx");
|
|
expect(values.jvmDiagnosticEnabled).toBe(false);
|
|
expect(values.jvmDiagnosticTransport).toBe("agent-bridge");
|
|
expect(values.jvmDiagnosticAllowObserveCommands).toBe(true);
|
|
expect(values.jvmDiagnosticAllowTraceCommands).toBe(false);
|
|
expect(values.jvmDiagnosticAllowMutatingCommands).toBe(false);
|
|
expect(values.jvmDiagnosticTimeoutSeconds).toBe(15);
|
|
});
|
|
|
|
it("builds nested jvm config payload", () => {
|
|
const config = buildJVMConnectionConfig({
|
|
name: "Orders JVM",
|
|
type: "jvm",
|
|
host: "orders.internal",
|
|
port: 9010,
|
|
jvmReadOnly: true,
|
|
jvmAllowedModes: ["jmx", "endpoint", "agent"],
|
|
jvmPreferredMode: "agent",
|
|
jvmEnvironment: "prod",
|
|
jvmEndpointEnabled: true,
|
|
jvmEndpointBaseUrl: "https://orders.internal/manage/jvm",
|
|
jvmEndpointApiKey: "token-1",
|
|
jvmAgentEnabled: true,
|
|
jvmAgentBaseUrl: "http://127.0.0.1:19090/gonavi/agent/jvm",
|
|
jvmAgentApiKey: "agent-token",
|
|
timeout: 45,
|
|
jvmDiagnosticEnabled: true,
|
|
jvmDiagnosticTransport: "arthas-tunnel",
|
|
jvmDiagnosticBaseUrl: "https://orders.internal/diag",
|
|
jvmDiagnosticTargetId: "orders-01",
|
|
jvmDiagnosticApiKey: "diag-token",
|
|
jvmDiagnosticAllowObserveCommands: true,
|
|
jvmDiagnosticAllowTraceCommands: true,
|
|
jvmDiagnosticAllowMutatingCommands: false,
|
|
jvmDiagnosticTimeoutSeconds: 18,
|
|
});
|
|
expect(config.jvm?.preferredMode).toBe("agent");
|
|
expect(config.jvm?.endpoint?.baseUrl).toBe(
|
|
"https://orders.internal/manage/jvm",
|
|
);
|
|
expect(config.jvm?.agent?.baseUrl).toBe(
|
|
"http://127.0.0.1:19090/gonavi/agent/jvm",
|
|
);
|
|
expect(config.jvm?.diagnostic).toEqual({
|
|
enabled: true,
|
|
transport: "arthas-tunnel",
|
|
baseUrl: "https://orders.internal/diag",
|
|
targetId: "orders-01",
|
|
apiKey: "diag-token",
|
|
allowObserveCommands: true,
|
|
allowTraceCommands: true,
|
|
allowMutatingCommands: false,
|
|
timeoutSeconds: 18,
|
|
});
|
|
});
|
|
|
|
it("normalizes allowed modes and falls back preferred mode to first allowed mode", () => {
|
|
const config = buildJVMConnectionConfig({
|
|
host: "cache.internal",
|
|
port: 9010,
|
|
jvmAllowedModes: [" Endpoint ", "invalid", "JMX", "endpoint"],
|
|
jvmPreferredMode: "AGENT",
|
|
});
|
|
|
|
expect(config.jvm?.allowedModes).toEqual(["endpoint", "jmx"]);
|
|
expect(config.jvm?.preferredMode).toBe("endpoint");
|
|
expect(config.jvm?.jmx?.enabled).toBe(true);
|
|
});
|
|
|
|
it("normalizes environment and port defaults when input is invalid", () => {
|
|
const config = buildJVMConnectionConfig({
|
|
host: "orders.internal",
|
|
port: 0,
|
|
jvmJmxPort: "",
|
|
jvmEnvironment: " PROD ",
|
|
jvmReadOnly: false,
|
|
jvmAllowedModes: ["JMX"],
|
|
jvmPreferredMode: "jmx",
|
|
});
|
|
|
|
expect(config.port).toBe(9010);
|
|
expect(config.jvm?.jmx?.port).toBe(9010);
|
|
expect(config.jvm?.environment).toBe("prod");
|
|
expect(config.jvm?.readOnly).toBe(false);
|
|
});
|
|
|
|
it("keeps endpoint timeout aligned to the visible connection timeout", () => {
|
|
const config = buildJVMConnectionConfig({
|
|
host: "orders.internal",
|
|
port: 9010,
|
|
timeout: 45,
|
|
jvmEndpointTimeoutSeconds: 30,
|
|
jvmAllowedModes: ["endpoint"],
|
|
jvmPreferredMode: "endpoint",
|
|
jvmEndpointEnabled: true,
|
|
jvmEndpointBaseUrl: "https://orders.internal/manage/jvm",
|
|
jvmDiagnosticEnabled: true,
|
|
jvmDiagnosticTransport: "arthas-tunnel",
|
|
jvmDiagnosticBaseUrl: "https://orders.internal/diag",
|
|
jvmDiagnosticTargetId: "orders-01",
|
|
jvmDiagnosticApiKey: "diag-token",
|
|
jvmDiagnosticAllowObserveCommands: true,
|
|
jvmDiagnosticAllowTraceCommands: true,
|
|
jvmDiagnosticAllowMutatingCommands: false,
|
|
jvmDiagnosticTimeoutSeconds: 18,
|
|
});
|
|
|
|
expect(config.timeout).toBe(45);
|
|
expect(config.jvm?.endpoint?.timeoutSeconds).toBe(45);
|
|
expect(config.jvm?.diagnostic?.timeoutSeconds).toBe(18);
|
|
});
|
|
|
|
it("detects unsupported diagnostic transport without silently accepting it", () => {
|
|
expect(hasUnsupportedJVMDiagnosticTransport("legacy-bridge")).toBe(true);
|
|
expect(hasUnsupportedJVMDiagnosticTransport("agent-bridge")).toBe(false);
|
|
expect(hasUnsupportedJVMDiagnosticTransport("")).toBe(false);
|
|
});
|
|
|
|
it("normalizes editable JVM modes to the supported form subset", () => {
|
|
expect(
|
|
normalizeEditableJVMModes([" endpoint ", "agent", "JMX", "endpoint"]),
|
|
).toEqual(["endpoint", "agent", "jmx"]);
|
|
});
|
|
|
|
it("detects unsupported editable JVM modes without downgrading them silently", () => {
|
|
expect(
|
|
hasUnsupportedJVMEditableModes({
|
|
allowedModes: ["agent", "jmx"],
|
|
preferredMode: "agent",
|
|
}),
|
|
).toBe(false);
|
|
expect(
|
|
hasUnsupportedJVMEditableModes({
|
|
allowedModes: ["endpoint", "jmx"],
|
|
preferredMode: "otel",
|
|
}),
|
|
).toBe(true);
|
|
expect(
|
|
hasUnsupportedJVMEditableModes({
|
|
allowedModes: ["endpoint", "jmx"],
|
|
preferredMode: "endpoint",
|
|
}),
|
|
).toBe(false);
|
|
});
|
|
|
|
it("preserves preferred mode when rebuilding editable mode selection from stored config", () => {
|
|
expect(
|
|
resolveEditableJVMModeSelection({
|
|
allowedModes: [],
|
|
preferredMode: "agent",
|
|
}),
|
|
).toEqual({
|
|
allowedModes: ["agent"],
|
|
preferredMode: "agent",
|
|
});
|
|
expect(
|
|
resolveEditableJVMModeSelection({
|
|
allowedModes: ["endpoint", "jmx"],
|
|
preferredMode: "agent",
|
|
}),
|
|
).toEqual({
|
|
allowedModes: ["endpoint", "jmx"],
|
|
preferredMode: "agent",
|
|
});
|
|
});
|
|
});
|