Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/cocalc
Path: blob/master/src/packages/backend/conat/test/sync/cluster.test.ts
1712 views
1
/*
2
3
pnpm test `pwd`/cluster.test.ts
4
5
*/
6
7
import {
8
after,
9
before,
10
server,
11
addNodeToDefaultCluster,
12
wait,
13
client,
14
waitForConsistentState,
15
} from "../setup";
16
17
beforeAll(before);
18
19
jest.setTimeout(15000);
20
21
describe("using various sync data structures with a cluster", () => {
22
let dstream;
23
it("creates a dstream", async () => {
24
dstream = await client.sync.dstream({ name: "foo" });
25
expect(dstream.getAll()).toEqual([]);
26
27
dstream.publish("hi");
28
await dstream.save();
29
});
30
31
let server2, client2;
32
it("creates another node", async () => {
33
server2 = await addNodeToDefaultCluster();
34
expect(server2.options.port).not.toBe(server.options.port);
35
client2 = server2.client();
36
expect(server2.options.port).not.toBe(server.options.port);
37
expect(server2.clusterTopology()).toEqual(server.clusterTopology());
38
expect(new Set(server2.clusterAddresses())).toEqual(
39
new Set(server.clusterAddresses()),
40
);
41
});
42
43
it("wait until both servers in the cluster have the same state", async () => {
44
await waitForConsistentState([server, server2], 15000);
45
});
46
47
let dstream2;
48
it("second client connected to the same dstream, and observe it works", async () => {
49
dstream2 = await client2.sync.dstream({ name: "foo" });
50
expect(dstream === dstream2).toBe(false);
51
expect(dstream.opts.client.id).not.toEqual(dstream2.opts.client.id);
52
expect(dstream2.getAll()).toEqual(["hi"]);
53
54
dstream2.publish("world");
55
expect(dstream2.getAll()).toEqual(["hi", "world"]);
56
// not instant
57
expect(dstream.getAll()).toEqual(["hi"]);
58
await wait({ until: () => dstream.length == 2 });
59
60
dstream.publish("!");
61
expect(dstream.getAll()).toEqual(["hi", "world", "!"]);
62
expect(dstream2.getAll()).toEqual(["hi", "world"]);
63
await wait({ until: () => dstream2.length == 3 });
64
expect(dstream2.getAll()).toEqual(["hi", "world", "!"]);
65
});
66
67
const count = 3;
68
it(`create ${count} dstreams`, async () => {
69
const v: any[] = [];
70
for (let i = 0; i < count; i++) {
71
const d = await client2.sync.dstream({ name: `foo-${i}` });
72
d.push(i);
73
await d.save();
74
v.push(d);
75
}
76
for (let i = 0; i < count; i++) {
77
v[i].close();
78
}
79
for (let i = 0; i < count; i++) {
80
const d = await client.sync.dstream({ name: `foo-${i}` });
81
expect(d.getAll()).toEqual([i]);
82
d.close();
83
}
84
});
85
86
it("test making dkv (key value store)", async () => {
87
await client2.sync.dkv({ name: "unrelated" });
88
});
89
90
let dkv, dkv2;
91
it("test using a dkv (key value store)", async () => {
92
dkv2 = await client2.sync.dkv({ name: "cc" });
93
dkv = await client.sync.dkv({ name: "cc" });
94
expect(dkv.getAll()).toEqual({});
95
expect(dkv2.getAll()).toEqual({});
96
expect(dkv === dkv2).toBe(false);
97
expect(dkv.opts.client.id).not.toEqual(dkv2.opts.client.id);
98
});
99
});
100
101
afterAll(after);
102
103