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

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

Issue 2891213002: [inspector] Refactor protocol-test.js (Closed)
Patch Set: comments addressed 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-expected.txt ('k') | test/inspector/runtime/await-promise.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 9b85e24672c03c3cbf8c6ef3254ba64f97c67045..a99a9f536d2db75ad57027834ec0e73f7107b680 100644
--- a/test/inspector/protocol-test.js
+++ b/test/inspector/protocol-test.js
@@ -5,107 +5,34 @@
InspectorTest = {};
InspectorTest._dumpInspectorProtocolMessages = false;
InspectorTest._commandsForLogging = new Set();
+InspectorTest._sessions = new Set();
-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.log = utils.print.bind(utils);
+InspectorTest.quitImmediately = utils.quit.bind(utils);
+
+InspectorTest.logProtocolCommandCalls = function(command) {
+ InspectorTest._commandsForLogging.add(command);
}
-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.completeTest = function() {
+ var promises = [];
+ for (var session of InspectorTest._sessions)
+ promises.push(session.Protocol.Debugger.disable());
+ Promise.all(promises).then(() => utils.quit());
}
-InspectorTest.logProtocolCommandCalls = (command) => InspectorTest._commandsForLogging.add(command);
+InspectorTest.waitForPendingTasks = function() {
+ var promises = [];
+ for (var session of InspectorTest._sessions)
+ promises.push(session.Protocol.Runtime.evaluate({ expression: "new Promise(r => setTimeout(r, 0))//# sourceURL=wait-for-pending-tasks.js", awaitPromise: true }));
+ return Promise.all(promises);
+}
-InspectorTest.log = utils.print.bind(null);
+InspectorTest.startDumpingProtocolMessages = function() {
+ InspectorTest._dumpInspectorProtocolMessages = true;
+}
-InspectorTest.logMessage = function(originalMessage)
-{
+InspectorTest.logMessage = function(originalMessage) {
var message = JSON.parse(JSON.stringify(originalMessage));
if (message.id)
message.id = "<messageId>";
@@ -129,12 +56,10 @@ InspectorTest.logMessage = function(originalMessage)
return originalMessage;
}
-InspectorTest.logObject = function(object, title)
-{
+InspectorTest.logObject = function(object, title) {
var lines = [];
- function dumpValue(value, prefix, prefixWithName)
- {
+ function dumpValue(value, prefix, prefixWithName) {
if (typeof value === "object" && value !== null) {
if (value instanceof Array)
dumpItems(value, prefix, prefixWithName);
@@ -145,8 +70,7 @@ InspectorTest.logObject = function(object, title)
}
}
- function dumpProperties(object, prefix, firstLinePrefix)
- {
+ function dumpProperties(object, prefix, firstLinePrefix) {
prefix = prefix || "";
firstLinePrefix = firstLinePrefix || prefix;
lines.push(firstLinePrefix + "{");
@@ -163,8 +87,7 @@ InspectorTest.logObject = function(object, title)
lines.push(prefix + "}");
}
- function dumpItems(object, prefix, firstLinePrefix)
- {
+ function dumpItems(object, prefix, firstLinePrefix) {
prefix = prefix || "";
firstLinePrefix = firstLinePrefix || prefix;
lines.push(firstLinePrefix + "[");
@@ -177,112 +100,222 @@ InspectorTest.logObject = function(object, title)
InspectorTest.log(lines.join("\n"));
}
-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 : 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.ContextGroup = class {
+ constructor() {
+ this.id = utils.createContextGroup();
}
-}
-InspectorTest.logSourceLocation = function(location, session)
-{
- session = session || InspectorTest.session;
- var scriptId = location.scriptId;
- if (!session._scriptMap || !session._scriptMap.has(scriptId)) {
- InspectorTest.log("InspectorTest.setupScriptMap should be called before Protocol.Debugger.enable.");
- InspectorTest.completeTest();
+ schedulePauseOnNextStatement(reason, details) {
+ utils.schedulePauseOnNextStatement(this.id, reason, details);
}
- var script = session._scriptMap.get(scriptId);
- if (!script.scriptSource) {
- return session.Protocol.Debugger.getScriptSource({ scriptId })
- .then(message => script.scriptSource = message.result.scriptSource)
- .then(dumpSourceWithLocation);
+
+ cancelPauseOnNextStatement() {
+ utils.cancelPauseOnNextStatement(this.id);
}
- return Promise.resolve().then(dumpSourceWithLocation);
-
- function dumpSourceWithLocation() {
- var lines = script.scriptSource.split('\n');
- var line = lines[location.lineNumber];
- line = line.slice(0, location.columnNumber) + '#' + (line.slice(location.columnNumber) || '');
- lines[location.lineNumber] = line;
- lines = lines.filter(line => line.indexOf('//# sourceURL=') === -1);
- InspectorTest.log(lines.slice(Math.max(location.lineNumber - 1, 0), location.lineNumber + 2).join('\n'));
- InspectorTest.log('');
+
+ addScript(string, lineOffset, columnOffset, url) {
+ utils.compileAndRunWithOrigin(this.id, string, url || '', lineOffset || 0, columnOffset || 0, false);
}
-}
-InspectorTest.logSourceLocations = function(locations, session) {
- if (locations.length == 0) return Promise.resolve();
- return InspectorTest.logSourceLocation(locations[0], session)
- .then(() => InspectorTest.logSourceLocations(locations.splice(1), session));
-}
+ addModule(string, url, lineOffset, columnOffset) {
+ utils.compileAndRunWithOrigin(this.id, string, url, lineOffset || 0, columnOffset || 0, true);
+ }
-InspectorTest.logAsyncStackTrace = function(asyncStackTrace, session)
-{
- session = InspectorTest.session || session;
- while (asyncStackTrace) {
- if (asyncStackTrace.promiseCreationFrame) {
- var frame = asyncStackTrace.promiseCreationFrame;
- InspectorTest.log(`-- ${asyncStackTrace.description} (${frame.url
- }:${frame.lineNumber}:${frame.columnNumber})--`);
- } else {
- InspectorTest.log(`-- ${asyncStackTrace.description} --`);
+ loadScript(fileName) {
+ this.addScript(utils.read(fileName));
+ }
+
+ connect() {
+ return new InspectorTest.Session(this);
+ }
+
+ setupInjectedScriptEnvironment(debug) {
+ let scriptSource = '';
+ // First define all getters on Object.prototype.
+ let injectedScriptSource = utils.read('src/inspector/injected-script-source.js');
+ let getterRegex = /\.[a-zA-Z0-9]+/g;
+ let match;
+ let getters = new Set();
+ while (match = getterRegex.exec(injectedScriptSource)) {
+ getters.add(match[0].substr(1));
+ }
+ scriptSource += `(function installSettersAndGetters() {
+ let defineProperty = Object.defineProperty;
+ let ObjectPrototype = Object.prototype;\n`;
+ scriptSource += Array.from(getters).map(getter => `
+ defineProperty(ObjectPrototype, '${getter}', {
+ set() { debugger; throw 42; }, get() { debugger; throw 42; },
+ __proto__: null
+ });
+ `).join('\n') + '})();';
+ this.addScript(scriptSource);
+
+ if (debug) {
+ InspectorTest.log('WARNING: 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.');
+ var session = InspectorTest._sessions.next().vale;
+ session.setupScriptMap();
+ sesison.Protocol.Debugger.enable();
+ session.Protocol.Debugger.onPaused(message => {
+ let callFrames = message.params.callFrames;
+ session.logSourceLocations(callFrames.map(frame => frame.location));
+ })
}
- InspectorTest.logCallFrames(asyncStackTrace.callFrames, session);
- asyncStackTrace = asyncStackTrace.parent;
}
-}
+};
+
+InspectorTest.Session = class {
+ constructor(contextGroup) {
+ this.contextGroup = contextGroup;
+ this._dispatchTable = new Map();
+ this._eventHandlers = new Map();
+ this._requestId = 0;
+ this.Protocol = this._setupProtocol();
+ InspectorTest._sessions.add(this);
+ this.id = utils.connectSession(contextGroup.id, '', this._dispatchMessage.bind(this));
+ }
-InspectorTest.completeTest = () => Protocol.Debugger.disable().then(() => utils.quit());
+ disconnect() {
+ InspectorTest._sessions.delete(this);
+ utils.disconnectSession(this.id);
+ }
-InspectorTest.completeTestAfterPendingTimeouts = function()
-{
- InspectorTest.waitPendingTasks().then(InspectorTest.completeTest);
-}
+ reconnect() {
+ var state = utils.disconnectSession(this.id);
+ this.id = utils.connectSession(this.contextGroup.id, state, this._dispatchMessage.bind(this));
+ }
-InspectorTest.waitPendingTasks = function()
-{
- 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);
-}
+ sendRawCommand(requestId, command, handler) {
+ if (InspectorTest._dumpInspectorProtocolMessages)
+ utils.print("frontend: " + command);
+ this._dispatchTable.set(requestId, handler);
+ utils.sendMessageToBackend(this.id, command);
+ }
-InspectorTest.startDumpingProtocolMessages = function()
-{
- InspectorTest._dumpInspectorProtocolMessages = true;
-}
+ setupScriptMap() {
+ if (this._scriptMap)
+ return;
+ this._scriptMap = new Map();
+ }
-InspectorTest.checkExpectation = function(fail, name, messageObject)
-{
- if (fail === !!messageObject.error) {
- InspectorTest.log("PASS: " + name);
- return true;
+ logCallFrames(callFrames) {
+ for (var frame of callFrames) {
+ var functionName = frame.functionName || '(anonymous)';
+ var url = frame.url ? frame.url : this._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.log("FAIL: " + name + ": " + JSON.stringify(messageObject));
- InspectorTest.completeTest();
- return false;
-}
-InspectorTest.expectedSuccess = InspectorTest.checkExpectation.bind(null, false);
-InspectorTest.expectedError = InspectorTest.checkExpectation.bind(null, true);
-
-InspectorTest.setupScriptMap = function(session) {
- session = session || InspectorTest.session;
- if (session._scriptMap)
- return;
- session._scriptMap = new Map();
-}
+ logSourceLocation(location) {
+ var scriptId = location.scriptId;
+ if (!this._scriptMap || !this._scriptMap.has(scriptId)) {
+ InspectorTest.log("setupScriptMap should be called before Protocol.Debugger.enable.");
+ InspectorTest.completeTest();
+ }
+ var script = this._scriptMap.get(scriptId);
+ if (!script.scriptSource) {
+ return this.Protocol.Debugger.getScriptSource({ scriptId })
+ .then(message => script.scriptSource = message.result.scriptSource)
+ .then(dumpSourceWithLocation);
+ }
+ return Promise.resolve().then(dumpSourceWithLocation);
+
+ function dumpSourceWithLocation() {
+ var lines = script.scriptSource.split('\n');
+ var line = lines[location.lineNumber];
+ line = line.slice(0, location.columnNumber) + '#' + (line.slice(location.columnNumber) || '');
+ lines[location.lineNumber] = line;
+ lines = lines.filter(line => line.indexOf('//# sourceURL=') === -1);
+ InspectorTest.log(lines.slice(Math.max(location.lineNumber - 1, 0), location.lineNumber + 2).join('\n'));
+ InspectorTest.log('');
+ }
+ }
+
+ logSourceLocations(locations) {
+ if (locations.length == 0) return Promise.resolve();
+ return this.logSourceLocation(locations[0]).then(() => this.logSourceLocations(locations.splice(1)));
+ }
+
+ logAsyncStackTrace(asyncStackTrace) {
+ while (asyncStackTrace) {
+ if (asyncStackTrace.promiseCreationFrame) {
+ var frame = asyncStackTrace.promiseCreationFrame;
+ InspectorTest.log(`-- ${asyncStackTrace.description} (${frame.url}:${frame.lineNumber}:${frame.columnNumber})--`);
+ } else {
+ InspectorTest.log(`-- ${asyncStackTrace.description} --`);
+ }
+ this.logCallFrames(asyncStackTrace.callFrames);
+ asyncStackTrace = asyncStackTrace.parent;
+ }
+ }
+
+ _sendCommandPromise(method, params) {
+ if (InspectorTest._commandsForLogging.has(method))
+ utils.print(method + ' called');
+ var requestId = ++this._requestId;
+ var messageObject = { "id": requestId, "method": method, "params": params };
+ return new Promise(fulfill => this.sendRawCommand(requestId, JSON.stringify(messageObject), fulfill));
+ }
+
+ _setupProtocol() {
+ return new Proxy({}, { get: (target, agentName, receiver) => new Proxy({}, {
+ get: (target, methodName, receiver) => {
+ const eventPattern = /^on(ce)?([A-Z][A-Za-z0-9]+)/;
+ var match = eventPattern.exec(methodName);
+ if (!match)
+ return args => this._sendCommandPromise(`${agentName}.${methodName}`, args || {});
+ var eventName = match[2];
+ eventName = eventName.charAt(0).toLowerCase() + eventName.slice(1);
+ if (match[1])
+ return () => this._waitForEventPromise(`${agentName}.${eventName}`);
+ return listener => this._eventHandlers.set(`${agentName}.${eventName}`, listener);
+ }
+ })});
+ }
+
+ _dispatchMessage(messageString) {
+ var messageObject = JSON.parse(messageString);
+ if (InspectorTest._dumpInspectorProtocolMessages)
+ utils.print("backend: " + JSON.stringify(messageObject));
+ try {
+ var messageId = messageObject["id"];
+ if (typeof messageId === "number") {
+ var handler = this._dispatchTable.get(messageId);
+ if (handler) {
+ handler(messageObject);
+ this._dispatchTable.delete(messageId);
+ }
+ } else {
+ var eventName = messageObject["method"];
+ var eventHandler = this._eventHandlers.get(eventName);
+ if (this._scriptMap && eventName === "Debugger.scriptParsed")
+ this._scriptMap.set(messageObject.params.scriptId, JSON.parse(JSON.stringify(messageObject.params)));
+ if (eventName === "Debugger.scriptParsed" && messageObject.params.url === "wait-for-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();
+ }
+ };
+
+ _waitForEventPromise(eventName) {
+ return new Promise(fulfill => {
+ this._eventHandlers.set(eventName, result => {
+ delete this._eventHandlers.delete(eventName);
+ fulfill(result);
+ });
+ });
+ }
+};
-InspectorTest.runTestSuite = function(testSuite)
-{
- function nextTest()
- {
+InspectorTest.runTestSuite = function(testSuite) {
+ function nextTest() {
if (!testSuite.length) {
InspectorTest.completeTest();
return;
@@ -306,59 +339,13 @@ InspectorTest.runAsyncTestSuite = async function(testSuite) {
InspectorTest.completeTest();
}
-InspectorTest._waitForEventPromise = function(session, eventName)
-{
- return new Promise(fulfill => session._eventHandler[eventName] = fullfillAndClearListener.bind(null, fulfill));
-
- function fullfillAndClearListener(fulfill, result)
- {
- delete session._eventHandler[eventName];
- fulfill(result);
+InspectorTest.start = function(description) {
+ try {
+ InspectorTest.log(description);
+ var contextGroup = new InspectorTest.ContextGroup();
+ var session = contextGroup.connect();
+ return { session: session, contextGroup: contextGroup, Protocol: session.Protocol };
+ } catch (e) {
+ utils.print(e.stack);
}
}
-
-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');
- let getterRegex = /\.[a-zA-Z0-9]+/g;
- let match;
- let getters = new Set();
- while (match = getterRegex.exec(injectedScriptSource)) {
- getters.add(match[0].substr(1));
- }
- scriptSource += `(function installSettersAndGetters() {
- let defineProperty = Object.defineProperty;
- let ObjectPrototype = Object.prototype;\n`;
- scriptSource += Array.from(getters).map(getter => `
- defineProperty(ObjectPrototype, '${getter}', {
- set() { debugger; throw 42; }, get() { debugger; throw 42; },
- __proto__: null
- });
- `).join('\n') + '})();';
- 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(session);
- sesison.Protocol.Debugger.enable();
- session.Protocol.Debugger.onPaused(message => {
- let callFrames = message.params.callFrames;
- 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-expected.txt ('k') | test/inspector/runtime/await-promise.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698