Path: blob/master/src/packages/backend/conat/test/socket/keepalive.test.ts
1451 views
/*1pnpm test ./keepalive.test.ts2*/34import { before, after, connect, wait } from "@cocalc/backend/conat/test/setup";5import { delay } from "awaiting";67beforeAll(before);89describe("test a server with a short keepalive time", () => {10let client,11server,12cn1,13cn2,14sockets: any[] = [];1516const keepAlive = 100;17const keepAliveTimeout = 50;1819it("creates a socket server with very short keepalive", async () => {20cn1 = connect();21server = cn1.socket.listen("keepalive-server.com", {22keepAlive,23keepAliveTimeout,24});25server.on("connection", (socket) => {26sockets.push(socket);27});28expect(server.keepAlive).toBe(keepAlive);29expect(server.keepAliveTimeout).toBe(keepAliveTimeout);30cn2 = connect();31client = cn2.socket.connect("keepalive-server.com", {32keepAlive: 10000,33keepAliveTimeout: 10000,34reconnection: false,35});36});3738it("waits twice the keepAlive time and observes time was updated and sockets still alive", async () => {39await delay(4 * keepAlive);40expect(sockets[0].state).toBe("ready");41expect(Math.abs(sockets[0].alive.last - Date.now())).toBeLessThan(421.2 * (keepAlive + keepAliveTimeout),43);44});4546it("breaks the client side of the socket and observes the server automatically disconnects", async () => {47client.sub.close();48await delay(1.2 * (keepAlive + keepAliveTimeout));49expect(sockets[0].state).toBe("closed");50});51});5253describe("test a client with a short keepalive time", () => {54let client,55server,56cn1,57cn2,58sockets: any[] = [];5960const keepAlive = 100;61const keepAliveTimeout = 50;6263it("creates a socket server with long keepalive and client with a very short one", async () => {64cn1 = connect();65server = cn1.socket.listen("keepalive-client.com", {66keepAlive: 10000,67keepAliveTimeout: 10000,68});69server.on("connection", (socket) => {70sockets.push(socket);71});72cn2 = connect();73client = cn2.socket.connect("keepalive-client.com", {74keepAlive,75keepAliveTimeout,76reconnection: false,77});78expect(client.keepAlive).toBe(keepAlive);79expect(client.keepAliveTimeout).toBe(keepAliveTimeout);80});8182it("waits several times the keepAlive time and observes time was updated and sockets still alive", async () => {83await delay(2 * keepAlive);84await wait({85until: () => client.state == "ready",86});87expect(client.state).toBe("ready");88expect(Math.abs(client.alive.last - Date.now())).toBeLessThan(89keepAlive + keepAliveTimeout,90);91});9293it("breaks the server side of the socket and observes the client automatically disconnects quickly", async () => {94// hack to make server /dev/null any command from client95server.handleCommandFromClient = () => {};96await wait({ until: () => client.state == "disconnected" });97expect(client.state).toBe("disconnected");98});99});100101afterAll(after);102103104