// Copyright 2012 Google Inc. All Rights Reserved.
//
// 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.
package com.google.collide.client.code.debugging;
import com.google.collide.client.code.debugging.DebuggerApiTypes.CssStyleSheetHeader;
import com.google.collide.client.code.debugging.DebuggerApiTypes.Location;
import com.google.collide.client.code.debugging.DebuggerApiTypes.OnAllCssStyleSheetsResponse;
import com.google.collide.client.code.debugging.DebuggerApiTypes.OnBreakpointResolvedResponse;
import com.google.collide.client.code.debugging.DebuggerApiTypes.OnEvaluateExpressionResponse;
import com.google.collide.client.code.debugging.DebuggerApiTypes.OnRemoteObjectPropertiesResponse;
import com.google.collide.client.code.debugging.DebuggerApiTypes.OnScriptParsedResponse;
import com.google.collide.client.code.debugging.DebuggerApiTypes.PropertyDescriptor;
import com.google.collide.client.code.debugging.DebuggerApiTypes.RemoteObject;
import com.google.collide.client.code.debugging.DebuggerApiTypes.RemoteObjectSubType;
import com.google.collide.client.code.debugging.DebuggerApiTypes.RemoteObjectType;
import com.google.collide.json.client.Jso;
import com.google.collide.json.shared.JsonArray;
import com.google.gwt.junit.client.GWTTestCase;
/**
* Tests for {@link DebuggerChromeApiUtils}.
*
*/
public class DebuggerChromeApiUtilsTest extends GWTTestCase {
@Override
public String getModuleName() {
return "com.google.collide.client.TestCode";
}
/*
// TODO: Update the test when the protocol is stable.
public void testParseOnPausedResponse() {
String serializedResponse = "{\"id\":null,\"method\":\"Debugger.paused\","
+ "\"target\":\"505600000\",\"result\":{\"details\":{\"callFrames\":[{\"functionName\":"
+ "\"\",\"id\":\"{\\\"ordinal\\\":0,\\\"injectedScriptId\\\":1}\",\"location\":"
+ "{\"columnNumber\":8,\"lineNumber\":9,\"scriptId\":\"32\"},\"scopeChain\":[{\"object\":"
+ "{\"className\":\"DOMWindow\",\"description\":\"DOMWindow\",\"objectId\":"
+ "\"{\\\"injectedScriptId\\\":1,\\\"id\\\":1}\",\"type\":\"object\"},\"type\":"
+ "\"global\"}],\"this\":{\"className\":\"DOMWindow\",\"description\":\"DOMWindow\","
+ "\"objectId\":\"{\\\"injectedScriptId\\\":1,\\\"id\\\":2}\",\"type\":\"object\"}}],"
+ "\"eventData\":{},\"eventType\":0}}}";
Jso response = Jso.deserialize(serializedResponse);
Jso request = response.getJsObjectField("request").cast();
Jso result = response.getJsObjectField("result").cast();
OnPausedResponse parsedResponse = DebuggerChromeApiUtils.parseOnPausedResponse(result);
assertNotNull(parsedResponse);
JsonArray<CallFrame> callFrames = parsedResponse.getCallFrames();
assertNotNull(callFrames);
assertEquals(1, callFrames.size());
// First call frame.
CallFrame callFrame = callFrames.get(0);
assertEquals("", callFrame.getFunctionName());
assertEquals("{\"ordinal\":0,\"injectedScriptId\":1}", callFrame.getId());
assertLocation(9, 8, "32", callFrame.getLocation());
assertRemoteObject("DOMWindow", true, "{\"injectedScriptId\":1,\"id\":2}",
RemoteObjectType.OBJECT, null, callFrame.getThis());
JsonArray<Scope> scopeChain = callFrame.getScopeChain();
assertNotNull(scopeChain);
assertEquals(1, scopeChain.size());
assertEquals(ScopeType.GLOBAL, scopeChain.get(0).getType());
assertRemoteObject("DOMWindow", true, "{\"injectedScriptId\":1,\"id\":1}",
RemoteObjectType.OBJECT, null, scopeChain.get(0).getObject());
}
*/
public void testParseOnBreakpointResolvedResponse() {
String serializedResponse = "{\"id\":null,\"method\":\"Debugger.breakpointResolved\","
+ "\"target\":\"48715528\",\"result\":{\"breakpointId\":"
+ "\"http://closure-library.googlecode.com/svn/trunk/closure/goog/base.js:317:0\","
+ "\"location\":{\"columnNumber\":4,\"lineNumber\":317,\"scriptId\":\"33\"}}}";
Jso response = Jso.deserialize(serializedResponse);
Jso request = response.getJsObjectField("request").cast();
Jso result = response.getJsObjectField("result").cast();
OnBreakpointResolvedResponse parsedResponse =
DebuggerChromeApiUtils.parseOnBreakpointResolvedResponse(request, result);
assertNotNull(parsedResponse);
assertEquals("http://closure-library.googlecode.com/svn/trunk/closure/goog/base.js:317:0",
parsedResponse.getBreakpointId());
assertNull(parsedResponse.getBreakpointInfo());
JsonArray<Location> locations = parsedResponse.getLocations();
assertNotNull(locations);
assertEquals(1, locations.size());
assertLocation(317, 4, "33", locations.get(0));
}
public void testParseOnRemoveBreakpoint() {
String serializedResponse = "{\"id\":4,\"method\":\"Debugger.removeBreakpoint\","
+ "\"target\":\"48715528\",\"request\":{\"breakpointId\":"
+ "\"http://closure-library.googlecode.com/svn/trunk/closure/goog/base.js:317:0\"},"
+ "\"result\":{}}";
Jso response = Jso.deserialize(serializedResponse);
Jso request = response.getJsObjectField("request").cast();
Jso result = response.getJsObjectField("result").cast();
String breakpointId = DebuggerChromeApiUtils.parseOnRemoveBreakpointResponse(request);
assertEquals("http://closure-library.googlecode.com/svn/trunk/closure/goog/base.js:317:0",
breakpointId);
}
public void testParseOnScriptParsedResponse() {
String serializedResponse = "{\"id\":null,\"method\":\"Debugger.scriptParsed\","
+ "\"target\":\"48715528\",\"result\":{\"endColumn\":1,\"endLine\":1502,"
+ "\"scriptId\":\"33\",\"startColumn\":0,\"startLine\":0,\"url\":"
+ "\"http://closure-library.googlecode.com/svn/trunk/closure/goog/base.js\"}}";
Jso response = Jso.deserialize(serializedResponse);
Jso request = response.getJsObjectField("request").cast();
Jso result = response.getJsObjectField("result").cast();
OnScriptParsedResponse parsedResponse = DebuggerChromeApiUtils.parseOnScriptParsedResponse(
result);
assertNotNull(parsedResponse);
assertEquals(0, parsedResponse.getStartLine());
assertEquals(0, parsedResponse.getStartColumn());
assertEquals(1502, parsedResponse.getEndLine());
assertEquals(1, parsedResponse.getEndColumn());
assertEquals("33", parsedResponse.getScriptId());
assertEquals("http://closure-library.googlecode.com/svn/trunk/closure/goog/base.js",
parsedResponse.getUrl());
assertFalse(parsedResponse.isContentScript());
}
public void testParseOnScriptParsedResponseForContentScript() {
String serializedResponse = "{\"id\":null,\"method\":\"Debugger.scriptParsed\","
+ "\"target\":\"48715528\",\"result\":{\"endColumn\":511,\"endLine\":18,"
+ "\"isContentScript\":true,\"scriptId\":\"32\",\"startColumn\":0,\"startLine\":0,"
+ "\"url\":\"chrome-extension://plcnnpdmhobdfbponjpedobekiogmbco/content/main.js\"}}";
Jso response = Jso.deserialize(serializedResponse);
Jso request = response.getJsObjectField("request").cast();
Jso result = response.getJsObjectField("result").cast();
OnScriptParsedResponse parsedResponse = DebuggerChromeApiUtils.parseOnScriptParsedResponse(
result);
assertNotNull(parsedResponse);
assertEquals(0, parsedResponse.getStartLine());
assertEquals(0, parsedResponse.getStartColumn());
assertEquals(18, parsedResponse.getEndLine());
assertEquals(511, parsedResponse.getEndColumn());
assertEquals("32", parsedResponse.getScriptId());
assertEquals("chrome-extension://plcnnpdmhobdfbponjpedobekiogmbco/content/main.js",
parsedResponse.getUrl());
assertTrue(parsedResponse.isContentScript());
}
public void testParseOnRemoteObjectPropertiesResponse() {
String serializedResponse = "{\"id\":5,\"method\":\"Runtime.getProperties\","
+ "\"target\":\"292044344\",\"request\":{\"objectId\":\"{\\\"injectedScriptId\\\":1,"
+ "\\\"id\\\":13}\",\"ignoreHasOwnProperty\":false},\"result\":{\"result\":"
+ "[{\"name\":\"msg\",\"value\":{\"description\":\"onTimer callback\","
+ "\"type\":\"string\"}},{\"name\":\"logs\",\"value\":{\"className\":"
+ "\"HTMLDivElement\",\"description\":\"HTMLDivElement\",\"hasChildren\":true,"
+ "\"objectId\":\"{\\\"injectedScriptId\\\":1,\\\"id\\\":19}\",\"type\":\"object\","
+ "\"subtype\":\"node\"}}]}}";
Jso response = Jso.deserialize(serializedResponse);
Jso request = response.getJsObjectField("request").cast();
Jso result = response.getJsObjectField("result").cast();
OnRemoteObjectPropertiesResponse parsedResponse =
DebuggerChromeApiUtils.parseOnRemoteObjectPropertiesResponse(request, result);
assertNotNull(parsedResponse);
assertEquals("{\"injectedScriptId\":1,\"id\":13}", parsedResponse.getObjectId().toString());
JsonArray<PropertyDescriptor> properties = parsedResponse.getProperties();
assertNotNull(properties);
assertEquals(2, properties.size());
PropertyDescriptor propertyDescriptor = properties.get(0);
assertNull(propertyDescriptor.getGetterFunction());
assertNull(propertyDescriptor.getSetterFunction());
assertEquals("msg", propertyDescriptor.getName());
assertRemoteObject("onTimer callback", false, null, RemoteObjectType.STRING, null,
propertyDescriptor.getValue());
assertFalse(propertyDescriptor.wasThrown());
propertyDescriptor = properties.get(1);
assertNull(propertyDescriptor.getGetterFunction());
assertNull(propertyDescriptor.getSetterFunction());
assertEquals("logs", propertyDescriptor.getName());
assertRemoteObject("HTMLDivElement", true, "{\"injectedScriptId\":1,\"id\":19}",
RemoteObjectType.OBJECT, RemoteObjectSubType.NODE, propertyDescriptor.getValue());
assertFalse(propertyDescriptor.wasThrown());
}
public void testParseOnEvaluateExpressionResponse() {
String serializedResponse = "{\"id\":8,\"method\":\"Debugger.evaluateOnCallFrame\","
+ "\"target\":\"400060083\",\"request\":{\"callFrameId\":\"{\\\"ordinal\\\":0,"
+ "\\\"injectedScriptId\\\":1}\",\"expression\":\"myArray\"},\"result\":{\"result\":{"
+ "\"className\":\"Array\",\"description\":\"Array[4]\",\"hasChildren\":true,\"objectId\":"
+ "\"{\\\"injectedScriptId\\\":1,\\\"id\\\":12}\",\"type\":\"object\","
+ "\"subtype\":\"array\"}}}";
Jso response = Jso.deserialize(serializedResponse);
Jso request = response.getJsObjectField("request").cast();
Jso result = response.getJsObjectField("result").cast();
OnEvaluateExpressionResponse parsedResponse =
DebuggerChromeApiUtils.parseOnEvaluateExpressionResponse(request, result);
assertNotNull(parsedResponse);
assertEquals("{\"ordinal\":0,\"injectedScriptId\":1}", parsedResponse.getCallFrameId());
assertEquals("myArray", parsedResponse.getExpression());
assertRemoteObject("Array[4]", true, "{\"injectedScriptId\":1,\"id\":12}",
RemoteObjectType.OBJECT, RemoteObjectSubType.ARRAY, parsedResponse.getResult());
assertFalse(parsedResponse.wasThrown());
}
public void testParseOnEvaluateExpressionResponseWasThrown() {
String serializedResponse = "{\"id\":9,\"method\":\"Debugger.evaluateOnCallFrame\","
+ "\"target\":\"400060083\",\"request\":{\"callFrameId\":\"{\\\"ordinal\\\":0,"
+ "\\\"injectedScriptId\\\":1}\",\"expression\":\"myArray1\"},\"result\":{\"result\":{"
+ "\"className\":\"ReferenceError\",\"description\":\"ReferenceError\","
+ "\"hasChildren\":true,\"objectId\":\"{\\\"injectedScriptId\\\":1,\\\"id\\\":13}\","
+ "\"type\":\"object\"},\"wasThrown\":true}}";
Jso response = Jso.deserialize(serializedResponse);
Jso request = response.getJsObjectField("request").cast();
Jso result = response.getJsObjectField("result").cast();
OnEvaluateExpressionResponse parsedResponse =
DebuggerChromeApiUtils.parseOnEvaluateExpressionResponse(request, result);
assertNotNull(parsedResponse);
assertEquals("{\"ordinal\":0,\"injectedScriptId\":1}", parsedResponse.getCallFrameId());
assertEquals("myArray1", parsedResponse.getExpression());
assertRemoteObject("ReferenceError", true, "{\"injectedScriptId\":1,\"id\":13}",
RemoteObjectType.OBJECT, null, parsedResponse.getResult());
assertTrue(parsedResponse.wasThrown());
}
public void testParseOnAllCssStyleSheetsResponse() {
String serializedResponse = "{\"id\":9,\"method\":\"CSS.getAllStyleSheets\","
+ "\"target\":\"400060083\",\"result\":{\"headers\":[{\"disabled\":false,"
+ "\"sourceURL\":\"http://localhost/test.css\",\"styleSheetId\":\"2\",\"title\":\"\"}]}}";
Jso response = Jso.deserialize(serializedResponse);
Jso request = response.getJsObjectField("request").cast();
Jso result = response.getJsObjectField("result").cast();
OnAllCssStyleSheetsResponse parsedResponse =
DebuggerChromeApiUtils.parseOnAllCssStyleSheetsResponse(result);
assertNotNull(parsedResponse);
JsonArray<CssStyleSheetHeader> headers = parsedResponse.getHeaders();
assertNotNull(headers);
assertEquals(1, headers.size());
CssStyleSheetHeader header = headers.get(0);
assertFalse(header.isDisabled());
assertEquals("2", header.getId());
assertEquals("", header.getTitle());
assertEquals("http://localhost/test.css", header.getUrl());
}
private void assertLocation(int lineNumber, int columnNumber, String scriptId, Location loc) {
assertEquals(lineNumber, loc.getLineNumber());
assertEquals(columnNumber, loc.getColumnNumber());
assertEquals(scriptId, loc.getScriptId());
}
private void assertRemoteObject(String description, boolean hasChildren, String objectId,
RemoteObjectType type, RemoteObjectSubType subtype, RemoteObject object) {
assertEquals(description, object.getDescription());
assertEquals(hasChildren, object.hasChildren());
if (objectId == null) {
assertNull(object.getObjectId());
} else {
assertNotNull(object.getObjectId());
assertEquals(objectId, object.getObjectId().toString());
}
assertEquals(type, object.getType());
assertEquals(subtype, object.getSubType());
}
}