diff options
author | eutarass | 2011-03-08 18:31:31 +0000 |
---|---|---|
committer | eutarass | 2011-03-08 18:31:31 +0000 |
commit | 2cf73697cb791a3581c7f2bee6df87e44be08d86 (patch) | |
tree | 244874f5223d7c3083b5b9894756003fae6af392 | |
parent | 9e7e736abaa01e4c1917cf8505c97d6b6a16a1c0 (diff) | |
download | org.eclipse.tcf-2cf73697cb791a3581c7f2bee6df87e44be08d86.tar.gz org.eclipse.tcf-2cf73697cb791a3581c7f2bee6df87e44be08d86.tar.xz org.eclipse.tcf-2cf73697cb791a3581c7f2bee6df87e44be08d86.zip |
TCF Tests: more tests for run control groups
2 files changed, 44 insertions, 19 deletions
diff --git a/plugins/org.eclipse.tm.tcf.debug/src/org/eclipse/tm/internal/tcf/debug/tests/TCFTestSuite.java b/plugins/org.eclipse.tm.tcf.debug/src/org/eclipse/tm/internal/tcf/debug/tests/TCFTestSuite.java index 26999f888..2bbb12598 100644 --- a/plugins/org.eclipse.tm.tcf.debug/src/org/eclipse/tm/internal/tcf/debug/tests/TCFTestSuite.java +++ b/plugins/org.eclipse.tm.tcf.debug/src/org/eclipse/tm/internal/tcf/debug/tests/TCFTestSuite.java @@ -251,6 +251,10 @@ public class TCFTestSuite { return active_tests.get(test) != null; } + Collection<ITCFTest> getActiveTests() { + return active_tests.keySet(); + } + void done(ITCFTest test, Throwable error) { assert active_tests.get(test) != null; if (error != null && !canceled) errors.add(error); diff --git a/plugins/org.eclipse.tm.tcf.debug/src/org/eclipse/tm/internal/tcf/debug/tests/TestRCBP1.java b/plugins/org.eclipse.tm.tcf.debug/src/org/eclipse/tm/internal/tcf/debug/tests/TestRCBP1.java index bdc9139fa..943894820 100644 --- a/plugins/org.eclipse.tm.tcf.debug/src/org/eclipse/tm/internal/tcf/debug/tests/TestRCBP1.java +++ b/plugins/org.eclipse.tm.tcf.debug/src/org/eclipse/tm/internal/tcf/debug/tests/TestRCBP1.java @@ -103,7 +103,7 @@ class TestRCBP1 implements ITCFTest, IRunControl.RunControlListener { final Map<String,Object> params; boolean get_state_pending; - boolean resume_pending; + boolean ok_to_resume; SuspendedContext(String id, String pc, String reason, Map<String,Object> params) { this.id = id; @@ -855,7 +855,7 @@ class TestRCBP1 implements ITCFTest, IRunControl.RunControlListener { return; } SuspendedContext sc = suspended.remove(id); - if (sc == null || sc.get_state_pending) { + if (sc == null || sc.get_state_pending && ctx.getRCGroup() == null) { exit(new Exception("Unexpected contextResumed event: " + id)); return; } @@ -947,7 +947,7 @@ class TestRCBP1 implements ITCFTest, IRunControl.RunControlListener { assert resume_cmds.get(sc.id) == null; Runnable done = new Runnable() { public void run() { - resume(sc.id); + if (suspended.get(sc.id) == sc) resume(sc.id); } }; if (my_breakpoint) { @@ -1019,15 +1019,21 @@ class TestRCBP1 implements ITCFTest, IRunControl.RunControlListener { suspended.put(id, sc); } if (!bp_sync_done) return; + assert get_state_cmds.size() == 0; assert resume_cmds.get(id) == null; + assert suspended.get(id) == sc; assert !sc.get_state_pending; sc.get_state_pending = true; + final SuspendedContext sc0 = sc; ctx.getState(new IRunControl.DoneGetState() { public void doneGetState(IToken token, Exception error, boolean susp, String pc, String reason, Map<String, Object> params) { if (error != null) { exit(error); } + else if (suspended.get(id) != sc0) { + exit(new Exception("Context resumed before RunControl.getState result")); + } else if (!susp) { exit(new Exception("Invalid RunControl.getState result")); } @@ -1053,30 +1059,40 @@ class TestRCBP1 implements ITCFTest, IRunControl.RunControlListener { }); } + private boolean canResume(IRunControl.RunControlContext ctx) { + String grp = ctx.getRCGroup(); + if (grp != null) { + for (ITCFTest test : test_suite.getActiveTests()) { + if (test instanceof TestRCBP1) { + TestRCBP1 rcbp = (TestRCBP1)test; + for (IRunControl.RunControlContext x : rcbp.threads.values()) { + if (!grp.equals(x.getRCGroup())) continue; + SuspendedContext sc = rcbp.suspended.get(x.getID()); + if (sc == null) { + if (rcbp != TestRCBP1.this) return false; + exit(new Exception("Invalid value of run control group ID")); + return false; + } + if (!sc.ok_to_resume) return false; + } + } + } + } + return true; + } + private void resume(final String id) { assert done_get_state || resume_cnt == 0; assert resume_cmds.get(id) == null; assert bp_sync_done; resume_cnt++; final SuspendedContext sc = suspended.get(id); - IRunControl.RunControlContext ctx = threads.get(id); + final IRunControl.RunControlContext ctx = threads.get(id); if (ctx != null && sc != null) { assert !sc.get_state_pending; - assert !sc.resume_pending; - String grp = ctx.getRCGroup(); - sc.resume_pending = true; - if (grp != null) { - for (IRunControl.RunControlContext x : threads.values()) { - if (grp.equals(x.getRCGroup())) { - SuspendedContext sx = suspended.get(x.getID()); - if (sx == null) { - exit(new Exception("Invalid value of run control group ID")); - return; - } - if (!sx.resume_pending) return; - } - } - } + assert !sc.ok_to_resume; + sc.ok_to_resume = true; + if (!canResume(ctx)) return; int rm = IRunControl.RM_RESUME; if (isMyBreakpoint(sc)) { rm = rnd.nextInt(6); @@ -1087,6 +1103,11 @@ class TestRCBP1 implements ITCFTest, IRunControl.RunControlListener { if (test_suite.cancel) return; if (!test_suite.isActive(TestRCBP1.this)) return; if (threads.get(id) == null) return; + if (error instanceof IErrorReport && + ((IErrorReport)error).getErrorCode() == IErrorReport.TCF_ERROR_ALREADY_RUNNING && + ctx.getRCGroup() != null) { + error = null; + } if (error != null) { exit(error); return; |