| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 | import { assert } from 'chai';import { spawn } from 'threads';import { readFileAsString } from '../../../helpers/readFileAsString';import { NO_ADDITIONAL_NODES_PRESET } from '../../../../src/options/presets/NoCustomNodes';import { ObfuscationTarget } from '../../../../src/enums/ObfuscationTarget';import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscatorFacade';function spawnThread(inputCallback: Function, threadCallback: Function, timeoutCallback: Function): void {    const thread = spawn<string, number>((input: string, postMessage: Function) => {        postMessage(eval(input));    });    const timeout = setTimeout(() => {        thread.kill();        timeoutCallback();    }, 1500);    thread        .send(inputCallback())        .on('message', (response: number) => {            clearTimeout(timeout);            thread.kill();            threadCallback(response);        });}describe('DebugProtectionFunctionCallTemplate', () => {    describe('Variant #1: correctly obfuscated code`', () => {        const expectedEvaluationResult: number = 1;        let obfuscatedCode: string,            evaluationResult: number = 0;        beforeEach((done) => {            const code: string = readFileAsString(__dirname + '/fixtures/input.js');            obfuscatedCode = JavaScriptObfuscator.obfuscate(                code,                {                    ...NO_ADDITIONAL_NODES_PRESET,                    debugProtection: true                }            ).getObfuscatedCode();            spawnThread(                () => obfuscatedCode,                (response: number) => {                    evaluationResult = response;                    done();                },                () => {                    done();                }            );        });        it('should correctly evaluate code with enabled debug protection', () => {            assert.equal(evaluationResult, expectedEvaluationResult);        });    });    describe('Variant #2: correctly obfuscated code with enabled `mangle` option', () => {        const expectedEvaluationResult: number = 1;        let obfuscatedCode: string,            evaluationResult: number = 0;        beforeEach((done) => {            const code: string = readFileAsString(__dirname + '/fixtures/input.js');            obfuscatedCode = JavaScriptObfuscator.obfuscate(                code,                {                    ...NO_ADDITIONAL_NODES_PRESET,                    debugProtection: true,                    mangle: true                }            ).getObfuscatedCode();            spawnThread(                () => obfuscatedCode,                (response: number) => {                    evaluationResult = response;                    done();                },                () => {                    done();                }            );        });        it('should correctly evaluate code with enabled debug protection', () => {            assert.equal(evaluationResult, expectedEvaluationResult);        });    });    describe('Variant #3: correctly obfuscated code with target `extension`', () => {        const expectedEvaluationResult: number = 1;        let obfuscatedCode: string,            evaluationResult: number = 0;        beforeEach((done) => {            const code: string = readFileAsString(__dirname + '/fixtures/input.js');            obfuscatedCode = JavaScriptObfuscator.obfuscate(                code,                {                    ...NO_ADDITIONAL_NODES_PRESET,                    debugProtection: true,                    target: ObfuscationTarget.BrowserNoEval                }            ).getObfuscatedCode();            spawnThread(                () => obfuscatedCode,                (response: number) => {                    evaluationResult = response;                    done();                },                () => {                    done();                }            );        });        it('should correctly evaluate code with enabled debug protection', () => {            assert.equal(evaluationResult, expectedEvaluationResult);        });    });    describe('Variant #4: obfuscated code with removed debug protection code', () => {        const expectedEvaluationResult: number = 0;        let obfuscatedCode: string,            evaluationResult: number = 0;        beforeEach((done) => {            const code: string = readFileAsString(__dirname + '/fixtures/input.js');            obfuscatedCode = JavaScriptObfuscator.obfuscate(                code,                {                    ...NO_ADDITIONAL_NODES_PRESET,                    debugProtection: true                }            ).getObfuscatedCode();            obfuscatedCode = obfuscatedCode.replace(/\+\+ *_0x([a-f0-9]){4,6}/, '');            spawnThread(                () => obfuscatedCode,                (response: number) => {                    evaluationResult = response;                    done();                },                () => {                    done();                }            );        });        it('should enter code in infinity loop', () => {            assert.equal(evaluationResult, expectedEvaluationResult);        });    });    describe('Variant #5: single call of debug protection code', () => {        const expectedEvaluationResult: number = 1;        let obfuscatedCode: string,            evaluationResult: number = 0;        beforeEach((done) => {            const code: string = readFileAsString(__dirname + '/fixtures/single-call.js');            obfuscatedCode = JavaScriptObfuscator.obfuscate(                code,                {                    ...NO_ADDITIONAL_NODES_PRESET,                    debugProtection: true                }            ).getObfuscatedCode();            spawnThread(                () => obfuscatedCode,                (response: number) => {                    evaluationResult = response;                    done();                },                () => {                    done();                }            );        });        it('should correctly evaluate code with enabled debug protection', () => {            assert.equal(evaluationResult, expectedEvaluationResult);        });    });});
 |