FunctionDeclarationObfuscator.spec.ts 4.1 KB

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