/*******************************************************************************
* Copyright (c) 2008, 2009 Wind River Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.tests.dsf.pda.service.command;
import java.io.File;
import org.eclipse.cdt.examples.dsf.pda.PDAPlugin;
import org.eclipse.core.runtime.Path;
import org.junit.BeforeClass;
import org.junit.Test;
/**
*
*/
public class Test9 extends CommandControlTestsBase {
@BeforeClass
public static void setProgram() {
File programFile = PDAPlugin.getFileInPlugin(new Path("pdavm/tests/vmtest9.pda"));
fProgram = programFile.getPath();
}
@Test
public void testThreadsWithVMRC() throws Throwable {
expectEvent("started 1");
sendCommand("state", "client");
sendCommand("state 1", "vm");
// Check error responses
sendCommand("vmsuspend", "error: vm already suspended");
sendCommand("resume 1", "error: cannot resume thread when vm is suspended");
// Run to thread create routine
sendCommand("threads", "1");
sendCommand("set 2 1");
sendCommand("vmresume");
expectEvent("vmresumed client");
expectEvent("vmsuspended 1 breakpoint 2");
sendCommand("state", "1 breakpoint 2");
sendCommand("state 1", "vm");
// Step over first thread create
sendCommand("step 1");
expectEvent("vmresumed step");
expectEvent("started 2");
expectEvent("vmsuspended 1 step");
sendCommand("state", "1 step");
sendCommand("state 1", "vm");
sendCommand("threads", "1 2");
sendCommand("stack 1", fProgram + "|3|main");
sendCommand("stack 2", fProgram + "|9|foo");
sendCommand("step 1");
expectEvent("vmresumed step");
expectEvent("vmsuspended 1 step");
sendCommand("stack 1", fProgram + "|4|main");
sendCommand("stack 2", fProgram + "|10|foo");
sendCommand("vmresume");
expectEvent("vmresumed client");
expectOutput("thread_created");
expectEvent("vmsuspended 1 breakpoint 2");
// Step over second thread create
sendCommand("step 2");
expectEvent("vmresumed step");
expectEvent("started 3");
expectEvent("vmsuspended 2 step");
sendCommand("threads", "1 2 3");
sendCommand("stack 1", fProgram + "|3|main");
sendCommand("stack 2", fProgram + "|13|foo#" + fProgram + "|15|inner");
sendCommand("stack 3", fProgram + "|9|foo");
sendCommand("step 3");
expectEvent("vmresumed step");
expectEvent("vmsuspended 3 step");
sendCommand("stack 1", fProgram + "|4|main");
sendCommand("stack 2", fProgram + "|13|foo#" + fProgram + "|16|inner|b");
sendCommand("stack 3", fProgram + "|10|foo");
// Run to the end and watch threads starting/exiting.
sendCommand("clear 2");
sendCommand("vmresume");
expectOutput("thread_created");
expectEvent("vmresumed client");
expectEvent("started 4");
expectEvent("exited 2");
expectEvent("started 5");
expectEvent("exited 3");
expectEvent("started 6");
expectEvent("exited 4");
expectEvent("exited 1");
expectEvent("exited 5");
expectEvent("exited 6");
expectEvent("terminated");
}
@Test
public void testThreadsWithThreadRC() throws Throwable {
expectEvent("started 1");
// Check error responses for thread run control
sendCommand("set 1 0");
sendCommand("vmresume");
expectEvent("vmresumed client");
expectEvent("suspended 1 breakpoint 1");
sendCommand("state", "running");
sendCommand("state 1", "breakpoint 1");
sendCommand("resume", "error: invalid thread");
sendCommand("vmresume", "error: vm already running");
sendCommand("clear 1");
sendCommand("suspend 1", "error: thread already suspended");
sendCommand("vmsuspend");
expectEvent("vmsuspended client");
sendCommand("state", "client");
sendCommand("state 1", "vm");
sendCommand("suspend 1", "error: vm already suspended");
sendCommand("resume 1", "error: cannot resume thread when vm is suspended");
// Create breakpoints at thread create and thread entry point.
sendCommand("set 2 0");
sendCommand("set 10 0");
sendCommand("vmresume");
expectEvent("vmresumed client");
expectEvent("suspended 1 breakpoint 2");
// Create first thread, and run it to completion
sendCommand("resume 1");
expectEvent("resumed 1 client");
expectEvent("started 2");
expectEvent("suspended 2 breakpoint 10");
expectEvent("suspended 1 breakpoint 2");
sendCommand("state 1", "breakpoint 2");
sendCommand("state 2", "breakpoint 10");
sendCommand("threads", "1 2");
sendCommand("resume 2");
expectEvent("resumed 2 client");
expectEvent("exited 2");
sendCommand("threads", "1");
// Create second thread, step it
sendCommand("resume 1");
expectEvent("resumed 1 client");
expectEvent("started 3");
expectEvent("suspended 3 breakpoint 10");
expectEvent("suspended 1 breakpoint 2");
sendCommand("threads", "1 3");
sendCommand("stack 1", fProgram + "|2|main");
sendCommand("stack 3", fProgram + "|10|foo");
sendCommand("step 3");
expectEvent("resumed 3 step");
expectEvent("suspended 3 step");
sendCommand("state 1", "breakpoint 2");
sendCommand("state 3", "step");
sendCommand("stack 1", fProgram + "|2|main");
sendCommand("stack 3", fProgram + "|11|foo");
// Create the rest of threads
sendCommand("resume 1");
expectEvent("resumed 1 client");
expectEvent("started 4");
expectEvent("suspended 4 breakpoint 10");
expectEvent("suspended 1 breakpoint 2");
sendCommand("threads", "1 3 4");
sendCommand("resume 1");
expectEvent("resumed 1 client");
expectEvent("started 5");
expectEvent("suspended 5 breakpoint 10");
expectEvent("suspended 1 breakpoint 2");
sendCommand("threads", "1 3 4 5");
sendCommand("resume 1");
expectEvent("resumed 1 client");
// Main thread exits
expectEvent("started 6");
expectEvent("suspended 6 breakpoint 10");
expectEvent("exited 1");
sendCommand("threads", "3 4 5 6");
// Exit
sendCommand("exit");
expectEvent("terminated");
}
}