CustomNodeAppender refactoring

This commit is contained in:
sanex3339
2016-10-03 00:43:36 +03:00
parent deef3e5911
commit a3f8b2af25
18 changed files with 435 additions and 396 deletions
+28
View File
@@ -0,0 +1,28 @@
function foo () {
}
function bar () {
function inner1 () {
}
function inner2 () {
var inner3 = function () {
}
inner3();
}
inner2();
inner1();
}
function baz () {
}
baz();
foo();
bar();
+20
View File
@@ -0,0 +1,20 @@
bar();
function foo () {
}
function bar () {
}
function baz () {
function inner1 () {
}
inner1();
}
baz();
foo();
+5
View File
@@ -0,0 +1,5 @@
bar();
function bar () {
}
+7
View File
@@ -0,0 +1,7 @@
function bar () {
}
function baz () {
}
+1
View File
@@ -0,0 +1 @@
bar();
+9
View File
@@ -0,0 +1,9 @@
import * as fs from 'fs';
/**
* @param path
* @returns {string}
*/
export function readFileAsString (path: string): string {
return fs.readFileSync(path, 'utf8');
}
+2 -2
View File
@@ -13,8 +13,8 @@ import './unit-tests/OptionsNormalizer.spec';
import './unit-tests/SourceMapCorrector.spec';
import './unit-tests/Utils.spec';
import './unit-tests/cli/CLIUtils.spec';
import './unit-tests/hidden-node-appender/ASTTreeBlockScopeAnalyzer-spec';
import './unit-tests/hidden-node-appender/HiddenNodeAppender-spec';
import './unit-tests/custom-nodes/CustomNodeAppender-spec';
import './unit-tests/StackTraceAnalyzer-spec';
import './unit-tests/node-obfuscators/CatchClauseObfuscator.spec';
import './unit-tests/node-obfuscators/FunctionDeclarationObfuscator.spec';
import './unit-tests/node-obfuscators/FunctionObfuscator.spec';
@@ -2,13 +2,15 @@ import * as chai from 'chai';
import * as estraverse from 'estraverse';
import * as ESTree from 'estree';
import { TNodeWithBlockStatement } from '../../../src/types/TNodeWithBlockStatement';
import { TNodeWithBlockStatement } from '../../src/types/TNodeWithBlockStatement';
import { IBlockScopeTraceData } from '../../../src/interfaces/IBlockScopeTraceData';
import { IStackTraceData } from '../../src/interfaces/IStackTraceData';
import { ASTTreeBlockScopeAnalyzer } from '../../../src/hidden-node-appender/ASTTreeBlockScopeAnalyzer';
import { Nodes } from '../../../src/Nodes';
import { NodeUtils } from '../../../src/NodeUtils';
import { readFileAsString } from '../helpers/readFileAsString';
import { Nodes } from '../../src/Nodes';
import { NodeUtils } from '../../src/NodeUtils';
import { StackTraceAnalyzer } from '../../src/StackTraceAnalyzer';
const assert: any = chai.assert;
@@ -64,181 +66,144 @@ function getFunctionExpressionByName (astTree: ESTree.Node, name: string): ESTre
return functionExpressionNode;
}
describe('ASTTreeBlockScopeAnalyzer', () => {
describe('analyze (): IBlockScopeTraceData[]', () => {
describe('StackTraceAnalyzer', () => {
describe('analyze (): IStackTraceData[]', () => {
let ASTTree: TNodeWithBlockStatement,
blockScopeTraceData: IBlockScopeTraceData[],
expectedBlockScopeTraceData: IBlockScopeTraceData[];
blockScopeTraceData: IStackTraceData[],
expectedBlockScopeTraceData: IStackTraceData[];
it('should returns correct BlockScopeTraceData - variant #1', () => {
ASTTree = <ESTree.Program>NodeUtils.convertCodeToStructure(`
function foo () {
}
function bar () {
function inner1 () {
}
function inner2 () {
var inner3 = function () {
}
inner3();
}
inner2();
inner1();
}
function baz () {
}
baz();
foo();
bar();
`, false);
ASTTree = <ESTree.Program>NodeUtils.convertCodeToStructure(
readFileAsString(
require.resolve('../fixtures/stack-trace-analyzer/variant-1.js')
),
false
);
expectedBlockScopeTraceData = [
{
name: 'baz',
callee: (<ESTree.FunctionDeclaration>getFunctionDeclarationByName(ASTTree, 'baz')).body,
trace: []
stackTrace: []
},
{
name: 'foo',
callee: (<ESTree.FunctionDeclaration>getFunctionDeclarationByName(ASTTree, 'foo')).body,
trace: []
stackTrace: []
},
{
name: 'bar',
callee: (<ESTree.FunctionDeclaration>getFunctionDeclarationByName(ASTTree, 'bar')).body,
trace: [
stackTrace: [
{
name: 'inner2',
callee: (<ESTree.FunctionDeclaration>getFunctionDeclarationByName(ASTTree, 'inner2')).body,
trace: [
stackTrace: [
{
name: 'inner3',
callee: (<ESTree.FunctionExpression>getFunctionExpressionByName(ASTTree, 'inner3')).body,
trace: []
stackTrace: []
},
]
},
{
name: 'inner1',
callee: (<ESTree.FunctionDeclaration>getFunctionDeclarationByName(ASTTree, 'inner1')).body,
trace: []
stackTrace: []
},
]
}
];
blockScopeTraceData = new ASTTreeBlockScopeAnalyzer<IBlockScopeTraceData>(ASTTree.body).analyze();
blockScopeTraceData = new StackTraceAnalyzer(ASTTree.body).analyze();
assert.deepEqual(blockScopeTraceData, expectedBlockScopeTraceData);
});
it('should returns correct BlockScopeTraceData - variant #2', () => {
ASTTree = <ESTree.Program>NodeUtils.convertCodeToStructure(`
bar();
function foo () {
}
function bar () {
}
function baz () {
function inner1 () {
}
inner1();
}
baz();
foo();
`, false);
ASTTree = <ESTree.Program>NodeUtils.convertCodeToStructure(
readFileAsString(
require.resolve('../fixtures/stack-trace-analyzer/variant-2.js')
),
false
);
expectedBlockScopeTraceData = [
{
name: 'bar',
callee: (<ESTree.FunctionDeclaration>getFunctionDeclarationByName(ASTTree, 'bar')).body,
trace: []
stackTrace: []
},
{
name: 'baz',
callee: (<ESTree.FunctionDeclaration>getFunctionDeclarationByName(ASTTree, 'baz')).body,
trace: [
stackTrace: [
{
name: 'inner1',
callee: (<ESTree.FunctionDeclaration>getFunctionDeclarationByName(ASTTree, 'inner1')).body,
trace: []
stackTrace: []
},
]
},
{
name: 'foo',
callee: (<ESTree.FunctionDeclaration>getFunctionDeclarationByName(ASTTree, 'foo')).body,
trace: []
stackTrace: []
}
];
blockScopeTraceData = new ASTTreeBlockScopeAnalyzer<IBlockScopeTraceData>(ASTTree.body).analyze();
blockScopeTraceData = new StackTraceAnalyzer(ASTTree.body).analyze();
assert.deepEqual(blockScopeTraceData, expectedBlockScopeTraceData);
});
it('should returns correct BlockScopeTraceData - variant #3', () => {
ASTTree = <ESTree.Program>NodeUtils.convertCodeToStructure(`
bar();
function bar () {
}
`, false);
ASTTree = <ESTree.Program>NodeUtils.convertCodeToStructure(
readFileAsString(
require.resolve('../fixtures/stack-trace-analyzer/variant-3.js')
),
false
);
expectedBlockScopeTraceData = [
{
name: 'bar',
callee: (<ESTree.FunctionDeclaration>getFunctionDeclarationByName(ASTTree, 'bar')).body,
trace: []
stackTrace: []
}
];
blockScopeTraceData = new ASTTreeBlockScopeAnalyzer<IBlockScopeTraceData>(ASTTree.body).analyze();
blockScopeTraceData = new StackTraceAnalyzer(ASTTree.body).analyze();
assert.deepEqual(blockScopeTraceData, expectedBlockScopeTraceData);
});
it('should returns correct BlockScopeTraceData - variant #4', () => {
ASTTree = <ESTree.Program>NodeUtils.convertCodeToStructure(`
function bar () {
}
`, false);
ASTTree = <ESTree.Program>NodeUtils.convertCodeToStructure(
readFileAsString(
require.resolve('../fixtures/stack-trace-analyzer/variant-4.js')
),
false
);
expectedBlockScopeTraceData = [];
blockScopeTraceData = new ASTTreeBlockScopeAnalyzer<IBlockScopeTraceData>(ASTTree.body).analyze();
blockScopeTraceData = new StackTraceAnalyzer(ASTTree.body).analyze();
assert.deepEqual(blockScopeTraceData, expectedBlockScopeTraceData);
});
it('should returns correct BlockScopeTraceData - variant #5', () => {
ASTTree = <ESTree.Program>NodeUtils.convertCodeToStructure(`
bar();
`, false);
ASTTree = <ESTree.Program>NodeUtils.convertCodeToStructure(
readFileAsString(
require.resolve('../fixtures/stack-trace-analyzer/variant-5.js')
),
false
);
expectedBlockScopeTraceData = [];
blockScopeTraceData = new ASTTreeBlockScopeAnalyzer<IBlockScopeTraceData>(ASTTree.body).analyze();
blockScopeTraceData = new StackTraceAnalyzer(ASTTree.body).analyze();
assert.deepEqual(blockScopeTraceData, expectedBlockScopeTraceData);
});
@@ -1,12 +1,12 @@
import * as chai from 'chai';
import * as ESTree from 'estree';
import { HiddenNodeAppender } from '../../../src/hidden-node-appender/HiddenNodeAppender';
import { CustomNodeAppender } from '../../../src/custom-nodes/CustomNodeAppender';
import { NodeUtils } from '../../../src/NodeUtils';
const assert: any = chai.assert;
describe('ASTTreeBlockScopeAnalyzer', () => {
describe('CustomNodeAppender', () => {
describe('appendNode (blockScopeNode: TNodeWithBlockStatement, node: ESTree.Node): void', () => {
let astTree: ESTree.Program,
expectedAstTree: ESTree.Program,
@@ -80,7 +80,7 @@ describe('ASTTreeBlockScopeAnalyzer', () => {
bar();
`, false);
HiddenNodeAppender.appendNode(astTree.body, node);
CustomNodeAppender.appendNode(astTree.body, node);
NodeUtils.parentize(astTree);
@@ -150,7 +150,7 @@ describe('ASTTreeBlockScopeAnalyzer', () => {
foo();
`, false);
HiddenNodeAppender.appendNode(astTree.body, node);
CustomNodeAppender.appendNode(astTree.body, node);
NodeUtils.parentize(astTree);
@@ -225,7 +225,7 @@ describe('ASTTreeBlockScopeAnalyzer', () => {
foo();
`, false);
HiddenNodeAppender.appendNode(astTree.body, node, 2);
CustomNodeAppender.appendNode(astTree.body, node, 2);
NodeUtils.parentize(astTree);
@@ -264,7 +264,7 @@ describe('ASTTreeBlockScopeAnalyzer', () => {
foo();
`, false);
HiddenNodeAppender.appendNode(astTree.body, node, 1);
CustomNodeAppender.appendNode(astTree.body, node, 1);
NodeUtils.parentize(astTree);
@@ -278,21 +278,21 @@ describe('ASTTreeBlockScopeAnalyzer', () => {
let index: number;
for (let i = 0; i < 10; i++) {
index = HiddenNodeAppender.getIndexByThreshold(100, 0.1);
index = CustomNodeAppender.getIndexByThreshold(100, 0.1);
assert.isAtLeast(index, 0);
assert.isAtMost(index, 10);
}
for (let i = 0; i < 10; i++) {
index = HiddenNodeAppender.getIndexByThreshold(10, 0.5);
index = CustomNodeAppender.getIndexByThreshold(10, 0.5);
assert.isAtLeast(index, 0);
assert.isAtMost(index, 5);
}
for (let i = 0; i < 10; i++) {
index = HiddenNodeAppender.getIndexByThreshold(1, 1);
index = CustomNodeAppender.getIndexByThreshold(1, 1);
assert.isAtLeast(index, 0);
assert.isAtMost(index, 1);