From aa763b9d7bb4ccbc2f8bc35be994f17adcce8d09 Mon Sep 17 00:00:00 2001 From: Sostene MUNEZERO BAGIRA Date: Sun, 23 Oct 2022 18:58:34 +0200 Subject: [PATCH] refactor: tests --- Probe/Tests/Utils/PingMonitor.test.ts | 18 ++++- Probe/Utils/PingMonitor.ts | 106 +++++++++++++++----------- 2 files changed, 76 insertions(+), 48 deletions(-) diff --git a/Probe/Tests/Utils/PingMonitor.test.ts b/Probe/Tests/Utils/PingMonitor.test.ts index 2158356572..d3f829909e 100644 --- a/Probe/Tests/Utils/PingMonitor.test.ts +++ b/Probe/Tests/Utils/PingMonitor.test.ts @@ -9,9 +9,15 @@ describe('Ping', () => { let result: PingResponse = await Ping.fetch( new Hostname('oneuptime.com', 80) ); + expect(result.responseTimeInMS?.toNumber()).toBeGreaterThan(0); + expect(result.responseTimeInMS?.toNumber()).toBeLessThanOrEqual(5000); expect(result.isAlive).toBe(true); - result = await Ping.fetch(new Hostname('www.oneuptime.com', 80)); + result = await Ping.fetch(new Hostname('www.oneuptime.com', 80), { + timeout: new PositiveNumber(5000), + }); expect(result.isAlive).toBe(true); + expect(result.responseTimeInMS?.toNumber()).toBeGreaterThan(0); + expect(result.responseTimeInMS?.toNumber()).toBeLessThanOrEqual(5000); result = await Ping.fetch(new Hostname('www.oneuptime.com', 65000), { timeout: new PositiveNumber(5000), }); @@ -25,12 +31,16 @@ describe('Ping', () => { }); test('Ping.fetch should return appropriate object if the valid IPV4 or IPV6 is given', async () => { let result: PingResponse; - result = await Ping.fetch(new IPv4('172.217.170.206')); + result = await Ping.fetch(new IPv4('172.217.170.206'), { + timeout: new PositiveNumber(5000), + }); // One of the google ip expect(result.isAlive).toBe(true); - result = await Ping.fetch(new IPv4('192.0.2.200')); + expect(result.responseTimeInMS?.toNumber()).toBeGreaterThan(0); + expect(result.responseTimeInMS?.toNumber()).toBeLessThanOrEqual(5000); + result = await Ping.fetch(new IPv4('192.0.2.200')); // expect(result.isAlive).toBe(false); expect(result.responseTimeInMS).toBeUndefined(); - result = await Ping.fetch(new IPv4('0.42.52.42')); + result = await Ping.fetch(new IPv4('0.42.52.42')); // ip can't start 0 expect(result.responseTimeInMS).toBeUndefined(); expect(result.isAlive).toBe(false); }); diff --git a/Probe/Utils/PingMonitor.ts b/Probe/Utils/PingMonitor.ts index d5397c5bc3..74fe6e9b22 100644 --- a/Probe/Utils/PingMonitor.ts +++ b/Probe/Utils/PingMonitor.ts @@ -1,11 +1,14 @@ import Hostname from 'Common/Types/API/Hostname'; import IPv4 from 'Common/Types/IP/IPv4'; import IPv6 from 'Common/Types/IP/IPv6'; +import Port from 'Common/Types/Port'; import PositiveNumber from 'Common/Types/PositiveNumber'; import net, { Socket } from 'net'; export interface PingResponse { isAlive: boolean; responseTimeInMS?: PositiveNumber; + remoteAddressIP: IPv4 | IPv6; + remoteAddressPort: Port; } export interface PingOptions { port?: PositiveNumber; @@ -14,53 +17,68 @@ export interface PingOptions { export default class Ping { public static async fetch( _host: Hostname | IPv4 | IPv6, - options?: PingOptions + pingOptions?: PingOptions ): Promise { - return new Promise((resolve: Function, _reject: Function) => { - const timeout: number = options?.timeout?.toNumber() || 4000; - const startTime: [number, number] = process.hrtime(); - let socket: Socket; - if (_host instanceof Hostname) { - socket = net.connect({ - host: _host.hostname, - port: _host.port.toNumber(), - timeout, + return new Promise( + (resolve: Function, _reject: Function) => { + const timeout: number = + pingOptions?.timeout?.toNumber() || 4000; + const startTime: [number, number] = process.hrtime(); + let responseTimeInMS: PositiveNumber; + let connectionOptions: net.NetConnectOpts; + if (_host instanceof Hostname) { + connectionOptions = { + host: _host.hostname, + port: _host.port.toNumber(), + timeout, + }; + } else { + connectionOptions = { + host: _host.toString(), + port: pingOptions?.port?.toNumber() || 80, + timeout, + }; + } + const socket: Socket = net.connect(connectionOptions); + socket.on('connect', () => { + const endTime: [number, number] = process.hrtime(startTime); + responseTimeInMS = new PositiveNumber( + (endTime[0] * 1000000000 + endTime[1]) / 1000000 + ); }); - } else { - socket = net.connect({ - host: _host.toString(), - port: options?.port?.toNumber() || 80, - timeout, + socket.on('timeout', () => { + resolve({ + isAlive: false, + }); + }); + socket.on('connect', (data: any) => { + // eslint-disable-next-line no-console + console.log(data?.toString()); + const remoteAddressIP: undefined | IPv4 | IPv6 | '' = + socket.remoteAddress && + (net.isIPv4(socket.remoteAddress) + ? new IPv4(socket.remoteAddress) + : new IPv6(socket.remoteAddress)); + + socket.end(() => { + resolve({ + isAlive: true, + responseTimeInMS, + remoteAddressIP, + remoteAddressPort: + socket.remotePort && + new Port(socket.remotePort), + bytesReceived: new PositiveNumber(socket.bytesRead), + bytesSent: new PositiveNumber(socket.bytesRead), + }); + }); + }); + socket.on('error', () => { + resolve({ + isAlive: false, + }); }); } - socket.on('connect', () => { - const endTime: [number, number] = process.hrtime(startTime); - resolve({ - isAlive: true, - responseTimeInMS: new PositiveNumber( - (endTime[0] * 1000000000 + endTime[1]) / 1000000 - ), - }); - }); - socket.on('timeout', () => { - resolve({ - isAlive: false, - }); - }); - socket.on('data', () => { - const endTime: [number, number] = process.hrtime(startTime); - resolve({ - isAlive: true, - responseTimeInMS: new PositiveNumber( - (endTime[0] * 1000000000 + endTime[1]) / 1000000 - ), - }); - }); - socket.on('error', () => { - resolve({ - isAlive: false, - }); - }); - }); + ); } }