ConnectionLogger.Factory connectionLoggerFactory = new ConnectionLogger.Factory() {
public ConnectionLogger newConnectionLogger() {
return new SystemOutConnectionLogger();
}
};
JavascriptVm vm;
try {
vm = commandLineArgs.getProtocolType().connect(address, stateManager,
connectionLoggerFactory);
} catch (IOException e) {
throw new SmokeException("Failed to connect", e);
}
Collection<Script> scripts = loadScripts(vm);
// Finding script1.js script.
Script scriptOne;
lookForScript: {
for (Script script : scripts) {
String name = script.getName();
if (name != null && name.endsWith(SCRIPT_ONE_NAME)) {
scriptOne = script;
break lookForScript;
}
}
throw new SmokeException("Failed to find script " + SCRIPT_ONE_NAME);
}
// Getting a number of the line with the marker.
int breakLine = findSourceMark(scriptOne, BREAKPOINT_MARK);
if (breakLine == -1) {
throw new SmokeException("Failed to find mark in script");
}
// Setting a breakpoint.
CallbackSemaphore callbackSemaphore = new CallbackSemaphore();
Breakpoint.Target breakpointTarget = new Breakpoint.Target.ScriptName(scriptOne.getName());
RelayOk relayOk = vm.setBreakpoint(breakpointTarget, breakLine, 0, true, null,
null, callbackSemaphore);
callbackSemaphore.acquireDefault(relayOk);
// First time just suspend on breakpoint and go on.
{
DebugContext context = stateManager.expectEvent(EXPECT_SUSPENDED_VISITOR);
context.continueVm(DebugContext.StepAction.CONTINUE, 0, null);
stateManager.expectEvent(EXPECT_RESUMED_VISITOR);
}
// Second time check variables and expressions.
{
DebugContext context = stateManager.expectEvent(EXPECT_SUSPENDED_VISITOR);
{
// Check cache dropping.
JsObject root = evaluateSync(context.getGlobalEvaluateContext(),
"(debug_value_1 = {a:2})").getValue().asObject();
if (root == null) {
throw new RuntimeException();
}
String aValue;
aValue = root.getProperty("a").getValue().getValueString();
if (!"2".equals(aValue)) {
throw new SmokeException();
}
evaluateSync(context.getGlobalEvaluateContext(), "debug_value_1.a = 3");
root.getRemoteValueMapping().clearCaches();
aValue = root.getProperty("a").getValue().getValueString();
if (!"3".equals(aValue)) {
throw new SmokeException();
}
}
{
// Check literals.
for (LiteralTestCase literal : TEST_LITERALS) {
JsVariable resultVar = evaluateSync(context.getGlobalEvaluateContext(),
literal.javaScriptExpression);
JsValue resultValue = resultVar.getValue();
if (resultValue.getType() != literal.expectedType) {
throw new SmokeException("Unexpected type of '" + literal.javaScriptExpression +
"': " + resultValue.getType());
}
if (!literal.expectedDescription.equals(resultValue.getValueString())) {
throw new SmokeException("Unexpected string value of '" +
literal.javaScriptExpression + "': " + resultValue.getValueString());
}
}
}
// Do not block dispatcher thread.
stateManager.setDefaultReceiver(IGNORE_SCRIPTS_VISITOR);
List<? extends CallFrame> callFrames = context.getCallFrames();
CallFrame topFrame = callFrames.get(0);
JsScope localScope;
findScope: {
for (JsScope scope : topFrame.getVariableScopes()) {
if (scope.getType() == JsScope.Type.LOCAL) {
localScope = scope;
break findScope;
}
}
throw new SmokeException("Failed to find local scope");
}
JsVariable xVar = getVariable(localScope, "x");
if (!"1".equals(xVar.getValue().getValueString())) {
throw new SmokeException("Unexpected value of local variable");
}
JsVariable yVar = getVariable(localScope, "y");
if (!"2".equals(yVar.getValue().getValueString())) {
throw new SmokeException("Unexpected value of local variable");
}
for (CallFrame frame : callFrames) {
checkExpression(frame);
}
context.continueVm(DebugContext.StepAction.CONTINUE, 0, null);
stateManager.expectEvent(EXPECT_RESUMED_VISITOR);
}
stateManager.setDefaultReceiver(IGNORE_ALL_VISITOR);
vm.detach();
System.out.println("Test passed OK");
}