From d51255108db95f5d89ae8502f503935ee972cfc5 Mon Sep 17 00:00:00 2001 From: Aadit Kamat <30969577+aaditkamat@users.noreply.github.com> Date: Sun, 25 Feb 2024 09:03:21 -0500 Subject: [PATCH 1/3] Update socket tests --- server/src/tests/socketio.test.ts | 314 ++++++++++++++++-------------- 1 file changed, 166 insertions(+), 148 deletions(-) diff --git a/server/src/tests/socketio.test.ts b/server/src/tests/socketio.test.ts index bd68d1fa8..4b94c5099 100644 --- a/server/src/tests/socketio.test.ts +++ b/server/src/tests/socketio.test.ts @@ -1,169 +1,187 @@ // Testing for socket.io endpoints -import { io as io } from 'socket.io-client' -import { v4 as uuidv4 } from 'uuid'; +import { createServer } from "node:http"; +import { io as ioc, type Socket as ClientSocket } from "socket.io-client"; +import { Server, type Socket as ServerSocket } from "socket.io"; +import { v4 as uuidv4 } from "uuid"; -const socket_test_client_port = process.env.socket_test_client_port; -console.log("Socket clients are listening on port", socket_test_client_port) const SECONDS_MULTIPLIER = 1000; jest.setTimeout(60 * SECONDS_MULTIPLIER); -const numClients = 100; // Adjust the number of clients as needed. Do not go over 300 to prevent being blocked by Firebase. - -const sleep = (ms) => { - return new Promise(resolve => setTimeout(resolve, ms)); -}; - -const connectClients = async () => { - const clients = []; - - for (let i = 0; i < numClients; i++) { - const client = io(`http://localhost:${socket_test_client_port}`); - await new Promise(resolve => client.on('connect', resolve)); // Why is this an error? IDK - clients.push(client); - } - - return clients; -}; +describe("socket-load-tests", () => { + let clientSockets = []; + let httpServer; + let httpServerAddr; + let ioServer; + const numClients = 100; // Adjust the number of clients as needed. Do not go over 300 to prevent being blocked by Firebase. + + beforeAll((done) => { + httpServer = createServer().listen(); + httpServerAddr = httpServer.address(); + ioServer = new Server(httpServer); + for (let i = 0; i < numClients; i++) { + let clientSocket = ioc( + `http://[${httpServerAddr.address}]:${httpServerAddr.port}`, + { + forceNew: true, + reconnectionDelay: 0, + transports: ["websocket"], + } + ); + clientSocket.on("connect", () => { + done(); + }); + clientSockets.push(clientSocket); + } + done(); + }); -const disconnectClients = (clients) => { - clients.forEach(client => client.disconnect()); -}; + afterAll((done) => { + ioServer.close(); + httpServer.close(); + for (let i = 0; i < numClients; i++) { + clientSockets[i].disconnect(); + } + done(); + }); -describe('socket-load-tests', () => { - let clients; + test("Simultaneous Ping", (done) => { + ioServer.on("ping", (cb) => { + cb("pong"); + }); + for (let i = 0; i < numClients; i++) { + clientSockets[i].emit("ping", (response) => { + expect(response).toBe("pong"); + }); + } + done(); + }); - beforeAll(async () => { - clients = await connectClients(); + test("Simultaneous Message", async () => { + ioServer.on("ping", (cb) => { + cb("pong"); + }); + for (let i = 0; i < numClients; i++) { + clientSockets[i].emit( + "message", + { + userId: "userId", + msgId: uuidv4(), + msgContent: `This is message ${i}`, + lat: 10, + lon: 10, + timeSent: 99999999, + }, + (response) => { + expect(response).toBe("message recieved"); + } + ); + } }); +}); - afterAll(() => { - disconnectClients(clients); +describe("socket-tests", () => { + let clientSockets = []; + let httpServer; + let httpServerAddr; + let ioServer; + const numClients = 5; + + beforeAll((done) => { + httpServer = createServer().listen(); + httpServerAddr = httpServer.address(); + ioServer = new Server(httpServer); + for (let i = 0; i < numClients; i++) { + let clientSocket = ioc( + `http://[${httpServerAddr.address}]:${httpServerAddr.port}`, + { + reconnectionDelay: 0, + forceNew: true, + transports: ["websocket"], + } + ); + clientSocket.on("connect", () => { + done(); + }); + clientSockets.push(clientSocket); + } + done(); }); - test('Simultaneous Ping', async () => { - const pingPromises = clients.map(client => new Promise(resolve => client.emit('ping', resolve))); - const responses = await Promise.all(pingPromises); + afterAll((done) => { + ioServer.close(); + httpServer.close(); + for (let i = 0; i < numClients; i++) { + clientSockets[i].disconnect(); + } + done(); + }); - responses.forEach(response => { - expect(response).toBe('pong'); + test("Ping", (done) => { + ioServer.on("ping", (cb) => { + cb("pong"); }); + clientSockets[0].emit("ping", (response) => { + expect(response).toBe("pong"); + }); + done(); }); - test('Simultaneous Message', async () => { - let count = 0; - const messagePromises = clients.map(client => { - return new Promise(async resolve => { - client.emit('message', { userId: "userId", msgId: uuidv4(), msgContent: `This is message ${count}`, lat: 10, lon: 10, timeSent: 99999999 }, resolve); - count++; - await sleep(200) - }); + test("Send message", (done) => { + ioServer.on("ping", (cb) => { + cb("pong"); }); - - const responses = await Promise.all(messagePromises); - responses.forEach(response => { - expect(response).toBe('message recieved'); + const msgObject = { + userId: "userId", + msgId: "hiii 33 :3", + msgContent: "messageContent", + lat: 10, + lon: 10, + timeSent: 99999999, + }; + clientSockets[0].emit("message", msgObject, (response) => { + expect(response).toBe("message recieved"); }); - }) -}); - -describe("socket-tests", () => { - let user1, user2, user3, user4, user5 - let userList = [user1, user2, user3, user4, user5] - let user2Id - - beforeAll((done) => { - user1 = io(`http://localhost:${socket_test_client_port}`) - user1.on('connect', done) - user2 = io(`http://localhost:${socket_test_client_port}`) - user2.on('connect', done) - user3 = io(`http://localhost:${socket_test_client_port}`) - user3.on('connect', done) - user4 = io(`http://localhost:${socket_test_client_port}`) - user4.on('connect', done) - user5 = io(`http://localhost:${socket_test_client_port}`) - user5.on('connect', done) - }) + done(); + }); - afterAll(() => { - user1.disconnect() - user2.disconnect() - user3.disconnect() - user4.disconnect() - user5.disconnect() - }) + test("Update locations", (done) => { + const userCoords = [ + { lat: 29.64888, lon: -82.3442 }, // Turlington Hall pin on Google Maps + { lat: 29.64881, lon: -82.34429 }, // 8.65 meters SW of user 1 + { lat: 29.64881, lon: -82.34429 }, // 8.65 meters SW of user 1 + { lat: 29.64881, lon: -82.34429 }, // 8.65 meters SW of user 1 + { lat: 29.64881, lon: -82.34429 }, // 8.65 meters SW of user 1 + ]; + + for (let i = 0; i < userCoords.length; i++) { + clientSockets[i].emit("updateLocation", userCoords[0], (response) => { + expect(response).toBe("location updated"); + }); + } + done(); + }); - test('Ping', (done) => { - user1.emit('ping', (response) => { - expect(response).toBe('pong') - done() - }) - }) - test('Send message', (done) => { - const msgObject = { - userId: "userId", - msgId: "hiii 33 :3", - msgContent: "messageContent", - lat: 10, - lon: 10, - timeSent: 99999999 - } - user1.emit('message', msgObject, (response) => { - expect(response).toBe('message recieved') - done() - }) - }) - test('Update locations', (done) => { - const user1Coords = { lat: 29.64888, lon: -82.34420 } // Turlington Hall pin on Google Maps - const user2Coords = { lat: 29.64881, lon: -82.34429 } // 8.65 meters SW of user 1 - const user3Coords = { lat: 29.64881, lon: -82.34429 } // 8.65 meters SW of user 1 - const user4Coords = { lat: 29.64881, lon: -82.34429 } // 8.65 meters SW of user 1 - const user5Coords = { lat: 29.64881, lon: -82.34429 } // 8.65 meters SW of user 1 - user1.emit('updateLocation', user1Coords, (response) => { - expect(response).toBe("location updated") - }) - user2.emit('updateLocation', user2Coords, (response) => { - expect(response).toBe("location updated") - }) - user3.emit('updateLocation', user3Coords, (response) => { - expect(response).toBe("location updated") - }) - user4.emit('updateLocation', user4Coords, (response) => { - expect(response).toBe("location updated") - }) - user5.emit('updateLocation', user5Coords, (response) => { - expect(response).toBe("location updated") - }) - done() - }) - test('Send message to user', async (done) => { - const user2Coords = { lat: 29.64881, lon: -82.34429 } // 8.65 meters SW of user 1 - const user2Message = { - userId: user2.id, - msgId: "testid", - msgContent: "omggg hi!!!! :3", - lat: user2Coords.lat, - lon: user2Coords.lon, - timeSent: 999999 - } - user1.on('message', (message) => { - console.log(`User 2 recieved message ${message}`) - expect(message).toBe("omggg hi!!!! :3") - }) - user3.on('message', (message) => { - console.log(`User 2 recieved message ${message}`) - expect(message).toBe("omggg hi!!!! :3") - }) - user4.on('message', (message) => { - console.log(`User 2 recieved message ${message}`) - expect(message).toBe("omggg hi!!!! :3") - }) - user5.on('message', (message) => { - console.log(`User 2 recieved message ${message}`) - expect(message).toBe("omggg hi!!!! :3") - }) - await sleep(200) // use sleep if test case doesn't work for some reason - user2.emit('message', user2Message) - }) - // TODO: Find a way for expect() to be verified after messages return. -}) + test("Send message to user", (done) => { + const user2Coords = { lat: 29.64881, lon: -82.34429 }; // 8.65 meters SW of user 1 + const user2Message = { + userId: clientSockets[1].id, + msgId: "testid", + msgContent: "omggg hi!!!! :3", + lat: user2Coords.lat, + lon: user2Coords.lon, + timeSent: 999999, + }; + for (let i = 0; i < clientSockets.length; i++) { + if (i != 1) { + clientSockets[i].on("message", (message) => { + console.log(`User 2 recieved message ${message}`); + expect(message).toBe("omggg hi!!!! :3"); + }); + } + } + clientSockets[1].emit("message", user2Message); + done(); + }); + // TODO: Find a way for expect() to be verified after messages return. +}); From 57ddcf12474d087892e8e39de6af9f401c9370a1 Mon Sep 17 00:00:00 2001 From: Aadit Kamat <30969577+aaditkamat@users.noreply.github.com> Date: Sun, 25 Feb 2024 09:23:28 -0500 Subject: [PATCH 2/3] Remove unused type --- server/src/tests/socketio.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/tests/socketio.test.ts b/server/src/tests/socketio.test.ts index 4b94c5099..0a1896d40 100644 --- a/server/src/tests/socketio.test.ts +++ b/server/src/tests/socketio.test.ts @@ -1,8 +1,8 @@ // Testing for socket.io endpoints import { createServer } from "node:http"; -import { io as ioc, type Socket as ClientSocket } from "socket.io-client"; -import { Server, type Socket as ServerSocket } from "socket.io"; +import { io as ioc } from "socket.io-client"; +import { Server } from "socket.io"; import { v4 as uuidv4 } from "uuid"; const SECONDS_MULTIPLIER = 1000; From 6874856e8325eaab9449cc43ec652fefa3c7a720 Mon Sep 17 00:00:00 2001 From: Phoenix <71522316+h1divp@users.noreply.github.com> Date: Sun, 25 Feb 2024 21:49:07 -0500 Subject: [PATCH 3/3] Update comment in socketio.test.ts --- server/src/tests/socketio.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/src/tests/socketio.test.ts b/server/src/tests/socketio.test.ts index 0a1896d40..51dc456f7 100644 --- a/server/src/tests/socketio.test.ts +++ b/server/src/tests/socketio.test.ts @@ -182,6 +182,7 @@ describe("socket-tests", () => { } clientSockets[1].emit("message", user2Message); done(); + // TODO: This test case will return true, but the sent message is actually never verified. + // The real verification of this message to lead to a pass/fail should be worked on. }); - // TODO: Find a way for expect() to be verified after messages return. });