FunctionDeclarationObfuscator.spec.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import { IBlockStatementNode } from "../../src/interfaces/nodes/IBlockStatementNode";
  2. import { ICustomNode } from "../../src/interfaces/ICustomNode";
  3. import { IFunctionDeclarationNode } from "../../src/interfaces/nodes/IFunctionDeclarationNode";
  4. import { INode } from "../../src/interfaces/nodes/INode";
  5. import { IProgramNode } from "../../src/interfaces/nodes/IProgramNode";
  6. import { NodeType } from "../../src/enums/NodeType";
  7. import { DEFAULT_PRESET } from "../../src/preset-options/DefaultPreset";
  8. import { FunctionDeclarationObfuscator } from '../../src/node-obfuscators/FunctionDeclarationObfuscator';
  9. import { NodeMocks } from "../mocks/NodeMocks";
  10. import { Options } from "../../src/Options";
  11. const assert: Chai.AssertStatic = require('chai').assert;
  12. describe('FunctionDeclarationObfuscator', () => {
  13. describe('obfuscateNode (functionDeclarationNode: IFunctionDeclarationNode, parentNode: INode): void', () => {
  14. let expressionStatementNode: INode,
  15. functionDeclarationObfuscator: FunctionDeclarationObfuscator,
  16. functionDeclarationNode: IFunctionDeclarationNode,
  17. functionName: string = 'functionDeclaration',
  18. programNode: IProgramNode;
  19. beforeEach(() => {
  20. expressionStatementNode = <INode>{
  21. type: NodeType.ExpressionStatement,
  22. expression: {
  23. type: NodeType.CallExpression,
  24. callee: NodeMocks.getIdentifierNode(functionName),
  25. arguments: []
  26. }
  27. };
  28. functionDeclarationObfuscator = new FunctionDeclarationObfuscator(
  29. new Map<string, ICustomNode>(),
  30. new Options(DEFAULT_PRESET)
  31. );
  32. functionDeclarationNode = NodeMocks.getFunctionDeclarationNode(
  33. functionName,
  34. NodeMocks.getBlockStatementNode()
  35. );
  36. });
  37. describe('if `functionDeclaration` node parent node is not a Program node', () => {
  38. let blockStatementNode: IBlockStatementNode,
  39. functionDeclarationParentNode: IFunctionDeclarationNode;
  40. beforeEach(() => {
  41. blockStatementNode = NodeMocks.getBlockStatementNode([
  42. functionDeclarationNode,
  43. expressionStatementNode
  44. ]);
  45. functionDeclarationParentNode = NodeMocks.getFunctionDeclarationNode(
  46. 'functionDeclarationParentNode',
  47. blockStatementNode
  48. );
  49. programNode = NodeMocks.getProgramNode([
  50. functionDeclarationParentNode
  51. ]);
  52. programNode['parentNode'] = programNode;
  53. functionDeclarationParentNode['parentNode'] = programNode;
  54. blockStatementNode['parentNode'] = functionDeclarationParentNode;
  55. functionDeclarationNode['parentNode'] = blockStatementNode;
  56. expressionStatementNode['parentNode'] = blockStatementNode;
  57. functionDeclarationObfuscator.obfuscateNode(
  58. functionDeclarationNode,
  59. functionDeclarationNode['parentNode']
  60. );
  61. });
  62. it('should obfuscate function name inside `functionDeclaration` parent scope', () => {
  63. assert.match(functionDeclarationNode.id.name, /^_0x\w+$/);
  64. });
  65. it('should obfuscate function name in `functionDeclaration` calls inside `functionDeclaration` parent scope', () => {
  66. assert.match((<any>expressionStatementNode).expression.callee.name, /^_0x\w+$/);
  67. });
  68. });
  69. describe('if `functionDeclaration` node parent node is a Program node', () => {
  70. beforeEach(() => {
  71. programNode = NodeMocks.getProgramNode([
  72. functionDeclarationNode
  73. ]);
  74. functionDeclarationNode['parentNode'] = programNode;
  75. expressionStatementNode['parentNode'] = programNode;
  76. functionDeclarationObfuscator.obfuscateNode(
  77. functionDeclarationNode,
  78. functionDeclarationNode['parentNode']
  79. );
  80. });
  81. it('shouldn\'t obfuscate function name inside `programNode` scope', () => {
  82. assert.equal(functionDeclarationNode.id.name, functionName);
  83. });
  84. it('should\'t obfuscate function name in `functionDeclaration` calls inside `programNode`', () => {
  85. assert.equal((<any>expressionStatementNode).expression.callee.name, functionName);
  86. });
  87. });
  88. });
  89. });