Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(497)

Unified Diff: test/inspector/protocol-test.js

Issue 2890463004: [inspector] Refactor inspector test (Closed)
Patch Set: better crash fix Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « test/inspector/json-parse.js ('k') | test/inspector/runtime/create-context.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/inspector/protocol-test.js
diff --git a/test/inspector/protocol-test.js b/test/inspector/protocol-test.js
index 3884a16ed99a1bdd0183f48ea503fa6772ff50b8..9b85e24672c03c3cbf8c6ef3254ba64f97c67045 100644
--- a/test/inspector/protocol-test.js
+++ b/test/inspector/protocol-test.js
@@ -3,33 +3,102 @@
// found in the LICENSE file.
InspectorTest = {};
-InspectorTest._dispatchTable = new Map();
-InspectorTest._requestId = 0;
InspectorTest._dumpInspectorProtocolMessages = false;
-InspectorTest._eventHandler = {};
InspectorTest._commandsForLogging = new Set();
-Protocol = new Proxy({}, {
- get: function(target, agentName, receiver) {
- return new Proxy({}, {
- get: function(target, methodName, receiver) {
- const eventPattern = /^on(ce)?([A-Z][A-Za-z0-9]+)/;
- var match = eventPattern.exec(methodName);
- if (!match) {
- return (args, contextGroupId) => InspectorTest._sendCommandPromise(`${agentName}.${methodName}`, args || {}, contextGroupId);
- } else {
- var eventName = match[2];
- eventName = eventName.charAt(0).toLowerCase() + eventName.slice(1);
- if (match[1])
- return () => InspectorTest._waitForEventPromise(
- `${agentName}.${eventName}`);
- else
- return (listener) => { InspectorTest._eventHandler[`${agentName}.${eventName}`] = listener };
+InspectorTest.createContextGroup = function() {
+ var contextGroup = {};
+ contextGroup.id = utils.createContextGroup();
+ contextGroup.schedulePauseOnNextStatement = (reason, details) => utils.schedulePauseOnNextStatement(contextGroup.id, reason, details);
+ contextGroup.cancelPauseOnNextStatement = () => utils.cancelPauseOnNextStatement(contextGroup.id);
+ contextGroup.addScript = (string, lineOffset, columnOffset, url) => utils.compileAndRunWithOrigin(contextGroup.id, string, url || '', lineOffset || 0, columnOffset || 0, false);
+ contextGroup.addModule = (string, url, lineOffset, columnOffset) => utils.compileAndRunWithOrigin(contextGroup.id, string, url, lineOffset || 0, columnOffset || 0, true);
+ return contextGroup;
+}
+
+InspectorTest._sessions = new Map();
+InspectorTest.createSession = function(contextGroup) {
+ var session = {
+ contextGroup: contextGroup,
+ _dispatchTable: new Map(),
+ _eventHandler: {},
+ _requestId: 0,
+ };
+ session.Protocol = new Proxy({}, {
+ get: function(target, agentName, receiver) {
+ return new Proxy({}, {
+ get: function(target, methodName, receiver) {
+ const eventPattern = /^on(ce)?([A-Z][A-Za-z0-9]+)/;
+ var match = eventPattern.exec(methodName);
+ if (!match) {
+ return args => session._sendCommandPromise(`${agentName}.${methodName}`, args || {});
+ } else {
+ var eventName = match[2];
+ eventName = eventName.charAt(0).toLowerCase() + eventName.slice(1);
+ if (match[1])
+ return () => InspectorTest._waitForEventPromise(session, `${agentName}.${eventName}`);
+ else
+ return (listener) => { session._eventHandler[`${agentName}.${eventName}`] = listener };
+ }
+ }
+ });
+ }
+ });
+ session._dispatchMessage = messageString => {
+ let messageObject = JSON.parse(messageString);
+ if (InspectorTest._dumpInspectorProtocolMessages)
+ utils.print("backend: " + JSON.stringify(messageObject));
+ try {
+ var messageId = messageObject["id"];
+ if (typeof messageId === "number") {
+ var handler = session._dispatchTable.get(messageId);
+ if (handler) {
+ handler(messageObject);
+ session._dispatchTable.delete(messageId);
}
+ } else {
+ var eventName = messageObject["method"];
+ var eventHandler = session._eventHandler[eventName];
+ if (session._scriptMap && eventName === "Debugger.scriptParsed")
+ session._scriptMap.set(messageObject.params.scriptId, JSON.parse(JSON.stringify(messageObject.params)));
+ if (eventName === "Debugger.scriptParsed" && messageObject.params.url === "wait-pending-tasks.js")
+ return;
+ if (eventHandler)
+ eventHandler(messageObject);
}
- });
+ } catch (e) {
+ InspectorTest.log("Exception when dispatching message: " + e + "\n" + e.stack + "\n message = " + JSON.stringify(messageObject, null, 2));
+ InspectorTest.completeTest();
+ }
+ };
+ session.id = utils.connectSession(contextGroup.id, '', session._dispatchMessage.bind(session));
+ InspectorTest._sessions.set(session.id, session);
+ session.disconnect = () => utils.disconnectSession(session.id);
+ session.reconnect = () => {
+ InspectorTest._sessions.delete(session.id);
+ var state = utils.disconnectSession(session.id);
+ session.id = utils.connectSession(contextGroup.id, state, session._dispatchMessage.bind(session));
+ InspectorTest._sessions.set(session.id, session);
+ };
+ session.sendRawCommand = (requestId, command, handler) => {
+ if (InspectorTest._dumpInspectorProtocolMessages)
+ utils.print("frontend: " + command);
+ session._dispatchTable.set(requestId, handler);
+ utils.sendMessageToBackend(session.id, command);
+ }
+ session._sendCommandPromise = (method, params) => {
+ var requestId = ++session._requestId;
+ var messageObject = { "id": requestId, "method": method, "params": params };
+ var fulfillCallback;
+ var promise = new Promise(fulfill => fulfillCallback = fulfill);
+ if (InspectorTest._commandsForLogging.has(method)) {
+ utils.print(method + ' called');
+ }
+ session.sendRawCommand(requestId, JSON.stringify(messageObject), fulfillCallback);
+ return promise;
}
-});
+ return session;
+}
InspectorTest.logProtocolCommandCalls = (command) => InspectorTest._commandsForLogging.add(command);
@@ -108,28 +177,29 @@ InspectorTest.logObject = function(object, title)
InspectorTest.log(lines.join("\n"));
}
-InspectorTest.logCallFrames = function(callFrames)
+InspectorTest.logCallFrames = function(callFrames, session)
{
+ session = session || InspectorTest.session;
for (var frame of callFrames) {
var functionName = frame.functionName || '(anonymous)';
- var url = frame.url ? frame.url : InspectorTest._scriptMap.get(frame.location.scriptId).url;
+ var url = frame.url ? frame.url : session._scriptMap.get(frame.location.scriptId).url;
var lineNumber = frame.location ? frame.location.lineNumber : frame.lineNumber;
var columnNumber = frame.location ? frame.location.columnNumber : frame.columnNumber;
InspectorTest.log(`${functionName} (${url}:${lineNumber}:${columnNumber})`);
}
}
-InspectorTest.logSourceLocation = function(location)
+InspectorTest.logSourceLocation = function(location, session)
{
+ session = session || InspectorTest.session;
var scriptId = location.scriptId;
- if (!InspectorTest._scriptMap || !InspectorTest._scriptMap.has(scriptId)) {
+ if (!session._scriptMap || !session._scriptMap.has(scriptId)) {
InspectorTest.log("InspectorTest.setupScriptMap should be called before Protocol.Debugger.enable.");
InspectorTest.completeTest();
}
- var script = InspectorTest._scriptMap.get(scriptId);
+ var script = session._scriptMap.get(scriptId);
if (!script.scriptSource) {
- // TODO(kozyatinskiy): doesn't assume that contextId == contextGroupId.
- return Protocol.Debugger.getScriptSource({ scriptId }, script.executionContextId)
+ return session.Protocol.Debugger.getScriptSource({ scriptId })
.then(message => script.scriptSource = message.result.scriptSource)
.then(dumpSourceWithLocation);
}
@@ -146,14 +216,15 @@ InspectorTest.logSourceLocation = function(location)
}
}
-InspectorTest.logSourceLocations = function(locations) {
+InspectorTest.logSourceLocations = function(locations, session) {
if (locations.length == 0) return Promise.resolve();
- return InspectorTest.logSourceLocation(locations[0])
- .then(() => InspectorTest.logSourceLocations(locations.splice(1)));
+ return InspectorTest.logSourceLocation(locations[0], session)
+ .then(() => InspectorTest.logSourceLocations(locations.splice(1), session));
}
-InspectorTest.logAsyncStackTrace = function(asyncStackTrace)
+InspectorTest.logAsyncStackTrace = function(asyncStackTrace, session)
{
+ session = InspectorTest.session || session;
while (asyncStackTrace) {
if (asyncStackTrace.promiseCreationFrame) {
var frame = asyncStackTrace.promiseCreationFrame;
@@ -162,7 +233,7 @@ InspectorTest.logAsyncStackTrace = function(asyncStackTrace)
} else {
InspectorTest.log(`-- ${asyncStackTrace.description} --`);
}
- InspectorTest.logCallFrames(asyncStackTrace.callFrames);
+ InspectorTest.logCallFrames(asyncStackTrace.callFrames, session);
asyncStackTrace = asyncStackTrace.parent;
}
}
@@ -176,26 +247,17 @@ InspectorTest.completeTestAfterPendingTimeouts = function()
InspectorTest.waitPendingTasks = function()
{
- return Protocol.Runtime.evaluate({ expression: "new Promise(r => setTimeout(r, 0))//# sourceURL=wait-pending-tasks.js", awaitPromise: true });
+ var promises = [];
+ for (var session of InspectorTest._sessions.values())
+ promises.push(session.Protocol.Runtime.evaluate({ expression: "new Promise(r => setTimeout(r, 0))//# sourceURL=wait-pending-tasks.js", awaitPromise: true }));
+ return Promise.all(promises);
}
-InspectorTest.addScript = (string, lineOffset, columnOffset) => utils.compileAndRunWithOrigin(string, "", lineOffset || 0, columnOffset || 0, false);
-InspectorTest.addScriptWithUrl = (string, url) => utils.compileAndRunWithOrigin(string, url, 0, 0, false);
-InspectorTest.addModule = (string, url, lineOffset, columnOffset) => utils.compileAndRunWithOrigin(string, url, lineOffset || 0, columnOffset || 0, true);
-
InspectorTest.startDumpingProtocolMessages = function()
{
InspectorTest._dumpInspectorProtocolMessages = true;
}
-InspectorTest.sendRawCommand = function(requestId, command, handler, contextGroupId)
-{
- if (InspectorTest._dumpInspectorProtocolMessages)
- utils.print("frontend: " + command);
- InspectorTest._dispatchTable.set(requestId, handler);
- sendMessageToBackend(command, contextGroupId || 0);
-}
-
InspectorTest.checkExpectation = function(fail, name, messageObject)
{
if (fail === !!messageObject.error) {
@@ -210,10 +272,11 @@ InspectorTest.checkExpectation = function(fail, name, messageObject)
InspectorTest.expectedSuccess = InspectorTest.checkExpectation.bind(null, false);
InspectorTest.expectedError = InspectorTest.checkExpectation.bind(null, true);
-InspectorTest.setupScriptMap = function() {
- if (InspectorTest._scriptMap)
+InspectorTest.setupScriptMap = function(session) {
+ session = session || InspectorTest.session;
+ if (session._scriptMap)
return;
- InspectorTest._scriptMap = new Map();
+ session._scriptMap = new Map();
}
InspectorTest.runTestSuite = function(testSuite)
@@ -234,68 +297,28 @@ InspectorTest.runTestSuite = function(testSuite)
InspectorTest.runAsyncTestSuite = async function(testSuite) {
for (var test of testSuite) {
InspectorTest.log("\nRunning test: " + test.name);
- await test();
+ try {
+ await test();
+ } catch (e) {
+ utils.print(e.stack);
+ }
}
InspectorTest.completeTest();
}
-InspectorTest._sendCommandPromise = function(method, params, contextGroupId)
+InspectorTest._waitForEventPromise = function(session, eventName)
{
- var requestId = ++InspectorTest._requestId;
- var messageObject = { "id": requestId, "method": method, "params": params };
- var fulfillCallback;
- var promise = new Promise(fulfill => fulfillCallback = fulfill);
- if (InspectorTest._commandsForLogging.has(method)) {
- utils.print(method + ' called');
- }
- InspectorTest.sendRawCommand(requestId, JSON.stringify(messageObject), fulfillCallback, contextGroupId);
- return promise;
-}
-
-InspectorTest._waitForEventPromise = function(eventName)
-{
- return new Promise(fulfill => InspectorTest._eventHandler[eventName] = fullfillAndClearListener.bind(null, fulfill));
+ return new Promise(fulfill => session._eventHandler[eventName] = fullfillAndClearListener.bind(null, fulfill));
function fullfillAndClearListener(fulfill, result)
{
- delete InspectorTest._eventHandler[eventName];
+ delete session._eventHandler[eventName];
fulfill(result);
}
}
-InspectorTest._dispatchMessage = function(messageObject)
-{
- if (InspectorTest._dumpInspectorProtocolMessages)
- utils.print("backend: " + JSON.stringify(messageObject));
- try {
- var messageId = messageObject["id"];
- if (typeof messageId === "number") {
- var handler = InspectorTest._dispatchTable.get(messageId);
- if (handler) {
- handler(messageObject);
- InspectorTest._dispatchTable.delete(messageId);
- }
- } else {
- var eventName = messageObject["method"];
- var eventHandler = InspectorTest._eventHandler[eventName];
- if (InspectorTest._scriptMap && eventName === "Debugger.scriptParsed")
- InspectorTest._scriptMap.set(messageObject.params.scriptId, JSON.parse(JSON.stringify(messageObject.params)));
- if (eventName === "Debugger.scriptParsed" && messageObject.params.url === "wait-pending-tasks.js")
- return;
- if (eventHandler)
- eventHandler(messageObject);
- }
- } catch (e) {
- InspectorTest.log("Exception when dispatching message: " + e + "\n" + e.stack + "\n message = " + JSON.stringify(messageObject, null, 2));
- InspectorTest.completeTest();
- }
-}
-
-InspectorTest.loadScript = function(fileName) {
- InspectorTest.addScript(utils.read(fileName));
-}
-
-InspectorTest.setupInjectedScriptEnvironment = function(debug) {
+InspectorTest.setupInjectedScriptEnvironment = function(debug, session) {
+ session = session || InspectorTest.session;
let scriptSource = '';
// First define all getters on Object.prototype.
let injectedScriptSource = utils.read('src/inspector/injected-script-source.js');
@@ -314,17 +337,28 @@ InspectorTest.setupInjectedScriptEnvironment = function(debug) {
__proto__: null
});
`).join('\n') + '})();';
- InspectorTest.addScript(scriptSource);
+ session.contextGroup.addScript(scriptSource);
if (debug) {
InspectorTest.log('WARNING: InspectorTest.setupInjectedScriptEnvironment with debug flag for debugging only and should not be landed.');
InspectorTest.log('WARNING: run test with --expose-inspector-scripts flag to get more details.');
InspectorTest.log('WARNING: you can additionally comment rjsmin in xxd.py to get unminified injected-script-source.js.');
- InspectorTest.setupScriptMap();
- Protocol.Debugger.enable();
- Protocol.Debugger.onPaused(message => {
+ InspectorTest.setupScriptMap(session);
+ sesison.Protocol.Debugger.enable();
+ session.Protocol.Debugger.onPaused(message => {
let callFrames = message.params.callFrames;
- InspectorTest.logSourceLocations(callFrames.map(frame => frame.location));
+ InspectorTest.logSourceLocations(callFrames.map(frame => frame.location), session);
})
}
}
+
+try {
+ InspectorTest.contextGroup = InspectorTest.createContextGroup();
+ InspectorTest.session = InspectorTest.createSession(InspectorTest.contextGroup);
+ this.Protocol = InspectorTest.session.Protocol;
+ InspectorTest.addScript = InspectorTest.contextGroup.addScript.bind(InspectorTest.contextGroup);
+ InspectorTest.addModule = InspectorTest.contextGroup.addModule.bind(InspectorTest.contextGroup);
+ InspectorTest.loadScript = fileName => InspectorTest.addScript(utils.read(fileName));
+} catch (e) {
+ utils.print(e.stack);
+}
« no previous file with comments | « test/inspector/json-parse.js ('k') | test/inspector/runtime/create-context.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698