FunctionDeclarationObfuscator.spec.ts 4.3 KB

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