Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/cocalc
Path: blob/master/src/packages/backend/conat/test/socket/keepalive.test.ts
1712 views
1
/*
2
pnpm test ./keepalive.test.ts
3
*/
4
5
import { before, after, connect, wait } from "@cocalc/backend/conat/test/setup";
6
import { delay } from "awaiting";
7
8
beforeAll(before);
9
10
describe("test a server with a short keepalive time", () => {
11
let client,
12
server,
13
cn1,
14
cn2,
15
sockets: any[] = [];
16
17
const keepAlive = 100;
18
const keepAliveTimeout = 50;
19
20
it("creates a socket server with very short keepalive", async () => {
21
cn1 = connect();
22
server = cn1.socket.listen("keepalive-server.com", {
23
keepAlive,
24
keepAliveTimeout,
25
});
26
server.on("connection", (socket) => {
27
sockets.push(socket);
28
});
29
expect(server.keepAlive).toBe(keepAlive);
30
expect(server.keepAliveTimeout).toBe(keepAliveTimeout);
31
cn2 = connect();
32
client = cn2.socket.connect("keepalive-server.com", {
33
keepAlive: 10000,
34
keepAliveTimeout: 10000,
35
reconnection: false,
36
});
37
});
38
39
it("waits twice the keepAlive time and observes time gets updated and sockets alive", async () => {
40
await delay(2 * keepAlive);
41
await wait({ until: () => sockets[0].state == "ready" });
42
expect(sockets[0].state).toBe("ready");
43
expect(Math.abs(sockets[0].alive.last - Date.now())).toBeLessThan(
44
1.2 * (keepAlive + keepAliveTimeout),
45
);
46
});
47
48
it("breaks the client side of the socket and observes the server automatically disconnects", async () => {
49
client.sub.close();
50
await wait({ until: () => sockets[0].state == "closed" });
51
expect(sockets[0].state).toBe("closed");
52
});
53
});
54
55
describe("test a client with a short keepalive time", () => {
56
let client,
57
server,
58
cn1,
59
cn2,
60
sockets: any[] = [];
61
62
const keepAlive = 100;
63
const keepAliveTimeout = 50;
64
65
it("creates a socket server with long keepalive and client with a very short one", async () => {
66
cn1 = connect();
67
server = cn1.socket.listen("keepalive-client.com", {
68
keepAlive: 10000,
69
keepAliveTimeout: 10000,
70
});
71
server.on("connection", (socket) => {
72
sockets.push(socket);
73
});
74
cn2 = connect();
75
client = cn2.socket.connect("keepalive-client.com", {
76
keepAlive,
77
keepAliveTimeout,
78
reconnection: false,
79
});
80
expect(client.keepAlive).toBe(keepAlive);
81
expect(client.keepAliveTimeout).toBe(keepAliveTimeout);
82
});
83
84
it("waits several times the keepAlive time and observes time was updated and sockets still alive", async () => {
85
await delay(2 * keepAlive);
86
await wait({
87
until: () => client.state == "ready",
88
});
89
expect(client.state).toBe("ready");
90
expect(Math.abs(client.alive.last - Date.now())).toBeLessThan(
91
keepAlive + keepAliveTimeout + 200,
92
);
93
});
94
95
it("breaks the server side of the socket and observes the client automatically disconnects quickly", async () => {
96
// hack to make server /dev/null any command from client
97
server.handleCommandFromClient = () => {};
98
await wait({ until: () => client.state == "disconnected" });
99
expect(client.state).toBe("disconnected");
100
});
101
});
102
103
afterAll(after);
104
105