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) }} play_arrow @@ -20,12 +20,12 @@ :class="{ selected : selTab === 1 }" @click="selectTab(1)" > - Server + {{ t('word.server', 1) }} play_arrow @@ -34,6 +34,8 @@ diff --git a/src/renderer/components/ClientTabHosts.vue b/src/renderer/components/ClientTabHosts.vue index a095a8f..125e7a4 100644 --- a/src/renderer/components/ClientTabHosts.vue +++ b/src/renderer/components/ClientTabHosts.vue @@ -6,11 +6,12 @@ >

{{ checkIcon(checkStatus) - }}Hosts + }} + {{ t('word.host', 2) }}

- Aggiungi Host + {{ t('message.addHost') }} add
@@ -27,7 +28,7 @@ clear @@ -36,8 +37,9 @@ diff --git a/src/renderer/components/ModalLoadConfig.vue b/src/renderer/components/ModalLoadConfig.vue deleted file mode 100644 index bed1b40..0000000 --- a/src/renderer/components/ModalLoadConfig.vue +++ /dev/null @@ -1,73 +0,0 @@ - - - diff --git a/src/renderer/components/ModalNewHost.vue b/src/renderer/components/ModalNewHost.vue index 6d8b8de..89386c9 100644 --- a/src/renderer/components/ModalNewHost.vue +++ b/src/renderer/components/ModalNewHost.vue @@ -2,9 +2,9 @@