JavaScriptObfuscatorPerformance.spec.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import { assert } from 'chai';
  2. import { readFileAsString } from '../helpers/readFileAsString';
  3. import { JavaScriptObfuscator } from '../../src/JavaScriptObfuscatorFacade';
  4. const heapValueToMB = (value: number) => Math.round(value / 1024 / 1024 * 100) / 100;
  5. describe('JavaScriptObfuscator performance', function () {
  6. const iterationsCount: number = 500;
  7. this.timeout(100000);
  8. describe('performance: multiple calls', () => {
  9. it('shows performance time with multiple obfuscator calls', () => {
  10. for (let i: number = 0; i < iterationsCount; i++) {
  11. JavaScriptObfuscator.obfuscate(readFileAsString('./test/fixtures/sample.js'));
  12. }
  13. assert.isOk(true);
  14. });
  15. });
  16. describe('performance: large source code', () => {
  17. it('shows performance time with large code size', () => {
  18. JavaScriptObfuscator.obfuscate(readFileAsString('./test/fixtures/sample.js').repeat(iterationsCount));
  19. assert.isOk(true);
  20. });
  21. });
  22. describe('performance: heap usage', () => {
  23. it('should keep heap usage without memory leaks', () => {
  24. const sourceCode: string = readFileAsString('./test/fixtures/sample.js');
  25. const maxHeapUsed: number[] = [];
  26. let prevHeapUsed: number | null = null;
  27. for (let i: number = 0; i < iterationsCount; i++) {
  28. JavaScriptObfuscator.obfuscate(
  29. sourceCode,
  30. {
  31. compact: true,
  32. controlFlowFlattening: true,
  33. controlFlowFlatteningThreshold: 0.75,
  34. deadCodeInjection: true,
  35. deadCodeInjectionThreshold: 0.4,
  36. debugProtection: false,
  37. debugProtectionInterval: false,
  38. disableConsoleOutput: true,
  39. identifierNamesGenerator: 'mangled',
  40. log: false,
  41. renameGlobals: false,
  42. rotateStringArray: true,
  43. selfDefending: true,
  44. shuffleStringArray: true,
  45. splitStrings: true,
  46. splitStringsChunkLength: 2,
  47. stringArray: true,
  48. stringArrayEncoding: 'base64',
  49. stringArrayThreshold: 0.75,
  50. transformObjectKeys: true,
  51. unicodeEscapeSequence: false
  52. }
  53. );
  54. const used = process.memoryUsage();
  55. const heapUsed: number = heapValueToMB(used.heapUsed);
  56. if (prevHeapUsed !== null && heapUsed < prevHeapUsed) {
  57. maxHeapUsed.push(prevHeapUsed);
  58. }
  59. prevHeapUsed = heapUsed;
  60. }
  61. const sortedMaxHeapUsed: number[] = [...maxHeapUsed].sort();
  62. const firstMaxHeapMBUsed: number = sortedMaxHeapUsed[0];
  63. const lastMaxHeapMbUsed: number = sortedMaxHeapUsed[sortedMaxHeapUsed.length - 1];
  64. const diff: number = lastMaxHeapMbUsed - firstMaxHeapMBUsed;
  65. assert.closeTo(diff, 0, 20);
  66. });
  67. });
  68. });