forked from googleapis/cloud-debug-nodejs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest-duplicate-expressions.ts
112 lines (105 loc) · 3.72 KB
/
test-duplicate-expressions.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// Copyright 2015 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import consoleLogLevel = require('console-log-level');
import * as stackdriver from '../src/types/stackdriver';
// TODO: Have this actually implement Breakpoint
const breakpointInFoo: stackdriver.Breakpoint = {
id: 'fake-id-123',
location: {path: 'test-duplicate-expressions-code.js', line: 4},
} as stackdriver.Breakpoint;
import * as assert from 'assert';
import {afterEach, beforeEach, describe, it} from 'mocha';
import * as extend from 'extend';
import * as debugapi from '../src/agent/v8/debugapi';
import {defaultConfig} from '../src/agent/config';
import * as SourceMapper from '../src/agent/io/sourcemapper';
import * as scanner from '../src/agent/io/scanner';
import {Debuglet} from '../src/agent/debuglet';
// eslint-disable-next-line @typescript-eslint/no-var-requires
const foo = require('./test-duplicate-expressions-code.js');
// TODO: Determine why this must be named `stateIsClean1`.
function stateIsClean1(api: debugapi.DebugApi): boolean {
assert.strictEqual(
api.numBreakpoints_(),
0,
'there should be no breakpoints active'
);
assert.strictEqual(
api.numListeners_(),
0,
'there should be no listeners active'
);
return true;
}
describe(__filename, () => {
const config = extend({}, defaultConfig, {
workingDirectory: __dirname,
forceNewAgent_: true,
});
const logger = consoleLogLevel({
level: Debuglet.logLevelToName(config.logLevel),
});
let api: debugapi.DebugApi;
beforeEach(done => {
if (!api) {
scanner.scan(config.workingDirectory, /.js$/).then(async fileStats => {
assert.strictEqual(fileStats.errors().size, 0);
const jsStats = fileStats.selectStats(/.js$/);
const mapFiles = fileStats.selectFiles(/.map$/, process.cwd());
const mapper = await SourceMapper.create(mapFiles, logger);
// TODO: Handle the case when mapper is undefined
// TODO: Handle the case when v8debugapi.create returns null
api = debugapi.create(
logger,
config,
jsStats,
mapper as SourceMapper.SourceMapper
) as debugapi.DebugApi;
assert.ok(api, 'should be able to create the api');
done();
});
} else {
assert(stateIsClean1(api));
done();
}
});
afterEach(() => {
assert(stateIsClean1(api));
});
it('should not duplicate expressions', done => {
api.set(breakpointInFoo, err1 => {
assert.ifError(err1);
api.wait(breakpointInFoo, err2 => {
assert.ifError(err2);
// TODO: Determine how to remove this cast to any.
const frames = breakpointInFoo.stackFrames[0];
const exprs = frames.arguments.concat(frames.locals);
const varTableIndicesSeen: number[] = [];
exprs.forEach(expr => {
// TODO: Handle the case when expr.varTableIndex is undefined
assert.strictEqual(
varTableIndicesSeen.indexOf(expr.varTableIndex as number),
-1
);
varTableIndicesSeen.push(expr.varTableIndex as number);
});
api.clear(breakpointInFoo, err => {
assert.ifError(err);
done();
});
});
process.nextTick(foo);
});
});
});