Add sanity checks to random number generation code
authorJérôme Benoit <jerome.benoit@sap.com>
Sun, 19 Sep 2021 00:20:54 +0000 (02:20 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Sun, 19 Sep 2021 00:20:54 +0000 (02:20 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
src/charging-station/AutomaticTransactionGenerator.ts
src/charging-station/Bootstrap.ts
src/utils/Utils.ts

index 5181beed404b0d8865f9c7baf307c24ed630d691..2315b5cb509d8b8b56e364786916920b9d385580 100644 (file)
@@ -57,8 +57,8 @@ export default class AutomaticTransactionGenerator {
 
   private async startOnConnector(connectorId: number): Promise<void> {
     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();
     }
index 36d694e761de04b901b5c2c3353069c4bebaaf07..10344b5130026e4eb791758d13089eb294d5272b 100644 (file)
@@ -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;
   }
index f6565cc53c3f1cbaeef542d36f6ced8d247cce55..b394713392d2b6c8b90887f16459bd5f36aefc71 100644 (file)
@@ -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';
   }