Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/cocalc
Path: blob/master/src/packages/backend/conat/test/socket/cluster.test.ts
1712 views
1
/*
2
3
pnpm test `pwd`/cluster.test.ts
4
5
*/
6
7
import {
8
after,
9
delay,
10
before,
11
server,
12
addNodeToDefaultCluster,
13
createConatCluster,
14
once,
15
} from "../setup";
16
17
beforeAll(before);
18
19
describe("most basic possible test of creating a socket in a cluster built from scratch", () => {
20
let client0, client1;
21
it("a 2-node cluster", async () => {
22
const servers = Object.values(await createConatCluster(2));
23
client0 = servers[0].client();
24
client1 = servers[1].client();
25
});
26
27
const SUBJECT = "xyz";
28
it("create socket server in node0", async () => {
29
const socketServer = client0.socket.listen(SUBJECT);
30
socketServer.on("connection", (socket) => {
31
socket.write("ack");
32
});
33
});
34
35
it("connect to server", async () => {
36
const conn = client1.socket.connect(SUBJECT);
37
const [data] = await once(conn, "data");
38
expect(data).toBe("ack");
39
conn.close();
40
});
41
});
42
43
describe("create the client first, then the server and see it works", () => {
44
let client0, client1;
45
it("a 2-node cluster", async () => {
46
const servers = Object.values(await createConatCluster(2));
47
client0 = servers[0].client();
48
client1 = servers[1].client();
49
});
50
51
const SUBJECT = "xyz";
52
53
it("connect to server BEFORE creating server, then make server and confirm connection works -- this shows tests a potential race condition", async () => {
54
const conn = client1.socket.connect(SUBJECT);
55
const dataPromise = once(conn, "data");
56
57
await delay(250);
58
const socketServer = client0.socket.listen(SUBJECT);
59
socketServer.on("connection", (socket) => {
60
socket.write("ack");
61
});
62
63
const [data] = await dataPromise;
64
expect(data).toBe("ack");
65
conn.close();
66
});
67
});
68
69
describe("creating sockets in a cluster", () => {
70
let client0, server1, client1;
71
it("add another node", async () => {
72
client0 = server.client();
73
server1 = await addNodeToDefaultCluster();
74
client1 = server1.client();
75
expect(server1.clusterTopology()).toEqual(server.clusterTopology());
76
});
77
78
let socketServer, socketServer2;
79
it("create socket with server in node0 and test connecting", async () => {
80
socketServer = client0.socket.listen("foo.com.*");
81
socketServer.on("connection", (socket) => {
82
const x = socket.subject.split(".").slice(0, 3).join(".");
83
socket.write(`hello from ${x}`);
84
});
85
socketServer2 = client0.socket.listen("cocalc.edu");
86
socketServer2.on("connection", (socket) => {
87
socket.write("hello from cocalc.edu");
88
});
89
});
90
91
it("connects from client connected to node1", async () => {
92
const conn = client0.socket.connect("foo.com.0");
93
const [data] = await once(conn, "data");
94
expect(data).toBe("hello from foo.com.0");
95
conn.close();
96
// ensure fully closed (better test of other what's below)
97
await delay(250);
98
});
99
100
it("connects from client connected to node1 (do it again)", async () => {
101
const conn = client1.socket.connect("cocalc.edu");
102
const [data] = await once(conn, "data");
103
expect(data).toBe("hello from cocalc.edu");
104
conn.close();
105
});
106
107
it("connects from client connected to node1 (do it again, again)", async () => {
108
const conn = client1.socket.connect("cocalc.edu");
109
const [data] = await once(conn, "data");
110
expect(data).toBe("hello from cocalc.edu");
111
conn.close();
112
});
113
114
const count = 5;
115
it(`creates ${count} sockets at once from client connected to node1`, async () => {
116
const conns: any[] = [];
117
for (let i = 0; i < count; i++) {
118
const conn = client1.socket.connect(`foo.com.${i}`);
119
conns.push(conn);
120
const [data] = await once(conn, "data");
121
expect(data).toBe(`hello from foo.com.${i}`);
122
}
123
for (const conn of conns) {
124
conn.close();
125
}
126
});
127
});
128
129
afterAll(after);
130
131