Path: blob/master/src/packages/backend/conat/test/socket/cluster.test.ts
1712 views
/*12pnpm test `pwd`/cluster.test.ts34*/56import {7after,8delay,9before,10server,11addNodeToDefaultCluster,12createConatCluster,13once,14} from "../setup";1516beforeAll(before);1718describe("most basic possible test of creating a socket in a cluster built from scratch", () => {19let client0, client1;20it("a 2-node cluster", async () => {21const servers = Object.values(await createConatCluster(2));22client0 = servers[0].client();23client1 = servers[1].client();24});2526const SUBJECT = "xyz";27it("create socket server in node0", async () => {28const socketServer = client0.socket.listen(SUBJECT);29socketServer.on("connection", (socket) => {30socket.write("ack");31});32});3334it("connect to server", async () => {35const conn = client1.socket.connect(SUBJECT);36const [data] = await once(conn, "data");37expect(data).toBe("ack");38conn.close();39});40});4142describe("create the client first, then the server and see it works", () => {43let client0, client1;44it("a 2-node cluster", async () => {45const servers = Object.values(await createConatCluster(2));46client0 = servers[0].client();47client1 = servers[1].client();48});4950const SUBJECT = "xyz";5152it("connect to server BEFORE creating server, then make server and confirm connection works -- this shows tests a potential race condition", async () => {53const conn = client1.socket.connect(SUBJECT);54const dataPromise = once(conn, "data");5556await delay(250);57const socketServer = client0.socket.listen(SUBJECT);58socketServer.on("connection", (socket) => {59socket.write("ack");60});6162const [data] = await dataPromise;63expect(data).toBe("ack");64conn.close();65});66});6768describe("creating sockets in a cluster", () => {69let client0, server1, client1;70it("add another node", async () => {71client0 = server.client();72server1 = await addNodeToDefaultCluster();73client1 = server1.client();74expect(server1.clusterTopology()).toEqual(server.clusterTopology());75});7677let socketServer, socketServer2;78it("create socket with server in node0 and test connecting", async () => {79socketServer = client0.socket.listen("foo.com.*");80socketServer.on("connection", (socket) => {81const x = socket.subject.split(".").slice(0, 3).join(".");82socket.write(`hello from ${x}`);83});84socketServer2 = client0.socket.listen("cocalc.edu");85socketServer2.on("connection", (socket) => {86socket.write("hello from cocalc.edu");87});88});8990it("connects from client connected to node1", async () => {91const conn = client0.socket.connect("foo.com.0");92const [data] = await once(conn, "data");93expect(data).toBe("hello from foo.com.0");94conn.close();95// ensure fully closed (better test of other what's below)96await delay(250);97});9899it("connects from client connected to node1 (do it again)", async () => {100const conn = client1.socket.connect("cocalc.edu");101const [data] = await once(conn, "data");102expect(data).toBe("hello from cocalc.edu");103conn.close();104});105106it("connects from client connected to node1 (do it again, again)", async () => {107const conn = client1.socket.connect("cocalc.edu");108const [data] = await once(conn, "data");109expect(data).toBe("hello from cocalc.edu");110conn.close();111});112113const count = 5;114it(`creates ${count} sockets at once from client connected to node1`, async () => {115const conns: any[] = [];116for (let i = 0; i < count; i++) {117const conn = client1.socket.connect(`foo.com.${i}`);118conns.push(conn);119const [data] = await once(conn, "data");120expect(data).toBe(`hello from foo.com.${i}`);121}122for (const conn of conns) {123conn.close();124}125});126});127128afterAll(after);129130131