diff --git a/assets/icon.ico b/assets/icon.ico
new file mode 100644
index 0000000..272293e
Binary files /dev/null and b/assets/icon.ico differ
diff --git a/src/common/interfaces.ts b/src/common/interfaces.ts
index 2a72c60..0c29f1e 100644
--- a/src/common/interfaces.ts
+++ b/src/common/interfaces.ts
@@ -14,7 +14,22 @@ export interface ClientMessage {
name: string;
}
+export interface ClientReport {
+ host: string;
+ sockets: number;
+ messages: number;
+ received: number;
+ data: number;
+}
+
export interface ServerPort {
enabled: boolean;
port: number;
}
+
+export interface ServerReport {
+ port: number;
+ sockets: number;
+ data: number;
+ messages: number;
+}
diff --git a/src/main/libs/Sender.ts b/src/main/libs/Sender.ts
index 48da7ac..939c568 100644
--- a/src/main/libs/Sender.ts
+++ b/src/main/libs/Sender.ts
@@ -1,7 +1,5 @@
import * as net from 'net';
import { ClientHost, ClientMessage } from 'common/interfaces';
-import * as ElectronStore from 'electron-store';
-const persistentStore = new ElectronStore({ name: 'client' });
interface SenderParams {
closeOnEcho: boolean;
@@ -13,31 +11,32 @@ interface SenderParams {
trace: boolean;
alertReset: boolean;
loop: boolean;
+ messages: ClientMessage[];
}
class Sender {
- process: NodeJS.Process;
- closeOnEcho: boolean;
- persistentConnection: boolean;
- nMsgs: number;
- tMin: number;
- tMax: number;
- nClients: number;
- trace: boolean;
- alertReset: boolean;
- hexMsg: boolean;
- nConnected: number;
- nClosed: number;
- nTryConnect: number;
- nReceived: number[];
- nSent: number;
- timeStart: Date;
- hosts: ClientHost[];
- messages: ClientMessage[];
- nHostClients: number[];
- nHostBytes: number[];
- nHostMsgs: number[];
- loop: boolean;
+ private process: NodeJS.Process;
+ private closeOnEcho: boolean;
+ private persistentConnection: boolean;
+ private nMsgs: number;
+ private tMin: number;
+ private tMax: number;
+ private nClients: number;
+ private trace: boolean;
+ private alertReset: boolean;
+ private hexMsg: boolean;
+ private nConnected: number;
+ private nClosed: number;
+ private nTryConnect: number;
+ private nReceived: number[];
+ private nSent: number;
+ private timeStart: Date;
+ private hosts: ClientHost[];
+ private messages: ClientMessage[];
+ private nHostClients: number[];
+ private nHostBytes: number[];
+ private nHostMsgs: number[];
+ private loop: boolean;
/**
*Creates an instance of Sender.
@@ -78,6 +77,16 @@ class Sender {
this.hosts = hosts;
}
+ /**
+ * Setta gli hosts
+ *
+ * @param {*} messages
+ * @memberof Sender
+ */
+ setMessages (messages: ClientMessage[]) {
+ this.messages = messages;
+ }
+
/**
* Setta i parametri del messaggio
*
@@ -102,12 +111,8 @@ class Sender {
* @memberof Sender
*/
loadMessages () {
- if (this.trace) this.sendLog('Lettura dei messaggi');
- const messages = persistentStore.get('messages', []) as ClientMessage[];
- this.messages = messages.filter((message) => {
- return message.enabled === true;
- });
- if (this.trace) this.sendLog(`Messaggi caricari: ${this.messages.length}`);
+ if (this.trace)
+ this.sendLog(null, '', 'messagesLoaded', { mNumber: this.messages.length });
}
/**
@@ -117,10 +122,15 @@ class Sender {
* @param {string} [color=''] Colore del log (green, yellow, red)
* @memberof Sender
*/
- sendLog (message: string, color = '') {
+ sendLog (message?: string, color = '', i18n?: string, i18nParams?: {[key: string]: string | number}) {
const log = {
event: 'log',
- content: { message, color }
+ content: {
+ message,
+ color,
+ i18n,
+ params: i18nParams
+ }
};
this.process.send(log);
}
@@ -145,7 +155,7 @@ class Sender {
return msg;
}
- else return 'Nessun messaggio specificato';
+ else return '';
}
/**
@@ -178,8 +188,11 @@ class Sender {
const clientId = i + 1;
try {
+ this.nTryConnect++;
+
client.connect(params, () => {
- if (this.trace) this.sendLog(`Socket #${clientId} su ${params.host}:${params.port} aperto`);
+ if (this.trace)
+ this.sendLog(null, '', 'socketOpen', { number: clientId, host: params.host, port: params.port });
this.nHostClients[x]++;
(async () => {
@@ -190,7 +203,7 @@ class Sender {
client.write(msg, (err: Error) => {
if (err)
- this.sendLog(`Socket #${clientId} su ${params.host}:${params.port}:\nErrore messaggio: ${err}`, 'red');
+ this.sendLog(null, 'red', 'logOnSocket', { number: clientId, host: params.host, port: params.port, message: err.toString() });
else {
this.nSent++;
this.nHostMsgs[x]++;
@@ -198,20 +211,19 @@ class Sender {
}
});
- if (this.trace) this.sendLog(`Socket #${clientId} su ${params.host}:${params.port} messaggio #${i + 1}`);
+ if (this.trace) this.sendLog(null, '', 'socketMessage', { number: clientId, host: params.host, port: params.port, mNumber: i + 1 });
if (i + 1 === this.nMsgs && !this.closeOnEcho && !this.persistentConnection) client.end();
}// <- msg for
})();
});
}
catch (err) {
- this.sendLog(`Socket #${clientId} su ${params.host}:${params.port}:\n${err}`, 'red');
+ this.sendLog(null, 'red', 'logOnSocket', { number: clientId, host: params.host, port: params.port, message: err.toString() });
}
client.on('connect', (err: Error) => {
- this.nTryConnect++;
if (err)
- this.sendLog(`Errore connessione #${clientId} su ${params.host}:${params.port}:\n${err}`, 'red');
+ this.sendLog(null, 'red', 'logOnSocket', { number: clientId, host: params.host, port: params.port, message: err.toString() });
else
this.nConnected++;
// if (this.nConnected === (this.nClients * this.hosts.length)) this.getReport();
@@ -222,12 +234,14 @@ class Sender {
if (this.closeOnEcho)
client.end();
- if (this.trace) this.sendLog(`Socket #${clientId} su ${params.host}:${params.port} risposta: ${data}`);
+ if (this.trace)
+ this.sendLog(null, '', 'socketReply', { number: clientId, host: params.host, port: params.port, reply: data.toString() });
});
client.on('close', () => {
this.nClosed++;
- if (this.trace) this.sendLog(`Socket #${clientId} su ${params.host}:${params.port} chiuso`);
+ if (this.trace)
+ this.sendLog(null, '', 'socketClosed', { number: clientId, host: params.host, port: params.port });
// Misura tempo esecuzione
if (this.nClosed === this.nTryConnect) {
@@ -240,11 +254,10 @@ class Sender {
switch (err.code) {
case 'ECONNRESET':
if (this.alertReset)
- this.sendLog(`Socket #${clientId} su ${params.host}:${params.port}:\n${err}`, 'yellow');
-
+ this.sendLog(null, 'yellow', 'logOnSocket', { number: clientId, host: params.host, port: params.port, message: err.toString() });
break;
default:
- this.sendLog(`Socket #${clientId} su ${params.host}:${params.port}:\n${err}`, 'red');
+ this.sendLog(null, 'red', 'logOnSocket', { number: clientId, host: params.host, port: params.port, message: err.toString() });
}
});
}// <- clients for
@@ -272,19 +285,20 @@ class Sender {
const clientId = i + 1;
try {
+ this.nTryConnect++;
+
client.connect(params, () => {
- if (this.trace) this.sendLog(`Socket #${clientId} su ${params.host}:${params.port} aperto`);
+ if (this.trace) this.sendLog(null, '', 'socketOpen', { number: clientId, host: params.host, port: params.port });
this.nHostClients[x]++;
});
}
catch (err) {
- this.sendLog(`Socket #${clientId} su ${params.host}:${params.port}:\n${err}`, 'red');
+ this.sendLog(null, 'red', 'logOnSocket', { number: clientId, host: params.host, port: params.port, message: err.toString() });
}
client.on('connect', (err: Error) => {
- this.nTryConnect++;
if (err)
- this.sendLog(`Errore connessione #${clientId} su ${params.host}:${params.port}:\n${err}`, 'red');
+ this.sendLog(null, 'red', 'logOnSocket', { number: clientId, host: params.host, port: params.port, message: err.toString() });
else
this.nConnected++;
// if (this.nConnected === (this.nClients * this.hosts.length)) this.getReport();
@@ -297,23 +311,24 @@ class Sender {
if (this.closeOnEcho)
client.end();
- if (this.trace) this.sendLog(`Socket #${clientId} su ${params.host}:${params.port} risposta: ${data}`);
+ if (this.trace)
+ this.sendLog(null, '', 'socketReply', { number: clientId, host: params.host, port: params.port, reply: data.toString() });
});
client.on('close', () => {
this.nClosed++;
- if (this.trace) this.sendLog(`Socket #${clientId} su ${params.host}:${params.port} chiuso`);
+ if (this.trace)
+ this.sendLog(null, '', 'socketClosed', { number: clientId, host: params.host, port: params.port });
});
client.on('error', (err: Error & { code: string }) => {
switch (err.code) {
case 'ECONNRESET':
if (this.alertReset)
- this.sendLog(`Socket #${clientId} su ${params.host}:${params.port}:\n${err}`, 'yellow');
-
+ this.sendLog(null, 'yellow', 'logOnSocket', { number: clientId, host: params.host, port: params.port, message: err.toString() });
break;
default:
- this.sendLog(`Socket #${clientId} su ${params.host}:${params.port}:\n${err}`, 'red');
+ this.sendLog(null, 'red', 'logOnSocket', { number: clientId, host: params.host, port: params.port, message: err.toString() });
}
});
}// <- clients for
@@ -333,10 +348,10 @@ class Sender {
this.nSent = 0;
/** Applica uno sleep */
- function delay () {
+ const delay = () => {
const wait = Math.floor((Math.random() * this.tMax) + this.tMin);
return new Promise(resolve => setTimeout(resolve, wait));
- }
+ };
for (let x = 0; x < this.hosts.length; x++) { // hosts for
for (let i = 0; i < this.hosts[x].clients.length; i++) { // clients for
@@ -352,7 +367,7 @@ class Sender {
client.write(msg, (err: Error) => {
if (err)
- this.sendLog(`Socket #${clientId} su ${params.host}:${params.port}:\nErrore messaggio: ${err}`, 'red');
+ this.sendLog(null, 'red', 'logOnSocket', { number: clientId, host: params.host, port: params.port, error: err.toString() });
else {
this.nSent++;
this.nHostMsgs[x]++;
@@ -361,7 +376,7 @@ class Sender {
}
});
- if (this.trace) this.sendLog(`Socket #${clientId} su ${params.host}:${params.port} messaggio #${i + 1}`);
+ if (this.trace) this.sendLog(null, '', 'socketMessage', { number: clientId, host: params.host, port: params.port, mNumber: i + 1 });
}// <- msg for
})();
}// <- clients for
@@ -370,10 +385,10 @@ class Sender {
/** Genera il report su console */
getConsoleReports () {
- const end = new Date().getMilliseconds() - this.timeStart.getMilliseconds();
- const report = `Durata del test: ${end}ms`;
+ const end = Number(new Date()) - Number(this.timeStart);
+ const i18n = 'testDuration';
- this.sendLog(report, 'green');
+ this.sendLog(null, 'green', i18n, { ms: end });
}
stopClients (callback: () => void) {
diff --git a/src/main/libs/Server.ts b/src/main/libs/Server.ts
index 9e20f88..d841e83 100644
--- a/src/main/libs/Server.ts
+++ b/src/main/libs/Server.ts
@@ -8,14 +8,14 @@ interface ServerParams {
}
class Server {
- process: NodeJS.Process;
- trace: boolean;
- echo: boolean;
- alertReset: boolean;
- ports: ServerPort[];
- server: net.Server[];
- nBytes: number[];
- nMsgs: number[];
+ private process: NodeJS.Process;
+ private trace: boolean;
+ private echo: boolean;
+ private alertReset: boolean;
+ private ports: ServerPort[];
+ private server: net.Server[];
+ private nBytes: number[];
+ private nMsgs: number[];
constructor (process: NodeJS.Process) {
this.process = process;
@@ -45,10 +45,15 @@ class Server {
* @param {string} [color=''] Colore del log (green, yellow, red)
* @memberof Server
*/
- sendLog (message: string, color = '') {
+ sendLog (message?: string, color = '', i18n?: string, i18nParams?: {[key: string]: string | number}) {
const log = {
event: 'log',
- content: { message, color }
+ content: {
+ message,
+ color,
+ i18n,
+ params: i18nParams
+ }
};
this.process.send(log);
}
@@ -66,7 +71,8 @@ class Server {
this.nMsgs[i] = 0;
this.server[i].on('connection', (socket: net.Socket) => {
- if (this.trace) this.sendLog(`Client connesso su porta ${port}`);
+ if (this.trace)
+ this.sendLog(null, '', 'clientConnectedOnPort', { port });
socket.on('data', (msg: Buffer) => {
const msgString = msg.toString();
@@ -74,33 +80,36 @@ class Server {
this.nBytes[i] += msg.length;
this.nMsgs[i]++;
- if (this.trace) this.sendLog(`Messaggio ricevuto su porta ${port}: ${msgString}`);
+ if (this.trace)
+ this.sendLog(null, '', 'messageReceivedOnPort', { port, message: msgString });
});// <- socket data
socket.on('end', () => {
- if (this.trace) this.sendLog(`Client disconnesso su porta ${port}`);
+ if (this.trace)
+ this.sendLog(null, '', 'clientDisonnectedOnPort', { port });
});
socket.on('error', (err: Error & { code: string }) => {
switch (err.code) {
case 'ECONNRESET':
if (this.alertReset)
- this.sendLog(`Errore client su porta ${port}: \n${err}`, 'yellow');
+ this.sendLog(null, 'yellow', 'clientErrorOnPort', { port, error: err.toString() });
else
- if (this.trace) this.sendLog(`Client disconnesso su porta ${port}`);
+ if (this.trace)
+ this.sendLog(null, '', 'clientDisonnectedOnPort', { port });
break;
default:
- this.sendLog(`Errore client su porta ${port}: \n${err}`, 'red');
+ this.sendLog(null, 'red', 'clientErrorOnPort', { port, error: err.toString() });
}
});
});// <- server
this.server[i].on('error', (err: Error) => {
- this.sendLog(`Errore server su porta ${port}: \n${err}`, 'red');
+ this.sendLog(null, 'red', 'serverErrorOnPort', { port, error: err.toString() });
});
this.server[i].listen(port, () => {
- this.sendLog(`In ascolto sulla porta ${port}`);
+ this.sendLog(null, '', 'listenindOnPort', { port });
});
}
}
@@ -127,7 +136,8 @@ class Server {
};
this.server[i].getConnections((err: Error, nSockets: number) => {
- if (err) this.sendLog(`Errore report: \n${err}`, 'red');
+ if (err)
+ this.sendLog(null, 'red', 'reportError', { error: err.toString() });
report.sockets = nSockets;
reportList.push(report);
diff --git a/src/main/main.ts b/src/main/main.ts
index b6e5e00..fdf3a65 100644
--- a/src/main/main.ts
+++ b/src/main/main.ts
@@ -148,8 +148,8 @@ else {
// Client
let clientProcess: ChildProcess;
-ipcMain.on('startTest', (event, { params, hosts }) => {
- event.sender.send('clientLog', { message: 'Test avviato', color: '' });
+ipcMain.on('start-test', (event, { params, hosts, messages }) => {
+ event.sender.send('client-log', { message: '', color: '', i18n: 'testStarted' });
clientProcess = fork(isDevelopment ? './dist/clientProcess.js' : path.resolve(__dirname, './clientProcess.js'), [], {
execArgv: isDevelopment ? ['--inspect=9225'] : undefined
});
@@ -159,8 +159,8 @@ ipcMain.on('startTest', (event, { params, hosts }) => {
const testParams = {
event: startEvent,
params,
- // storagePath,
- hosts
+ hosts,
+ messages
};
clientProcess.send(testParams);
@@ -168,32 +168,32 @@ ipcMain.on('startTest', (event, { params, hosts }) => {
if (!mainWindow) return;
switch (message.event) {
case 'log':
- mainWindow.webContents.send('clientLog', message.content);
+ mainWindow.webContents.send('client-log', message.content);
break;
case 'finish':
if (params.loop)
clientProcess.send(testParams);
else {
- mainWindow.webContents.send('testFinish', message.content);
+ mainWindow.webContents.send('test-finish', message.content);
clientProcess.kill();
}
break;
case 'report':
- mainWindow.webContents.send('reportClientList', message.content);
+ mainWindow.webContents.send('report-client-list', message.content);
break;
}
});
});
-ipcMain.on('sendMessages', (event) => {
+ipcMain.on('send-messages', (event) => {
clientProcess.send({ event: 'sendStep' });
- event.sender.send('clientLog', { message: 'Invio messaggi in corso', color: '' });
+ event.sender.send('client-log', { i18n: 'sendingMessages', color: '' });
});
-ipcMain.on('stopTest', (event) => {
+ipcMain.on('stop-test', (event) => {
try {
clientProcess.send({ event: 'stop' });
- event.sender.send('testFinish', 'Test interrotto');
+ event.sender.send('test-finish', 'testAborted');
}
catch (error) {
clientProcess.kill();
@@ -202,8 +202,8 @@ ipcMain.on('stopTest', (event) => {
// Server
let serverProcess: ChildProcess;
-ipcMain.on('startServer', (event, { params, ports }) => {
- event.sender.send('serverLog', { message: 'Server avviato', color: '' });
+ipcMain.on('start-server', (event, { params, ports }) => {
+ event.sender.send('server-log', { i18n: 'serverStart', color: '' });
serverProcess = fork(isDevelopment ? './dist/serverProcess.js' : path.resolve(__dirname, './serverProcess.js'), [], {
execArgv: isDevelopment ? ['--inspect=9224'] : undefined
});
@@ -219,26 +219,26 @@ ipcMain.on('startServer', (event, { params, ports }) => {
if (!mainWindow) return;
switch (message.event) {
case 'log':
- mainWindow.webContents.send('serverLog', message.content);
+ mainWindow.webContents.send('server-log', message.content);
break;
case 'report':
- mainWindow.webContents.send('reportServerList', message.content);
+ mainWindow.webContents.send('report-server-list', message.content);
break;
}
});
});
-ipcMain.on('stopServer', (event) => {
+ipcMain.on('stop-server', (event) => {
try {
serverProcess.send({ event: 'stop' });
- event.sender.send('serverFinish', 'Server stoppato');
+ event.sender.send('server-finish', 'serverStop');
}
catch (error) {
serverProcess.kill();
}
});
-ipcMain.on('resetReports', () => {
+ipcMain.on('reset-reports', () => {
if (!mainWindow) return;
try {
serverProcess.send({ event: 'reset' });
@@ -248,7 +248,7 @@ ipcMain.on('resetReports', () => {
message: error.stack,
color: 'red'
};
- mainWindow.webContents.send('serverLog', data);
+ mainWindow.webContents.send('server-log', data);
}
});
diff --git a/src/main/workers/clientProcess.ts b/src/main/workers/clientProcess.ts
index 72a13ef..a6eb56f 100644
--- a/src/main/workers/clientProcess.ts
+++ b/src/main/workers/clientProcess.ts
@@ -1,66 +1,68 @@
-import { ClientHost } from 'common/interfaces';
+import { ClientHost, ClientMessage } from 'common/interfaces';
import { Sender, SenderParams } from '../libs/Sender';
-const Sends = new Sender(process);
+const sender = new Sender(process);
let clientTimer: NodeJS.Timer;
-process.on('message', (message: { event: string; hosts: ClientHost[]; params: SenderParams}) => {
+process.on('message', (message: { event: string; hosts: ClientHost[]; messages: ClientMessage[]; params: SenderParams}) => {
switch (message.event) {
case 'start':
- Sends.setHosts(message.hosts);
- Sends.setParams(message.params);
+ sender.setHosts(message.hosts);
+ sender.setMessages(message.messages);
+ sender.setParams(message.params);
- Sends.startFullTest(() => {
+ sender.startFullTest(() => {
const response = {
event: 'finish',
- content: 'Test concluso'
+ content: 'testEnded'
};
process.send(response);
if (clientTimer !== undefined) clearInterval(clientTimer);
- Sends.getReports();
+ sender.getReports();
});
- Sends.getReports();
+ sender.getReports();
if (clientTimer === undefined) {
clientTimer = setInterval(() => {
- Sends.getReports();
+ sender.getReports();
}, 200);
}
break;
case 'startStep':
- Sends.setHosts(message.hosts);
- Sends.setParams(message.params);
+ sender.setHosts(message.hosts);
+ sender.setMessages(message.messages);
+ sender.setParams(message.params);
- Sends.connectClients(() => {
+ sender.connectClients(() => {
const response = {
event: 'log',
- content: { message: 'Client connessi', color: '' }
+ content: { i18n: 'clientsConnected', color: '' }
};
process.send(response);
});
- Sends.getReports();
+ sender.getReports();
if (clientTimer === undefined) {
clientTimer = setInterval(() => {
- Sends.getReports();
+ sender.getReports();
}, 200);
}
break;
- case 'sendStep':
- Sends.sendMessages(() => {
+ case 'sendertep':
+ sender.sendMessages(() => {
const response = {
event: 'log',
- content: { message: 'Messaggi inviati', color: '' }
+ content: { i18n: 'messagesSent', color: '' }
};
process.send(response);
});
break;
case 'stop':
- Sends.stopClients(() => {
+ sender.stopClients(() => {
if (clientTimer !== undefined) clearInterval(clientTimer);
- Sends.getReports();
+ sender.getReports();
process.exit();
});
break;
diff --git a/src/main/workers/serverProcess.ts b/src/main/workers/serverProcess.ts
index 78cc62c..dbb48db 100644
--- a/src/main/workers/serverProcess.ts
+++ b/src/main/workers/serverProcess.ts
@@ -1,29 +1,29 @@
import { ServerPort } from 'common/interfaces';
import { Server, ServerParams } from '../libs/Server';
-const myServer = new Server(process);
+const server = new Server(process);
let serverTimer: NodeJS.Timer;
process.on('message', (message: {event: string; ports: ServerPort[]; params: ServerParams}) => {
switch (message.event) {
case 'start':
- myServer.setPorts(message.ports);
- myServer.startServer(message.params);
+ server.setPorts(message.ports);
+ server.startServer(message.params);
if (serverTimer === undefined) {
serverTimer = setInterval(() => {
- myServer.getReports();
+ server.getReports();
}, 200);
}
break;
case 'stop':
- myServer.stopServer(() => {
+ server.stopServer(() => {
if (serverTimer !== undefined) clearInterval(serverTimer);
process.exit();
});
break;
case 'reset':
- myServer.resetReports();
+ server.resetReports();
break;
}
});
diff --git a/src/renderer/components/AppHeader.vue b/src/renderer/components/AppHeader.vue
index 0b802f1..589d7ce 100644
--- a/src/renderer/components/AppHeader.vue
+++ b/src/renderer/components/AppHeader.vue
@@ -6,12 +6,12 @@
:class="{ selected : selTab === 0 }"
@click="selectTab(0)"
>
- Client
+ {{ t('word.client', 1) }}