FunctionObfuscator.spec.ts 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { IBlockStatementNode } from "../../../src/interfaces/nodes/IBlockStatementNode";
  2. import { ICustomNode } from "../../../src/interfaces/ICustomNode";
  3. import { IExpressionStatementNode } from "../../../src/interfaces/nodes/IExpressionStatementNode";
  4. import { IFunctionDeclarationNode } from "../../../src/interfaces/nodes/IFunctionDeclarationNode";
  5. import { IIdentifierNode } from "../../../src/interfaces/nodes/IIdentifierNode";
  6. import { IProgramNode } from "../../../src/interfaces/nodes/IProgramNode";
  7. import { DEFAULT_PRESET } from "../../../src/preset-options/DefaultPreset";
  8. import { FunctionObfuscator } from "../../../src/node-obfuscators/FunctionObfuscator";
  9. import { NodeMocks } from "../../mocks/NodeMocks";
  10. import { Options } from "../../../src/Options";
  11. const assert: Chai.AssertStatic = require('chai').assert;
  12. describe('FunctionObfuscator', () => {
  13. describe('obfuscateNode (functionNode: IFunctionNode): void', () => {
  14. let blockStatementNode: IBlockStatementNode,
  15. expressionStatementNode1: IExpressionStatementNode,
  16. expressionStatementNode2: IExpressionStatementNode,
  17. functionObfuscator: FunctionObfuscator,
  18. functionDeclarationNode: IFunctionDeclarationNode,
  19. functionName: string = 'functionDeclaration',
  20. identifierName: string = 'identifierName',
  21. identifierNode1: IIdentifierNode,
  22. identifierNode2: IIdentifierNode,
  23. identifierNode3: IIdentifierNode,
  24. paramName: string = 'param1',
  25. programNode: IProgramNode;
  26. before(() => {
  27. identifierNode1 = NodeMocks.getIdentifierNode(paramName);
  28. identifierNode2 = NodeMocks.getIdentifierNode(paramName);
  29. identifierNode3 = NodeMocks.getIdentifierNode(identifierName);
  30. expressionStatementNode1 = NodeMocks.getExpressionStatementNode(
  31. NodeMocks.getCallExpressionNode(identifierNode2)
  32. );
  33. expressionStatementNode2 = NodeMocks.getExpressionStatementNode(
  34. NodeMocks.getCallExpressionNode(identifierNode3)
  35. );
  36. blockStatementNode = NodeMocks.getBlockStatementNode([
  37. expressionStatementNode1
  38. ]);
  39. functionDeclarationNode = NodeMocks.getFunctionDeclarationNode(
  40. functionName,
  41. blockStatementNode,
  42. [
  43. identifierNode1
  44. ]
  45. );
  46. programNode = NodeMocks.getProgramNode([
  47. functionDeclarationNode
  48. ]);
  49. programNode['parentNode'] = programNode;
  50. functionDeclarationNode['parentNode'] = programNode;
  51. blockStatementNode['parentNode'] = functionDeclarationNode;
  52. identifierNode1['parentNode'] = functionDeclarationNode;
  53. expressionStatementNode1['parentNode'] = blockStatementNode;
  54. functionObfuscator = new FunctionObfuscator(
  55. new Map<string, ICustomNode>(),
  56. new Options(DEFAULT_PRESET)
  57. );
  58. functionObfuscator.obfuscateNode(functionDeclarationNode);
  59. });
  60. it('should obfuscate function parameter', () => {
  61. assert.match(identifierNode1.name, /^_0x\w+$/);
  62. });
  63. it('should obfuscate function parameter in function body', () => {
  64. assert.match(identifierNode2.name, /^_0x\w+$/);
  65. assert.equal(identifierNode2.name, identifierNode1.name);
  66. });
  67. it('shouldn\'t obfuscate other identifiers in function body', () => {
  68. assert.equal(identifierNode3.name, identifierName);
  69. });
  70. });
  71. });