From b322b8b4712bd412ea2d1e27924dcc6f1bb08c63 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Sun, 19 Sep 2021 02:20:54 +0200 Subject: [PATCH] Add sanity checks to random number generation code MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- .../AutomaticTransactionGenerator.ts | 12 +++---- src/charging-station/Bootstrap.ts | 4 +++ src/utils/Utils.ts | 36 +++---------------- 3 files changed, 15 insertions(+), 37 deletions(-) diff --git a/src/charging-station/AutomaticTransactionGenerator.ts b/src/charging-station/AutomaticTransactionGenerator.ts index 5181beed..2315b5cb 100644 --- a/src/charging-station/AutomaticTransactionGenerator.ts +++ b/src/charging-station/AutomaticTransactionGenerator.ts @@ -57,8 +57,8 @@ export default class AutomaticTransactionGenerator { private async startOnConnector(connectorId: number): Promise { logger.info(this.logPrefix(connectorId) + ' started on connector'); - let transactionSkip = 0; - let totalTransactionSkip = 0; + let skippedTransactions = 0; + let skippedTransactionsTotal = 0; while (this.started) { if ((new Date()) > this.stopDate) { await this.stop(); @@ -89,7 +89,7 @@ export default class AutomaticTransactionGenerator { await Utils.sleep(wait); const start = Utils.secureRandom(); if (start < this.chargingStation.stationInfo.AutomaticTransactionGenerator.probabilityOfStart) { - transactionSkip = 0; + skippedTransactions = 0; // Start transaction const startResponse = await this.startTransaction(connectorId); if (startResponse?.idTagInfo?.status !== AuthorizationStatus.ACCEPTED) { @@ -108,9 +108,9 @@ export default class AutomaticTransactionGenerator { } } } else { - transactionSkip++; - totalTransactionSkip++; - logger.info(this.logPrefix(connectorId) + ' skipped transaction ' + transactionSkip.toString() + '/' + totalTransactionSkip.toString()); + skippedTransactions++; + skippedTransactionsTotal++; + logger.info(this.logPrefix(connectorId) + ' skipped transaction ' + skippedTransactions.toString() + '/' + skippedTransactionsTotal.toString()); } this.lastRunDate = new Date(); } diff --git a/src/charging-station/Bootstrap.ts b/src/charging-station/Bootstrap.ts index 36d694e7..10344b51 100644 --- a/src/charging-station/Bootstrap.ts +++ b/src/charging-station/Bootstrap.ts @@ -72,6 +72,8 @@ export default class Bootstrap { } catch (error) { console.error(chalk.red('Bootstrap start error '), error); } + } else { + console.error(chalk.red('Cannot start an already started charging stations simulator')); } } @@ -79,6 +81,8 @@ export default class Bootstrap { if (isMainThread && this.started) { await Bootstrap.workerImplementation.stop(); await Bootstrap.storage.close(); + } else { + console.error(chalk.red('Trying to stop the charging stations simulator while not started')); } this.started = false; } diff --git a/src/utils/Utils.ts b/src/utils/Utils.ts index f6565cc5..b3947133 100644 --- a/src/utils/Utils.ts +++ b/src/utils/Utils.ts @@ -33,31 +33,15 @@ export default class Utils { minutesStr = '0' + minutes.toString(); } if (seconds < 10) { - secondsStr = ('0' + seconds.toString()).substring(0, 6); + secondsStr = '0' + seconds.toString(); } - return hoursStr + ':' + minutesStr + ':' + secondsStr; + return hoursStr + ':' + minutesStr + ':' + secondsStr.substring(0, 6); } public static formatDurationSeconds(duration: number): string { return Utils.formatDurationMilliSeconds(duration * 1000); } - public static removeExtraEmptyLines(tab: string[]): void { - // Start from the end - for (let i = tab.length - 1; i > 0; i--) { - // Two consecutive empty lines? - if (tab[i].length === 0 && tab[i - 1].length === 0) { - // Remove the last one - tab.splice(i, 1); - } - // Check last line - if (i === 1 && tab[i - 1].length === 0) { - // Remove the first one - tab.splice(i - 1, 1); - } - } - } - public static convertToDate(value: unknown): Date { // Check if (!value) { @@ -116,6 +100,9 @@ export default class Utils { } public static getRandomFloat(max: number, min = 0, negative = false): number { + if (max < min || min < 0 || max < 0) { + throw new RangeError('Invalid interval'); + } const randomPositiveFloat = crypto.randomBytes(4).readUInt32LE() / 0xffffffff; const sign = (negative && randomPositiveFloat < 0.5) ? 1 : -1; return sign * (randomPositiveFloat * (max - min) + min); @@ -166,19 +153,6 @@ export default class Utils { return false; } - public static isEmptyJSon(document: unknown): boolean { - // Empty? - if (!document) { - return true; - } - // Check type - if (typeof document !== 'object') { - return true; - } - // Check - return Object.keys(document).length === 0; - } - public static isString(value: unknown): boolean { return typeof value === 'string'; } -- 2.34.1