wire protocol is generated now instead of being hard coded with versioning for commands.
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
import { describe, expect, test } from "bun:test";
|
||||
import {
|
||||
getCommandCompatibility,
|
||||
getNegotiatedCommandVersions,
|
||||
requireCommandVersion,
|
||||
sanitizeCommandVersionRanges,
|
||||
versionCommandForClient,
|
||||
} from "./command-compatibility";
|
||||
|
||||
describe("command version negotiation", () => {
|
||||
test("sanitizes advertised ranges and ignores unknown commands", () => {
|
||||
expect(sanitizeCommandVersionRanges({
|
||||
process_list: { min: 1, max: 3 },
|
||||
desktop_start: { min: 3, max: 2 },
|
||||
not_a_command: { min: 1, max: 1 },
|
||||
})).toEqual({
|
||||
process_list: { min: 1, max: 3 },
|
||||
});
|
||||
});
|
||||
|
||||
test("treats pre-3.0 agents as v1 for backward compatibility", () => {
|
||||
expect(getCommandCompatibility({}, "process_list")).toEqual({
|
||||
supported: true,
|
||||
version: 1,
|
||||
server: { min: 1, max: 1 },
|
||||
agent: { min: 1, max: 1 },
|
||||
legacyAssumption: true,
|
||||
});
|
||||
});
|
||||
|
||||
test("selects the highest shared version", () => {
|
||||
const client = {
|
||||
commandVersions: {
|
||||
process_list: { min: 1, max: 3 },
|
||||
},
|
||||
};
|
||||
expect(requireCommandVersion(client, "process_list")).toBe(1);
|
||||
expect(getNegotiatedCommandVersions(client)).toEqual({ process_list: 1 });
|
||||
expect(versionCommandForClient(client, {
|
||||
type: "command",
|
||||
commandType: "process_list",
|
||||
id: "command-123",
|
||||
})).toMatchObject({
|
||||
commandType: "process_list",
|
||||
commandVersion: 1,
|
||||
});
|
||||
});
|
||||
|
||||
test("strictly reports missing commands and non-overlapping versions", () => {
|
||||
expect(getCommandCompatibility(
|
||||
{ commandVersions: {} },
|
||||
"process_list",
|
||||
)).toMatchObject({
|
||||
supported: false,
|
||||
reason: "agent_missing_command",
|
||||
});
|
||||
|
||||
const incompatible = {
|
||||
commandVersions: {
|
||||
process_list: { min: 2, max: 3 },
|
||||
},
|
||||
};
|
||||
expect(getCommandCompatibility(incompatible, "process_list")).toMatchObject({
|
||||
supported: false,
|
||||
reason: "no_common_version",
|
||||
});
|
||||
expect(() => requireCommandVersion(incompatible, "process_list")).toThrow(
|
||||
"no shared version",
|
||||
);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user