Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
54 lines
1.7 KiB
TypeScript
54 lines
1.7 KiB
TypeScript
import { describe, expect, test } from "vitest";
|
|
|
|
import { createDockerLogStreamProcessor, decodeDockerLogs } from "./docker-log-decode";
|
|
|
|
const encodeDockerLogFrame = (streamType: number, message: string) => {
|
|
const payload = Buffer.from(message, "utf-8");
|
|
const header = Buffer.alloc(8);
|
|
header.writeUInt8(streamType, 0);
|
|
header.writeUInt32BE(payload.length, 4);
|
|
return Buffer.concat([header, payload]);
|
|
};
|
|
|
|
describe("decodeDockerLogs", () => {
|
|
test("decodes multiplexed docker log frames", () => {
|
|
const logs = Buffer.concat([encodeDockerLogFrame(1, "hello "), encodeDockerLogFrame(2, "world")]);
|
|
|
|
expect(decodeDockerLogs(logs)).toBe("hello world");
|
|
});
|
|
|
|
test("returns plain text logs unchanged", () => {
|
|
expect(decodeDockerLogs("plain text log")).toBe("plain text log");
|
|
});
|
|
|
|
test("falls back to raw buffer text for non-multiplexed output", () => {
|
|
expect(decodeDockerLogs(Buffer.from("raw docker output", "utf-8"))).toBe("raw docker output");
|
|
});
|
|
});
|
|
|
|
describe("createDockerLogStreamProcessor", () => {
|
|
test("emits decoded chunks from a stream", () => {
|
|
const messages: string[] = [];
|
|
const processChunk = createDockerLogStreamProcessor(
|
|
(data) => messages.push(data),
|
|
() => undefined,
|
|
1024,
|
|
);
|
|
|
|
const chunk = encodeDockerLogFrame(1, "streamed log");
|
|
expect(processChunk(chunk)).toBe(true);
|
|
expect(messages).toEqual(["streamed log"]);
|
|
});
|
|
|
|
test("returns false when message size exceeds limit", () => {
|
|
const processChunk = createDockerLogStreamProcessor(
|
|
() => undefined,
|
|
() => undefined,
|
|
4,
|
|
);
|
|
|
|
const chunk = encodeDockerLogFrame(1, "this message is too long");
|
|
expect(processChunk(chunk)).toBe(false);
|
|
});
|
|
});
|