refactor: tests

This commit is contained in:
Sostene MUNEZERO BAGIRA
2022-10-23 18:58:34 +02:00
parent b68ec16d3c
commit aa763b9d7b
2 changed files with 76 additions and 48 deletions

View File

@@ -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);
});

View File

@@ -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<PingResponse> {
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<PingResponse>(
(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,
});
});
});
);
}
}