Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/MIExpressionsTest.java')
-rw-r--r--dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/MIExpressionsTest.java7097
1 files changed, 3601 insertions, 3496 deletions
diff --git a/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/MIExpressionsTest.java b/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/MIExpressionsTest.java
index 441d71c8320..c9151a40fdd 100644
--- a/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/MIExpressionsTest.java
+++ b/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/MIExpressionsTest.java
@@ -7,7 +7,7 @@
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
- *
+ *
* Contributors:
* Ericsson - Initial Implementation
* Simon Marchi (Ericsson) - Move some tests from AsyncCompletionWaitor to Query
@@ -75,290 +75,290 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
private static final String EXEC_NAME = "ExpressionTestApp.exe";
private static final String SOURCE_NAME = "ExpressionTestApp.cc";
- private DsfSession fSession;
+ private DsfSession fSession;
+
+ private DsfServicesTracker fServicesTracker;
- private DsfServicesTracker fServicesTracker;
+ protected IExpressions fExpService;
- protected IExpressions fExpService;
+ private int fExprChangedEventCount = 0;
- private int fExprChangedEventCount = 0;
+ private IExpressionDMContext fExprChangedCtx = null;
- private IExpressionDMContext fExprChangedCtx = null;
-
- private IExpressionDMContext globalExpressionCtx1 = null;
- private IExpressionDMContext globalExpressionCtx2 = null;
+ private IExpressionDMContext globalExpressionCtx1 = null;
+ private IExpressionDMContext globalExpressionCtx2 = null;
- @Override
- protected void setLaunchAttributes() {
- super.setLaunchAttributes();
-
- setLaunchAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, EXEC_PATH + EXEC_NAME);
- }
+ @Override
+ protected void setLaunchAttributes() {
+ super.setLaunchAttributes();
+
+ setLaunchAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, EXEC_PATH + EXEC_NAME);
+ }
/* Line tags in the source file. */
- private static final String[] LINE_TAGS = new String[] {
- "testUpdateOfPointer_1",
- "testUpdateOfPointer_2",
- "testUpdateOfPointerTypedef_1",
- "testUpdateOfPointerTypedef_2",
- };
+ private static final String[] LINE_TAGS = new String[] { "testUpdateOfPointer_1", "testUpdateOfPointer_2",
+ "testUpdateOfPointerTypedef_1", "testUpdateOfPointerTypedef_2", };
- @Override
- public void doBeforeTest() throws Exception {
- super.doBeforeTest();
+ @Override
+ public void doBeforeTest() throws Exception {
+ super.doBeforeTest();
/* Resolve line tags in source file. */
resolveLineTagLocations(SOURCE_NAME, LINE_TAGS);
- fSession = getGDBLaunch().getSession();
- Runnable runnable = new Runnable() {
- @Override
+ fSession = getGDBLaunch().getSession();
+ Runnable runnable = new Runnable() {
+ @Override
public void run() {
- fServicesTracker = new DsfServicesTracker(TestsPlugin.getBundleContext(), fSession.getId());
-
- fExpService = fServicesTracker.getService(IExpressions.class);
- fSession.addServiceEventListener(MIExpressionsTest.this, null);
- clearExprChangedData();
- }
- };
- fSession.getExecutor().submit(runnable).get();
- }
-
- @Override
- public void doAfterTest() throws Exception {
- super.doAfterTest();
+ fServicesTracker = new DsfServicesTracker(TestsPlugin.getBundleContext(), fSession.getId());
+
+ fExpService = fServicesTracker.getService(IExpressions.class);
+ fSession.addServiceEventListener(MIExpressionsTest.this, null);
+ clearExprChangedData();
+ }
+ };
+ fSession.getExecutor().submit(runnable).get();
+ }
+
+ @Override
+ public void doAfterTest() throws Exception {
+ super.doAfterTest();
if (fSession != null) {
- fSession.getExecutor().submit(()->fSession.removeServiceEventListener(MIExpressionsTest.this)).get();
+ fSession.getExecutor().submit(() -> fSession.removeServiceEventListener(MIExpressionsTest.this)).get();
}
fExpService = null;
- if (fServicesTracker != null) {
+ if (fServicesTracker != null) {
fServicesTracker.dispose();
}
- }
-
- // Handles ExpressionChangedEvent
- @DsfServiceEventHandler
- public void eventDispatched(IExpressionChangedDMEvent e) {
- fExprChangedEventCount++;
- fExprChangedCtx = e.getDMContext();
- }
-
- // Clears the counters
- private void clearExprChangedData() {
- fExprChangedEventCount = 0;
- fExprChangedCtx = null;
- }
-
- // Returns the total number of events received
- private int getExprChangedCount() {
- return fExprChangedEventCount;
- }
-
- private IExpressionDMContext getExprChangedContext() {
- return fExprChangedCtx;
- }
-
- // *********************************************************************
- // Below are the tests for the expression service.
- // *********************************************************************
-
- /**
- * Test that we can correctly evaluate integer expressions.
- */
- @Test
- public void testLiteralIntegerExpressions() throws Throwable {
- MIStoppedEvent stoppedEvent = SyncUtil.runToLocation("testLocals");
-
- // Create a map of expressions and their expected values.
- Map<String, String[]> tests = new HashMap<String, String[]>();
-
- tests.put("0 + 0 - 0", new String[] { "0x0", "0", "0", "0", "0", "0" });
- tests.put("3 + 4", new String[] { "0x7", "07", "111", "7", "7", "7" });
- tests.put("3 + 4 * 5", new String[] { "0x17", "027", "10111", "23", "23", "23" });
- tests.put("5 * 3 + 4", new String[] { "0x13", "023", "10011", "19", "19", "19" });
- tests.put("5 * (3 + 4)", new String[] { "0x23", "043", "100011", "35", "35", "35" });
- tests.put("10 - 15", new String[] { "0xFFFFFFFB", "037777777773", "11111111111111111111111111111011", "-5",
- "-5", "-5" });
- tests.put("10 + -15", new String[] { "0xFFFFFFFB", "037777777773", "11111111111111111111111111111011", "-5",
- "-5", "-5" });
-
- executeExpressionSubTests(tests, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
- }
-
- /**
- * Test that we can correctly evaluate floating-point expressions.
- */
- @Test
- public void testLiteralFloatingPointExpressions() throws Throwable {
- MIStoppedEvent stoppedEvent = SyncUtil.runToLocation("testLocals");
-
- // Create a map of expressions and their expected values.
- Map<String, String[]> tests = new HashMap<String, String[]>();
-
- tests.put("3.14159 + 1.1111", new String[] { "0x4", "04", "100", "4", "4.2526", "4.2526" });
- tests.put("100.0 / 3.0", new String[] { "0x21", "041", "100001", "33", "33.3333", "33.3333" });
- tests.put("-100.0 / 3.0", new String[] { "0xffffffffffffffdf", "01777777777777777777737",
- "1111111111111111111111111111111111111111111111111111111111011111", "-33", "-33.3333", "-33.3333" });
- tests.put("-100.0 / -3.0", new String[] { "0x21", "041", "100001", "33", "33.3333", "33.3333" });
- executeExpressionSubTests(tests, false, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
-
- tests.clear();
- tests.put("100.0 / 0.5", new String[] { "0xc8", "0310", "11001000", "200", "200", "200" });
- executeExpressionSubTests(tests, true, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
-
- }
-
- /**
- * Test that we can correctly evaluate C expressions involving local
- * variables.
- */
- @Test
- public void testLocalVariables() throws Throwable {
- // Run to the point where all local variables are initialized
- SyncUtil.runToLocation("testLocals");
- MIStoppedEvent stoppedEvent = SyncUtil.step(16, StepType.STEP_OVER);
-
- // Create a map of expressions to expected values.
- Map<String, String[]> tests1 = new HashMap<String, String[]>();
-
- tests1.put("lIntVar", new String[] { "0x3039", "030071", "11000000111001", "12345", "12345", "12345" });
- tests1.put("lDoubleVar", new String[] { "0x3039", "030071", "11000000111001", "12345", "12345.123449999999", "12345.123449999999" });
- tests1.put("lCharVar", new String[] { "0x6d", "0155", "1101101", "109", "109 'm'", "109 'm'" });
- tests1.put("lBoolVar", new String[] { "0x0", "0", "0", "0", "false", "false" });
-
- tests1.put("lIntArray[1]", new String[] { "0x3039", "030071", "11000000111001", "12345", "12345", "12345" });
- tests1.put("lDoubleArray[1]", new String[] { "0x3039", "030071", "11000000111001", "12345", "12345.123449999999", "12345.123449999999" });
- tests1.put("lCharArray[1]", new String[] { "0x6d", "0155", "1101101", "109", "109 'm'", "109 'm'" });
- tests1.put("lBoolArray[1]", new String[] { "0x0", "0", "0", "0", "false", "false" });
-
- tests1.put("*lIntPtr", new String[] { "0x3039", "030071", "11000000111001", "12345", "12345", "12345" });
- tests1.put("*lDoublePtr", new String[] { "0x3039", "030071", "11000000111001", "12345", "12345.123449999999", "12345.123449999999" });
- tests1.put("*lCharPtr", new String[] { "0x6d", "0155", "1101101", "109", "109 'm'", "109 'm'" });
- tests1.put("*lBoolPtr", new String[] { "0x0", "0", "0", "0", "false", "false" });
-
- tests1.put("lIntPtr2", new String[] { "0x1", "01", "1", "1", "0x1", "0x1" });
- tests1.put("lDoublePtr2", new String[] { "0x2345", "021505", "10001101000101", "9029", "0x2345", "0x2345" });
- // GDB says a char* is out of bounds, but not the other pointers???
- // tests1.put("CharPtr2", new String[] { "0x1234", "011064",
- // "1001000110100", "4660", "0x1234" });
- tests1.put("lBoolPtr2", new String[] { "0x123ABCDE", "02216536336", "10010001110101011110011011110", "305839326", "0x123ABCDE", "0x123ABCDE" });
-
- executeExpressionSubTests(tests1, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
-
- // Step into the method and stop until all new local variables are
- // initialized
- SyncUtil.step(StepType.STEP_INTO);
- stoppedEvent = SyncUtil.step(5, StepType.STEP_OVER);
-
- // Create a map of expressions to expected values.
- Map<String, String[]> tests2 = new HashMap<String, String[]>();
-
- tests2.put("lIntVar", new String[] { "0x1a85", "015205", "1101010000101", "6789", "6789", "6789" });
- tests2.put("lDoubleArray[1]",
- new String[] { "0x1a85", "015205", "1101010000101", "6789", "6789.6788999999999", "6789.6788999999999" });
- tests2.put("lCharVar", new String[] { "0x69", "0151", "1101001", "105", "105 'i'", "105 'i'" });
- tests2.put("*lCharPtr", new String[] { "0x69", "0151", "1101001", "105", "105 'i'", "105 'i'" });
- tests2.put("lBoolPtr2", new String[] { "0xABCDE123", "025363360443", "10101011110011011110000100100011",
- "2882396451", "0xABCDE123","0xABCDE123" });
-
- // check variables at current stack frame
- executeExpressionSubTests(tests2, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
- // check previous stack frame
- executeExpressionSubTests(tests1, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 1));
-
- // Now return from the method and check that we see the
- // original variables. We must use the right context to restore the right stack frame
- stoppedEvent = SyncUtil.step(stoppedEvent.getDMContext(), StepType.STEP_RETURN);
-
- executeExpressionSubTests(tests1, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
- }
-
- /**
- * This tests verifies that we can deal with variables in a subblock hiding
- * variables with the same name in the outer block.
- */
- @Ignore("Sublocks do not work with GDB")
- @Test
- public void testSubBlock() throws Throwable {
- SyncUtil.runToLocation("testSubblock");
- MIStoppedEvent stoppedEvent = SyncUtil.step(2, StepType.STEP_OVER);
- IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- Map<String, String[]> tests = new HashMap<String, String[]>();
-
- tests.put("a", new String[] { "0x8", "010", "1000", "8", "8", "8" });
- tests.put("b", new String[] { "0x1", "01", "1", "1", "1", "1" });
-
- executeExpressionSubTests(tests, frameDmc);
-
- // Now enter a subblock with the same variable names
- SyncUtil.step(2, StepType.STEP_OVER);
-
- tests = new HashMap<String, String[]>();
-
- tests.put("a", new String[] { "0xc", "014", "1100", "12", "12", "12" });
- tests.put("b", new String[] { "0x1", "01", "1", "1", "1", "1" });
-
- executeExpressionSubTests(tests, frameDmc);
-
- // Now step to change the b variable
- SyncUtil.step(1, StepType.STEP_OVER);
-
- tests = new HashMap<String, String[]>();
-
- tests.put("a", new String[] { "0xc", "014", "1100", "12", "12", "12" });
- tests.put("b", new String[] { "0xc", "014", "1100", "12", "12", "12" });
-
- executeExpressionSubTests(tests, frameDmc);
-
- // Now exit the sub-block and check that we see the original a but the
- // same b
- SyncUtil.step(1, StepType.STEP_OVER);
-
- tests = new HashMap<String, String[]>();
-
- tests.put("a", new String[] { "0x8", "010", "1000", "8", "8", "8" });
- tests.put("b", new String[] { "0xc", "014", "1100", "12", "12", "12" });
-
- executeExpressionSubTests(tests, frameDmc);
- }
-
- /**
- * This tests verifies that we can obtain children properly.
- */
- @Test
- public void testChildren() throws Throwable {
- assumeGdbVersionAtLeast(ITestConstants.SUFFIX_GDB_6_7);
+ }
+
+ // Handles ExpressionChangedEvent
+ @DsfServiceEventHandler
+ public void eventDispatched(IExpressionChangedDMEvent e) {
+ fExprChangedEventCount++;
+ fExprChangedCtx = e.getDMContext();
+ }
+
+ // Clears the counters
+ private void clearExprChangedData() {
+ fExprChangedEventCount = 0;
+ fExprChangedCtx = null;
+ }
+
+ // Returns the total number of events received
+ private int getExprChangedCount() {
+ return fExprChangedEventCount;
+ }
+
+ private IExpressionDMContext getExprChangedContext() {
+ return fExprChangedCtx;
+ }
+
+ // *********************************************************************
+ // Below are the tests for the expression service.
+ // *********************************************************************
+
+ /**
+ * Test that we can correctly evaluate integer expressions.
+ */
+ @Test
+ public void testLiteralIntegerExpressions() throws Throwable {
+ MIStoppedEvent stoppedEvent = SyncUtil.runToLocation("testLocals");
+
+ // Create a map of expressions and their expected values.
+ Map<String, String[]> tests = new HashMap<String, String[]>();
+
+ tests.put("0 + 0 - 0", new String[] { "0x0", "0", "0", "0", "0", "0" });
+ tests.put("3 + 4", new String[] { "0x7", "07", "111", "7", "7", "7" });
+ tests.put("3 + 4 * 5", new String[] { "0x17", "027", "10111", "23", "23", "23" });
+ tests.put("5 * 3 + 4", new String[] { "0x13", "023", "10011", "19", "19", "19" });
+ tests.put("5 * (3 + 4)", new String[] { "0x23", "043", "100011", "35", "35", "35" });
+ tests.put("10 - 15",
+ new String[] { "0xFFFFFFFB", "037777777773", "11111111111111111111111111111011", "-5", "-5", "-5" });
+ tests.put("10 + -15",
+ new String[] { "0xFFFFFFFB", "037777777773", "11111111111111111111111111111011", "-5", "-5", "-5" });
+
+ executeExpressionSubTests(tests, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
+ }
+
+ /**
+ * Test that we can correctly evaluate floating-point expressions.
+ */
+ @Test
+ public void testLiteralFloatingPointExpressions() throws Throwable {
+ MIStoppedEvent stoppedEvent = SyncUtil.runToLocation("testLocals");
+
+ // Create a map of expressions and their expected values.
+ Map<String, String[]> tests = new HashMap<String, String[]>();
+
+ tests.put("3.14159 + 1.1111", new String[] { "0x4", "04", "100", "4", "4.2526", "4.2526" });
+ tests.put("100.0 / 3.0", new String[] { "0x21", "041", "100001", "33", "33.3333", "33.3333" });
+ tests.put("-100.0 / 3.0", new String[] { "0xffffffffffffffdf", "01777777777777777777737",
+ "1111111111111111111111111111111111111111111111111111111111011111", "-33", "-33.3333", "-33.3333" });
+ tests.put("-100.0 / -3.0", new String[] { "0x21", "041", "100001", "33", "33.3333", "33.3333" });
+ executeExpressionSubTests(tests, false, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
+
+ tests.clear();
+ tests.put("100.0 / 0.5", new String[] { "0xc8", "0310", "11001000", "200", "200", "200" });
+ executeExpressionSubTests(tests, true, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
+
+ }
+
+ /**
+ * Test that we can correctly evaluate C expressions involving local
+ * variables.
+ */
+ @Test
+ public void testLocalVariables() throws Throwable {
+ // Run to the point where all local variables are initialized
+ SyncUtil.runToLocation("testLocals");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(16, StepType.STEP_OVER);
+
+ // Create a map of expressions to expected values.
+ Map<String, String[]> tests1 = new HashMap<String, String[]>();
+
+ tests1.put("lIntVar", new String[] { "0x3039", "030071", "11000000111001", "12345", "12345", "12345" });
+ tests1.put("lDoubleVar", new String[] { "0x3039", "030071", "11000000111001", "12345", "12345.123449999999",
+ "12345.123449999999" });
+ tests1.put("lCharVar", new String[] { "0x6d", "0155", "1101101", "109", "109 'm'", "109 'm'" });
+ tests1.put("lBoolVar", new String[] { "0x0", "0", "0", "0", "false", "false" });
+
+ tests1.put("lIntArray[1]", new String[] { "0x3039", "030071", "11000000111001", "12345", "12345", "12345" });
+ tests1.put("lDoubleArray[1]", new String[] { "0x3039", "030071", "11000000111001", "12345",
+ "12345.123449999999", "12345.123449999999" });
+ tests1.put("lCharArray[1]", new String[] { "0x6d", "0155", "1101101", "109", "109 'm'", "109 'm'" });
+ tests1.put("lBoolArray[1]", new String[] { "0x0", "0", "0", "0", "false", "false" });
+
+ tests1.put("*lIntPtr", new String[] { "0x3039", "030071", "11000000111001", "12345", "12345", "12345" });
+ tests1.put("*lDoublePtr", new String[] { "0x3039", "030071", "11000000111001", "12345", "12345.123449999999",
+ "12345.123449999999" });
+ tests1.put("*lCharPtr", new String[] { "0x6d", "0155", "1101101", "109", "109 'm'", "109 'm'" });
+ tests1.put("*lBoolPtr", new String[] { "0x0", "0", "0", "0", "false", "false" });
+
+ tests1.put("lIntPtr2", new String[] { "0x1", "01", "1", "1", "0x1", "0x1" });
+ tests1.put("lDoublePtr2", new String[] { "0x2345", "021505", "10001101000101", "9029", "0x2345", "0x2345" });
+ // GDB says a char* is out of bounds, but not the other pointers???
+ // tests1.put("CharPtr2", new String[] { "0x1234", "011064",
+ // "1001000110100", "4660", "0x1234" });
+ tests1.put("lBoolPtr2", new String[] { "0x123ABCDE", "02216536336", "10010001110101011110011011110",
+ "305839326", "0x123ABCDE", "0x123ABCDE" });
+
+ executeExpressionSubTests(tests1, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
+
+ // Step into the method and stop until all new local variables are
+ // initialized
+ SyncUtil.step(StepType.STEP_INTO);
+ stoppedEvent = SyncUtil.step(5, StepType.STEP_OVER);
+
+ // Create a map of expressions to expected values.
+ Map<String, String[]> tests2 = new HashMap<String, String[]>();
+
+ tests2.put("lIntVar", new String[] { "0x1a85", "015205", "1101010000101", "6789", "6789", "6789" });
+ tests2.put("lDoubleArray[1]", new String[] { "0x1a85", "015205", "1101010000101", "6789", "6789.6788999999999",
+ "6789.6788999999999" });
+ tests2.put("lCharVar", new String[] { "0x69", "0151", "1101001", "105", "105 'i'", "105 'i'" });
+ tests2.put("*lCharPtr", new String[] { "0x69", "0151", "1101001", "105", "105 'i'", "105 'i'" });
+ tests2.put("lBoolPtr2", new String[] { "0xABCDE123", "025363360443", "10101011110011011110000100100011",
+ "2882396451", "0xABCDE123", "0xABCDE123" });
+
+ // check variables at current stack frame
+ executeExpressionSubTests(tests2, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
+ // check previous stack frame
+ executeExpressionSubTests(tests1, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 1));
+
+ // Now return from the method and check that we see the
+ // original variables. We must use the right context to restore the right stack frame
+ stoppedEvent = SyncUtil.step(stoppedEvent.getDMContext(), StepType.STEP_RETURN);
+
+ executeExpressionSubTests(tests1, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
+ }
+
+ /**
+ * This tests verifies that we can deal with variables in a subblock hiding
+ * variables with the same name in the outer block.
+ */
+ @Ignore("Sublocks do not work with GDB")
+ @Test
+ public void testSubBlock() throws Throwable {
+ SyncUtil.runToLocation("testSubblock");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(2, StepType.STEP_OVER);
+ IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ Map<String, String[]> tests = new HashMap<String, String[]>();
+
+ tests.put("a", new String[] { "0x8", "010", "1000", "8", "8", "8" });
+ tests.put("b", new String[] { "0x1", "01", "1", "1", "1", "1" });
+
+ executeExpressionSubTests(tests, frameDmc);
+
+ // Now enter a subblock with the same variable names
+ SyncUtil.step(2, StepType.STEP_OVER);
+
+ tests = new HashMap<String, String[]>();
+
+ tests.put("a", new String[] { "0xc", "014", "1100", "12", "12", "12" });
+ tests.put("b", new String[] { "0x1", "01", "1", "1", "1", "1" });
+
+ executeExpressionSubTests(tests, frameDmc);
+
+ // Now step to change the b variable
+ SyncUtil.step(1, StepType.STEP_OVER);
+
+ tests = new HashMap<String, String[]>();
- // Get the children of some variables
- MIStoppedEvent stoppedEvent = SyncUtil.runToLocation("testChildren");
- IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
- IExpressionDMContext exprDMC = SyncUtil.createExpression(frameDmc, "f");
- doTestChildren(exprDMC);
-
- // Now do a step and get the children again, to test the internal cache
- SyncUtil.step(1, StepType.STEP_OVER);
- doTestChildren(exprDMC);
- }
-
- /**
- * This test makes sure we get the right number of children.
- */
- @Test
- public void testChildrenCount() throws Throwable {
- // Next we test that we can retrieve children count while reading the
- // value and vice-versa
+ tests.put("a", new String[] { "0xc", "014", "1100", "12", "12", "12" });
+ tests.put("b", new String[] { "0xc", "014", "1100", "12", "12", "12" });
- SyncUtil.runToLocation("testChildren");
- MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
+ executeExpressionSubTests(tests, frameDmc);
- final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+ // Now exit the sub-block and check that we see the original a but the
+ // same b
+ SyncUtil.step(1, StepType.STEP_OVER);
+
+ tests = new HashMap<String, String[]>();
+
+ tests.put("a", new String[] { "0x8", "010", "1000", "8", "8", "8" });
+ tests.put("b", new String[] { "0xc", "014", "1100", "12", "12", "12" });
+
+ executeExpressionSubTests(tests, frameDmc);
+ }
+
+ /**
+ * This tests verifies that we can obtain children properly.
+ */
+ @Test
+ public void testChildren() throws Throwable {
+ assumeGdbVersionAtLeast(ITestConstants.SUFFIX_GDB_6_7);
+
+ // Get the children of some variables
+ MIStoppedEvent stoppedEvent = SyncUtil.runToLocation("testChildren");
+ IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+ IExpressionDMContext exprDMC = SyncUtil.createExpression(frameDmc, "f");
+ doTestChildren(exprDMC);
+
+ // Now do a step and get the children again, to test the internal cache
+ SyncUtil.step(1, StepType.STEP_OVER);
+ doTestChildren(exprDMC);
+ }
- // First we get the expected value of the array pointer.
- final IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "f");
+ /**
+ * This test makes sure we get the right number of children.
+ */
+ @Test
+ public void testChildrenCount() throws Throwable {
+ // Next we test that we can retrieve children count while reading the
+ // value and vice-versa
+
+ SyncUtil.runToLocation("testChildren");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
+
+ final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
- assertChildrenCount(exprDmc, 5);
- }
+ // First we get the expected value of the array pointer.
+ final IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "f");
+
+ assertChildrenCount(exprDmc, 5);
+ }
/**
* This test makes sure we get can tell if an expression has children based
@@ -369,12 +369,10 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
SyncUtil.runToLocation("testChildren");
MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
- final IFrameDMContext frameDmc = SyncUtil.getStackFrame(
- stoppedEvent.getDMContext(), 0);
+ final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
// First we get the expected value of the array pointer.
- final IExpressionDMContext exprDmc = SyncUtil.createExpression(
- frameDmc, "f");
+ final IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "f");
Query<IExpressionDMData> query = new Query<IExpressionDMData>() {
@Override
@@ -392,28 +390,28 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
}
- /**
- * This test makes sure we properly deal with a GDB display bug.
- * See bug 320277
- *
- * The following code causes a bug in GDB:
- *
- * class Base {};
- * class BaseTest: public Base {
- * public:
- * BaseTest() {} // Removing this lines removes GDB's bug
- * void test() { return; }
- * };
- *
- * We see the bug with the following commands:
- * -var-create - * this
- * -var-list-children var1
- * -var-info-path-expression var1.BaseTest
- * -data-evaluate-expression "(*(Base*) this)"
- *
- * which we can reproduce by creating the children of this
- * and asking for the DETAILS_FORMAT of the var1.BaseTest child.
- */
+ /**
+ * This test makes sure we properly deal with a GDB display bug.
+ * See bug 320277
+ *
+ * The following code causes a bug in GDB:
+ *
+ * class Base {};
+ * class BaseTest: public Base {
+ * public:
+ * BaseTest() {} // Removing this lines removes GDB's bug
+ * void test() { return; }
+ * };
+ *
+ * We see the bug with the following commands:
+ * -var-create - * this
+ * -var-list-children var1
+ * -var-info-path-expression var1.BaseTest
+ * -data-evaluate-expression "(*(Base*) this)"
+ *
+ * which we can reproduce by creating the children of this
+ * and asking for the DETAILS_FORMAT of the var1.BaseTest child.
+ */
@Test
public void testBaseChildrenBug() throws Throwable {
@@ -428,7 +426,8 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
Query<FormattedValueDMData> query = new Query<FormattedValueDMData>() {
@Override
protected void execute(DataRequestMonitor<FormattedValueDMData> rm) {
- FormattedValueDMContext dmc = fExpService.getFormattedValueContext(children[0], MIExpressions.DETAILS_FORMAT);
+ FormattedValueDMContext dmc = fExpService.getFormattedValueContext(children[0],
+ MIExpressions.DETAILS_FORMAT);
fExpService.getFormattedExpressionValue(dmc, rm);
}
};
@@ -442,7 +441,8 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
query = new Query<FormattedValueDMData>() {
@Override
protected void execute(DataRequestMonitor<FormattedValueDMData> rm) {
- FormattedValueDMContext dmc = fExpService.getFormattedValueContext(children[1], MIExpressions.DETAILS_FORMAT);
+ FormattedValueDMContext dmc = fExpService.getFormattedValueContext(children[1],
+ MIExpressions.DETAILS_FORMAT);
fExpService.getFormattedExpressionValue(dmc, rm);
}
};
@@ -540,8 +540,8 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
*/
private void writeAndCheck(final IExpressionDMContext exprDmc, final String newValueFormatted, final String format,
final String newValueInDecimal) throws Throwable {
- ServiceEventWaitor<IExpressionChangedDMEvent> eventWaitor = new ServiceEventWaitor<>(
- fSession, IExpressionChangedDMEvent.class);
+ ServiceEventWaitor<IExpressionChangedDMEvent> eventWaitor = new ServiceEventWaitor<>(fSession,
+ IExpressionChangedDMEvent.class);
// Write the new value using its formatted value
Query<Void> writeQuery = new Query<Void>() {
@@ -574,1514 +574,1579 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
assertThat(actualDecimalValue.toLowerCase(), is(newValueInDecimal.toLowerCase()));
}
- /**
- * This tests verifies that we handle invalid formats properly for a write.
- */
- @Test
- public void testWriteErrorFormat() throws Throwable {
- SyncUtil.runToLocation("testWrite");
- MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
-
- IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
- IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "a[1]");
-
- writeAndCheckError(exprDmc, "goodbye", IFormattedValues.DECIMAL_FORMAT);
- writeAndCheckError(exprDmc, "abggg", IFormattedValues.HEX_FORMAT);
- writeAndCheckError(exprDmc, "99", IFormattedValues.OCTAL_FORMAT);
- writeAndCheckError(exprDmc, "234", IFormattedValues.BINARY_FORMAT);
- writeAndCheckError(exprDmc, "hello", IFormattedValues.NATURAL_FORMAT);
- writeAndCheckError(exprDmc, "1", "ThisFormatDoesNotExist");
-
- IExpressionDMContext notWritableExprDmc = SyncUtil.createExpression(frameDmc, "10+5");
- writeAndCheckError(notWritableExprDmc, "1", IFormattedValues.NATURAL_FORMAT);
- }
-
- /*
- * This method does a write that should use an invalid value or format, and
- * verifies that the operation fails
- */
- private void writeAndCheckError(final IExpressionDMContext exprDmc, final String invalidValueFormatted,
- final String format) throws Throwable {
-
- final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
-
- // Write the new value using its formatted value
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ /**
+ * This tests verifies that we handle invalid formats properly for a write.
+ */
+ @Test
+ public void testWriteErrorFormat() throws Throwable {
+ SyncUtil.runToLocation("testWrite");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
+
+ IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+ IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "a[1]");
+
+ writeAndCheckError(exprDmc, "goodbye", IFormattedValues.DECIMAL_FORMAT);
+ writeAndCheckError(exprDmc, "abggg", IFormattedValues.HEX_FORMAT);
+ writeAndCheckError(exprDmc, "99", IFormattedValues.OCTAL_FORMAT);
+ writeAndCheckError(exprDmc, "234", IFormattedValues.BINARY_FORMAT);
+ writeAndCheckError(exprDmc, "hello", IFormattedValues.NATURAL_FORMAT);
+ writeAndCheckError(exprDmc, "1", "ThisFormatDoesNotExist");
+
+ IExpressionDMContext notWritableExprDmc = SyncUtil.createExpression(frameDmc, "10+5");
+ writeAndCheckError(notWritableExprDmc, "1", IFormattedValues.NATURAL_FORMAT);
+ }
+
+ /*
+ * This method does a write that should use an invalid value or format, and
+ * verifies that the operation fails
+ */
+ private void writeAndCheckError(final IExpressionDMContext exprDmc, final String invalidValueFormatted,
+ final String format) throws Throwable {
+
+ final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
+
+ // Write the new value using its formatted value
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- fExpService.writeExpression(exprDmc, invalidValueFormatted, format, new RequestMonitor(fExpService
- .getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- wait.waitFinished(getStatus());
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue("Got an OK status for an error test case. Should not be able to write value "
- + invalidValueFormatted + " in " + format, !wait.isOK());
-
- assertTrue("ExprChangedEvent problem: expected 0, received " + getExprChangedCount(),
- getExprChangedCount() == 0);
- }
-
- /**
- * This test tries multiple format reads during the same executor cycle, to
- * make sure the internal MI commands are sequenced properly.
- */
- @Test
- public void testConcurrentReads() throws Throwable {
- // Next we test that we can read the value more than once
- // of the same variable object at the exact same time
-
- SyncUtil.runToLocation("testConcurrent");
- MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
-
- final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
-
- final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
-
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ fExpService.writeExpression(exprDmc, invalidValueFormatted, format,
+ new RequestMonitor(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ wait.waitFinished(getStatus());
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue("Got an OK status for an error test case. Should not be able to write value "
+ + invalidValueFormatted + " in " + format, !wait.isOK());
+
+ assertTrue("ExprChangedEvent problem: expected 0, received " + getExprChangedCount(),
+ getExprChangedCount() == 0);
+ }
+
+ /**
+ * This test tries multiple format reads during the same executor cycle, to
+ * make sure the internal MI commands are sequenced properly.
+ */
+ @Test
+ public void testConcurrentReads() throws Throwable {
+ // Next we test that we can read the value more than once
+ // of the same variable object at the exact same time
+
+ SyncUtil.runToLocation("testConcurrent");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
+
+ final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
+
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- IExpressionDMContext exprDmc = fExpService.createExpression(frameDmc, "a[0]");
-
- wait.increment();
- fExpService.getFormattedExpressionValue(fExpService.getFormattedValueContext(exprDmc,
- IFormattedValues.NATURAL_FORMAT), new DataRequestMonitor<FormattedValueDMData>(fExpService
- .getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData().getFormattedValue().equals("28")) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating natural format", null));
- }
- }
- }
- });
-
- wait.increment();
- fExpService.getFormattedExpressionValue(fExpService.getFormattedValueContext(exprDmc,
- IFormattedValues.HEX_FORMAT), new DataRequestMonitor<FormattedValueDMData>(fExpService
- .getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData().getFormattedValue().equalsIgnoreCase("0x1c")) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating hex format", null));
- }
- }
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
-
- assertTrue("ExprChangedEvent problem: expected 0, received " + getExprChangedCount(),
- getExprChangedCount() == 0);
-
- }
-
- /**
- * This test tries reads and listChildren during the same executor cycle, to
- * make sure the internal MI commands are sequenced properly.
- */
- @Test
- public void testConcurrentReadChildren() throws Throwable {
- // Next we test that we can retrieve children while reading the value
- // and vice-versa
-
- SyncUtil.runToLocation("testConcurrent");
- MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
-
- final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
-
- // First we get the expected value of the array pointer.
- final IExpressionDMContext addrDmc = SyncUtil.createExpression(frameDmc, "&a");
-
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ IExpressionDMContext exprDmc = fExpService.createExpression(frameDmc, "a[0]");
+
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(exprDmc, IFormattedValues.NATURAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData().getFormattedValue().equals("28")) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating natural format", null));
+ }
+ }
+ }
+ });
+
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(exprDmc, IFormattedValues.HEX_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData().getFormattedValue().equalsIgnoreCase("0x1c")) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating hex format", null));
+ }
+ }
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+
+ assertTrue("ExprChangedEvent problem: expected 0, received " + getExprChangedCount(),
+ getExprChangedCount() == 0);
+
+ }
+
+ /**
+ * This test tries reads and listChildren during the same executor cycle, to
+ * make sure the internal MI commands are sequenced properly.
+ */
+ @Test
+ public void testConcurrentReadChildren() throws Throwable {
+ // Next we test that we can retrieve children while reading the value
+ // and vice-versa
+
+ SyncUtil.runToLocation("testConcurrent");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
+
+ final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
+
+ // First we get the expected value of the array pointer.
+ final IExpressionDMContext addrDmc = SyncUtil.createExpression(frameDmc, "&a");
+
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(addrDmc, IFormattedValues.NATURAL_FORMAT),
- new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (isSuccess()) {
- wait.setReturnInfo(getData());
- }
-
- wait.waitFinished(getStatus());
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
-
- final String actualAddrStr = ((FormattedValueDMData) wait.getReturnInfo()).getFormattedValue();
-
- wait.waitReset();
-
- // Now perform the test
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(addrDmc, IFormattedValues.NATURAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (isSuccess()) {
+ wait.setReturnInfo(getData());
+ }
+
+ wait.waitFinished(getStatus());
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+
+ final String actualAddrStr = ((FormattedValueDMData) wait.getReturnInfo()).getFormattedValue();
+
+ wait.waitReset();
+
+ // Now perform the test
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- IExpressionDMContext exprDmc = fExpService.createExpression(frameDmc, "a");
-
- wait.increment();
- fExpService.getFormattedExpressionValue(fExpService.getFormattedValueContext(exprDmc,
- IFormattedValues.NATURAL_FORMAT), new DataRequestMonitor<FormattedValueDMData>(fExpService
- .getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData().getFormattedValue().equals(actualAddrStr)) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating natural format", null));
- }
- }
- }
- });
-
- wait.increment();
- fExpService.getSubExpressions(exprDmc, new DataRequestMonitor<IExpressionDMContext[]>(
- fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- IExpressionDMContext[] children = getData();
- int failedIndex = -1;
- for (int i = 0; i < 2; i++) {
- if (!children[i].getExpression().equals("a[" + i + "]")) {
- failedIndex = i;
- }
- }
-
- if (failedIndex != -1) {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed getting child number: " + failedIndex, null));
- } else {
- wait.waitFinished();
- }
- }
- }
- });
-
- // Use different format to avoid triggering the cache
- wait.increment();
- fExpService.getFormattedExpressionValue(fExpService.getFormattedValueContext(exprDmc,
- IFormattedValues.HEX_FORMAT), new DataRequestMonitor<FormattedValueDMData>(fExpService
- .getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData().getFormattedValue().equals(actualAddrStr)) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating hex format", null));
- }
- }
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
-
- assertTrue("ExprChangedEvent problem: expected 0, received " + getExprChangedCount(),
- getExprChangedCount() == 0);
- }
-
- /**
- * This test tries reads and getChildrenCount during the same executor
- * cycle, to make sure the internal MI commands are sequenced properly.
- */
- @Test
- public void testConcurrentReadChildrenCount() throws Throwable {
- // Next we test that we can retrieve children count while reading the
- // value and vice-versa
-
- SyncUtil.runToLocation("testConcurrent");
- MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
-
- final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
-
- // First we get the expected value of the array pointer.
- final IExpressionDMContext addrDmc = SyncUtil.createExpression(frameDmc, "&a");
-
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ IExpressionDMContext exprDmc = fExpService.createExpression(frameDmc, "a");
+
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(exprDmc, IFormattedValues.NATURAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData().getFormattedValue().equals(actualAddrStr)) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating natural format", null));
+ }
+ }
+ }
+ });
+
+ wait.increment();
+ fExpService.getSubExpressions(exprDmc,
+ new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ IExpressionDMContext[] children = getData();
+ int failedIndex = -1;
+ for (int i = 0; i < 2; i++) {
+ if (!children[i].getExpression().equals("a[" + i + "]")) {
+ failedIndex = i;
+ }
+ }
+
+ if (failedIndex != -1) {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed getting child number: " + failedIndex, null));
+ } else {
+ wait.waitFinished();
+ }
+ }
+ }
+ });
+
+ // Use different format to avoid triggering the cache
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(exprDmc, IFormattedValues.HEX_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData().getFormattedValue().equals(actualAddrStr)) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating hex format", null));
+ }
+ }
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+
+ assertTrue("ExprChangedEvent problem: expected 0, received " + getExprChangedCount(),
+ getExprChangedCount() == 0);
+ }
+
+ /**
+ * This test tries reads and getChildrenCount during the same executor
+ * cycle, to make sure the internal MI commands are sequenced properly.
+ */
+ @Test
+ public void testConcurrentReadChildrenCount() throws Throwable {
+ // Next we test that we can retrieve children count while reading the
+ // value and vice-versa
+
+ SyncUtil.runToLocation("testConcurrent");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
+
+ final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
+
+ // First we get the expected value of the array pointer.
+ final IExpressionDMContext addrDmc = SyncUtil.createExpression(frameDmc, "&a");
+
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(addrDmc, IFormattedValues.NATURAL_FORMAT),
- new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (isSuccess()) {
- wait.setReturnInfo(getData());
- }
-
- wait.waitFinished(getStatus());
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
-
- final String actualAddrStr = ((FormattedValueDMData) wait.getReturnInfo()).getFormattedValue();
-
- wait.waitReset();
-
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(addrDmc, IFormattedValues.NATURAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (isSuccess()) {
+ wait.setReturnInfo(getData());
+ }
+
+ wait.waitFinished(getStatus());
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+
+ final String actualAddrStr = ((FormattedValueDMData) wait.getReturnInfo()).getFormattedValue();
+
+ wait.waitReset();
+
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- wait.increment();
- IExpressionDMContext exprDmc = fExpService.createExpression(frameDmc, "a");
-
- fExpService.getFormattedExpressionValue(fExpService.getFormattedValueContext(exprDmc,
- IFormattedValues.NATURAL_FORMAT), new DataRequestMonitor<FormattedValueDMData>(fExpService
- .getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData().getFormattedValue().equals(actualAddrStr)) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating natural format", null));
- }
- }
- }
- });
-
- wait.increment();
- fExpService.getSubExpressionCount(exprDmc, new DataRequestMonitor<Integer>(fExpService.getExecutor(),
- null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- int count = getData();
- if (count != 2) {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed getting count for children. Got" + count + "instead of 2", null));
- } else {
- wait.waitFinished();
- }
- }
- }
- });
-
- // Use different format to avoid triggering the cache
- wait.increment();
- fExpService.getFormattedExpressionValue(fExpService.getFormattedValueContext(exprDmc,
- IFormattedValues.HEX_FORMAT), new DataRequestMonitor<FormattedValueDMData>(fExpService
- .getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData().getFormattedValue().equals(actualAddrStr)) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating hex format", null));
- }
- }
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
-
- assertTrue("ExprChangedEvent problem: expected 0, received " + getExprChangedCount(),
- getExprChangedCount() == 0);
- }
-
- /**
- * This test tries reads and writes during the same executor cycle, to make
- * sure the internal MI commands are sequenced properly.
- */
- @Test
- public void testConcurrentReadWrite() throws Throwable {
- // Next we test that we can deal with a write request and read request
- // at
- // the same time and vice-versa
-
- SyncUtil.runToLocation("testConcurrent");
- MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
-
- IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- final IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "a[1]");
-
- final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
-
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ wait.increment();
+ IExpressionDMContext exprDmc = fExpService.createExpression(frameDmc, "a");
+
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(exprDmc, IFormattedValues.NATURAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData().getFormattedValue().equals(actualAddrStr)) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating natural format", null));
+ }
+ }
+ }
+ });
+
+ wait.increment();
+ fExpService.getSubExpressionCount(exprDmc,
+ new DataRequestMonitor<Integer>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ int count = getData();
+ if (count != 2) {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed getting count for children. Got" + count + "instead of 2",
+ null));
+ } else {
+ wait.waitFinished();
+ }
+ }
+ }
+ });
+
+ // Use different format to avoid triggering the cache
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(exprDmc, IFormattedValues.HEX_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData().getFormattedValue().equals(actualAddrStr)) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating hex format", null));
+ }
+ }
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+
+ assertTrue("ExprChangedEvent problem: expected 0, received " + getExprChangedCount(),
+ getExprChangedCount() == 0);
+ }
+
+ /**
+ * This test tries reads and writes during the same executor cycle, to make
+ * sure the internal MI commands are sequenced properly.
+ */
+ @Test
+ public void testConcurrentReadWrite() throws Throwable {
+ // Next we test that we can deal with a write request and read request
+ // at
+ // the same time and vice-versa
+
+ SyncUtil.runToLocation("testConcurrent");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
+
+ IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ final IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "a[1]");
+
+ final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
+
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- wait.increment();
- fExpService.getFormattedExpressionValue(fExpService.getFormattedValueContext(exprDmc,
- IFormattedValues.NATURAL_FORMAT), new DataRequestMonitor<FormattedValueDMData>(fExpService
- .getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData().getFormattedValue().equals("32")) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating natural format, got " + getData().getFormattedValue()
- + " instead of 32", null));
- }
- }
- }
- });
-
- wait.increment();
- fExpService.writeExpression(exprDmc, "56", IFormattedValues.NATURAL_FORMAT, new RequestMonitor(
- fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- wait.waitFinished();
- }
- }
- });
-
- // Use different format to avoid triggering the cache
- wait.increment();
- fExpService.getFormattedExpressionValue(fExpService.getFormattedValueContext(exprDmc,
- IFormattedValues.HEX_FORMAT), new DataRequestMonitor<FormattedValueDMData>(fExpService
- .getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData().getFormattedValue().equals("0x38")) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating hex format, got " + getData().getFormattedValue()
- + " instead of 0x38", null));
- }
- }
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
-
- assertTrue("ExprChangedEvent problem: expected 1, received " + getExprChangedCount(),
- getExprChangedCount() == 1);
- exprDmc.equals(getExprChangedContext());
- clearExprChangedData();
- }
-
- /**
- * This test tries many different operations during the same executor cycle,
- * to make sure the internal MI commands are sequenced properly.
- */
- @Test
- public void testConcurrentReadWriteChildren() throws Throwable {
- // Finally, we go nuts and request two reads, while requesting
- // a get children and get children count.
- // Note that we don't request a write, because a write is allowed to
- // go through at any time and we don't exactly know when it will
- // change the value we are reading.
-
- SyncUtil.runToLocation("testConcurrent");
- MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
-
- IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- final IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "a[1]");
-
- final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
-
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(exprDmc, IFormattedValues.NATURAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData().getFormattedValue().equals("32")) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(
+ new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating natural format, got "
+ + getData().getFormattedValue() + " instead of 32",
+ null));
+ }
+ }
+ }
+ });
+
+ wait.increment();
+ fExpService.writeExpression(exprDmc, "56", IFormattedValues.NATURAL_FORMAT,
+ new RequestMonitor(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ wait.waitFinished();
+ }
+ }
+ });
+
+ // Use different format to avoid triggering the cache
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(exprDmc, IFormattedValues.HEX_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData().getFormattedValue().equals("0x38")) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(
+ new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating hex format, got "
+ + getData().getFormattedValue() + " instead of 0x38",
+ null));
+ }
+ }
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+
+ assertTrue("ExprChangedEvent problem: expected 1, received " + getExprChangedCount(),
+ getExprChangedCount() == 1);
+ exprDmc.equals(getExprChangedContext());
+ clearExprChangedData();
+ }
+
+ /**
+ * This test tries many different operations during the same executor cycle,
+ * to make sure the internal MI commands are sequenced properly.
+ */
+ @Test
+ public void testConcurrentReadWriteChildren() throws Throwable {
+ // Finally, we go nuts and request two reads, while requesting
+ // a get children and get children count.
+ // Note that we don't request a write, because a write is allowed to
+ // go through at any time and we don't exactly know when it will
+ // change the value we are reading.
+
+ SyncUtil.runToLocation("testConcurrent");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
+
+ IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ final IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "a[1]");
+
+ final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
+
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- wait.increment();
- fExpService.getFormattedExpressionValue(fExpService.getFormattedValueContext(exprDmc,
- IFormattedValues.NATURAL_FORMAT), new DataRequestMonitor<FormattedValueDMData>(fExpService
- .getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData().getFormattedValue().equals("32")) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating natural format, got " + getData().getFormattedValue()
- + " instead of 32", null));
- }
- }
- }
- });
-
- wait.increment();
- fExpService.getFormattedExpressionValue(fExpService.getFormattedValueContext(exprDmc,
- IFormattedValues.HEX_FORMAT), new DataRequestMonitor<FormattedValueDMData>(fExpService
- .getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData().getFormattedValue().equals("0x20")) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating hex format, got " + getData().getFormattedValue()
- + " instead of 0x20", null));
- }
- }
- }
- });
-
- wait.increment();
- fExpService.getSubExpressionCount(exprDmc, new DataRequestMonitor<Integer>(fExpService.getExecutor(),
- null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData() != 0) {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed getting child count; expecting 0 got " + getData(), null));
- } else {
- wait.waitFinished();
- }
- }
- }
- });
-
- wait.increment();
- fExpService.getSubExpressions(exprDmc, new DataRequestMonitor<IExpressionDMContext[]>(
- fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData().length != 0) {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed getting children; expecting 0 got " + getData().length, null));
- } else {
- wait.waitFinished();
- }
- }
- }
- });
-
- // Must use a different format or else the cache will be triggered
- wait.increment();
- fExpService.getFormattedExpressionValue(fExpService.getFormattedValueContext(exprDmc,
- IFormattedValues.OCTAL_FORMAT), new DataRequestMonitor<FormattedValueDMData>(fExpService
- .getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData().getFormattedValue().equals("040")) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating hex format, got " + getData().getFormattedValue()
- + " instead of 040", null));
- }
- }
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
-
- assertTrue("ExprChangedEvent problem: expected 0, received " + getExprChangedCount(),
- getExprChangedCount() == 0);
- exprDmc.equals(getExprChangedContext());
- clearExprChangedData();
- }
-
- /**
- * This test verifies that the ExpressionService caches the evaluation of an
- * expression in a specific format. It verifies this by: 1- reading a
- * variable 2- writing to that variable 3- reading the variable in a new
- * format and seeing the new value 4- reading the variable in the same
- * format as step 1 and seeing the old value cached Note that all above
- * steps must be done within the same Runnable submitted to the executor.
- * This allows the cache to be triggered before it is invalidated by a write
- * command, since the write command will need an new executor cycle to send
- * an MI command to the back-end
- */
- @Test
- public void testWriteCache() throws Throwable {
- // Test the cache by changing a value but triggering a read before the
- // write clears the cache
-
- SyncUtil.runToLocation("testConcurrent");
- MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
-
- IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- final IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "a[1]");
-
- final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
-
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(exprDmc, IFormattedValues.NATURAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData().getFormattedValue().equals("32")) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(
+ new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating natural format, got "
+ + getData().getFormattedValue() + " instead of 32",
+ null));
+ }
+ }
+ }
+ });
+
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(exprDmc, IFormattedValues.HEX_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData().getFormattedValue().equals("0x20")) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(
+ new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating hex format, got "
+ + getData().getFormattedValue() + " instead of 0x20",
+ null));
+ }
+ }
+ }
+ });
+
+ wait.increment();
+ fExpService.getSubExpressionCount(exprDmc,
+ new DataRequestMonitor<Integer>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData() != 0) {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed getting child count; expecting 0 got " + getData(), null));
+ } else {
+ wait.waitFinished();
+ }
+ }
+ }
+ });
+
+ wait.increment();
+ fExpService.getSubExpressions(exprDmc,
+ new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData().length != 0) {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed getting children; expecting 0 got " + getData().length, null));
+ } else {
+ wait.waitFinished();
+ }
+ }
+ }
+ });
+
+ // Must use a different format or else the cache will be triggered
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(exprDmc, IFormattedValues.OCTAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData().getFormattedValue().equals("040")) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(
+ new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating hex format, got "
+ + getData().getFormattedValue() + " instead of 040",
+ null));
+ }
+ }
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+
+ assertTrue("ExprChangedEvent problem: expected 0, received " + getExprChangedCount(),
+ getExprChangedCount() == 0);
+ exprDmc.equals(getExprChangedContext());
+ clearExprChangedData();
+ }
+
+ /**
+ * This test verifies that the ExpressionService caches the evaluation of an
+ * expression in a specific format. It verifies this by: 1- reading a
+ * variable 2- writing to that variable 3- reading the variable in a new
+ * format and seeing the new value 4- reading the variable in the same
+ * format as step 1 and seeing the old value cached Note that all above
+ * steps must be done within the same Runnable submitted to the executor.
+ * This allows the cache to be triggered before it is invalidated by a write
+ * command, since the write command will need an new executor cycle to send
+ * an MI command to the back-end
+ */
+ @Test
+ public void testWriteCache() throws Throwable {
+ // Test the cache by changing a value but triggering a read before the
+ // write clears the cache
+
+ SyncUtil.runToLocation("testConcurrent");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
+
+ IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ final IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "a[1]");
+
+ final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
+
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- wait.increment();
- fExpService.getFormattedExpressionValue(fExpService.getFormattedValueContext(exprDmc,
- IFormattedValues.NATURAL_FORMAT), new DataRequestMonitor<FormattedValueDMData>(fExpService
- .getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData().getFormattedValue().equals("32")) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating natural format, got " + getData().getFormattedValue()
- + " instead of 32", null));
- }
- }
- }
- });
-
- wait.increment();
- fExpService.writeExpression(exprDmc, "56", IFormattedValues.NATURAL_FORMAT, new RequestMonitor(
- fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- wait.waitFinished();
- }
- }
- });
-
- // Must use a different format or else the cache will be
- // triggered
- // This will prove that the write has changed the backend
- wait.increment();
- fExpService.getFormattedExpressionValue(fExpService.getFormattedValueContext(exprDmc,
- IFormattedValues.OCTAL_FORMAT), new DataRequestMonitor<FormattedValueDMData>(fExpService
- .getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData().getFormattedValue().equals("070")) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating hex format, got " + getData().getFormattedValue()
- + " instead of 070", null));
- }
- }
- }
- });
-
- // Test that the cache is triggered, giving us the old value
- // This happens because we are calling this operation on the
- // same executor run call.
- // NOTE that this is not a problem, because the writeExpression
- // will eventually
- // reset the cache (we'll test this below).
- wait.increment();
- fExpService.getFormattedExpressionValue(fExpService.getFormattedValueContext(exprDmc,
- IFormattedValues.NATURAL_FORMAT), new DataRequestMonitor<FormattedValueDMData>(fExpService
- .getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData().getFormattedValue().equals("32")) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating natural format, got " + getData().getFormattedValue()
- + " instead of 32", null));
- }
- }
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
-
- // Now that we know the writeExpressions completed and the cache was
- // reset, do a similar
- // request as above to see that the cache has indeed been reset
- wait.waitReset();
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(exprDmc, IFormattedValues.NATURAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData().getFormattedValue().equals("32")) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(
+ new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating natural format, got "
+ + getData().getFormattedValue() + " instead of 32",
+ null));
+ }
+ }
+ }
+ });
+
+ wait.increment();
+ fExpService.writeExpression(exprDmc, "56", IFormattedValues.NATURAL_FORMAT,
+ new RequestMonitor(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ wait.waitFinished();
+ }
+ }
+ });
+
+ // Must use a different format or else the cache will be
+ // triggered
+ // This will prove that the write has changed the backend
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(exprDmc, IFormattedValues.OCTAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData().getFormattedValue().equals("070")) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(
+ new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating hex format, got "
+ + getData().getFormattedValue() + " instead of 070",
+ null));
+ }
+ }
+ }
+ });
+
+ // Test that the cache is triggered, giving us the old value
+ // This happens because we are calling this operation on the
+ // same executor run call.
+ // NOTE that this is not a problem, because the writeExpression
+ // will eventually
+ // reset the cache (we'll test this below).
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(exprDmc, IFormattedValues.NATURAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData().getFormattedValue().equals("32")) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(
+ new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating natural format, got "
+ + getData().getFormattedValue() + " instead of 32",
+ null));
+ }
+ }
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+
+ // Now that we know the writeExpressions completed and the cache was
+ // reset, do a similar
+ // request as above to see that the cache has indeed been reset
+ wait.waitReset();
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- wait.increment();
- fExpService.getFormattedExpressionValue(fExpService.getFormattedValueContext(exprDmc,
- IFormattedValues.NATURAL_FORMAT), new DataRequestMonitor<FormattedValueDMData>(fExpService
- .getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData().getFormattedValue().equals("56")) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating natural format, got " + getData().getFormattedValue()
- + " instead of 56", null));
- }
- }
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
-
- assertTrue("ExprChangedEvent problem: expected 1, received " + getExprChangedCount(),
- getExprChangedCount() == 1);
- exprDmc.equals(getExprChangedContext());
- clearExprChangedData();
- }
-
- /**
- * Test that we can correctly retrieve the address and type size of an
- * expression
- */
- @Test
- public void testExprAddress() throws Throwable {
-
- SyncUtil.runToLocation("testAddress");
- MIStoppedEvent stoppedEvent = SyncUtil.step(2, StepType.STEP_OVER);
-
- IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- final IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "a");
-
- final IExpressionDMContext exprDmc2 = SyncUtil.createExpression(frameDmc, "a_ptr");
-
- final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
-
- // First get the address of 'a' through 'a_ptr'
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(exprDmc, IFormattedValues.NATURAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData().getFormattedValue().equals("56")) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(
+ new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating natural format, got "
+ + getData().getFormattedValue() + " instead of 56",
+ null));
+ }
+ }
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+
+ assertTrue("ExprChangedEvent problem: expected 1, received " + getExprChangedCount(),
+ getExprChangedCount() == 1);
+ exprDmc.equals(getExprChangedContext());
+ clearExprChangedData();
+ }
+
+ /**
+ * Test that we can correctly retrieve the address and type size of an
+ * expression
+ */
+ @Test
+ public void testExprAddress() throws Throwable {
+
+ SyncUtil.runToLocation("testAddress");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(2, StepType.STEP_OVER);
+
+ IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ final IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "a");
+
+ final IExpressionDMContext exprDmc2 = SyncUtil.createExpression(frameDmc, "a_ptr");
+
+ final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
+
+ // First get the address of 'a' through 'a_ptr'
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- fExpService.getFormattedExpressionValue(fExpService.getFormattedValueContext(exprDmc2,
- IFormattedValues.NATURAL_FORMAT), new DataRequestMonitor<FormattedValueDMData>(fExpService
- .getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (isSuccess()) {
- wait.setReturnInfo(getData());
- }
-
- wait.waitFinished(getStatus());
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
-
- String actualAddrStr = ((FormattedValueDMData) wait.getReturnInfo()).getFormattedValue();
- wait.waitReset();
-
- // Now check the address through our getAddressData
- checkAddressData(exprDmc, actualAddrStr, 4);
-
- assertTrue("ExprChangedEvent problem: expected 0, received " + getExprChangedCount(),
- getExprChangedCount() == 0);
- }
-
-
- /**
- * Test that we can correctly evaluate C expressions involving global
- * variables.
- *
- * @return void
- */
- @Test
- public void testGlobalVariables() throws Throwable {
-
- // Step to a stack level of 2 to be able to test differen stack frames
- MIStoppedEvent stoppedEvent = SyncUtil.runToLocation("locals2");
-
- // Create a map of expressions to expected values.
- Map<String, String[]> tests = new HashMap<String, String[]>();
-
- // Global variables
- tests.put("gIntVar", new String[] { "0x21F", "01037", "1000011111", "543", "543", "543" });
- tests.put("gDoubleVar", new String[] { "0x21F", "01037", "1000011111", "543", "543.54300000000001", "543.54300000000001" });
- tests.put("gCharVar", new String[] { "0x67", "0147", "1100111", "103", "103 'g'", "103 'g'" });
- tests.put("gBoolVar", new String[] { "0x0", "0", "0", "0", "false", "false" });
-
- tests.put("gIntArray[1]", new String[] { "0x28E", "01216", "1010001110", "654", "654", "654" });
- tests.put("gDoubleArray[1]", new String[] { "0x28E", "01216", "1010001110", "654", "654.32100000000003", "654.32100000000003" });
- tests.put("gCharArray[1]", new String[] { "0x64", "0144", "1100100", "100", "100 'd'", "100 'd'" });
- tests.put("gBoolArray[1]", new String[] { "0x0", "0", "0", "0", "false", "false" });
-
- tests.put("*gIntPtr", new String[] { "0x21F", "01037", "1000011111", "543", "543", "543" });
- tests.put("*gDoublePtr", new String[] { "0x21F", "01037", "1000011111", "543", "543.54300000000001", "543.54300000000001" });
- tests.put("*gCharPtr", new String[] { "0x67", "0147", "1100111", "103", "103 'g'", "103 'g'" });
- tests.put("*gBoolPtr", new String[] { "0x0", "0", "0", "0", "false", "false" });
-
- tests.put("gIntPtr2", new String[] { "0x8", "010", "1000", "8", "0x8" , "0x8" });
- tests.put("gDoublePtr2", new String[] { "0x5432", "052062", "101010000110010", "21554", "0x5432", "0x5432" });
- // GDB says a char* is out of bounds, but not the other pointers???
- // tests.put("gCharPtr2", new String[] { "0x4321", "041441",
- // "100001100100001", "17185", "0x4321" });
- tests.put("gBoolPtr2", new String[] { "0x12ABCDEF", "02252746757", "10010101010111100110111101111",
- "313249263", "0x12ABCDEF", "0x12ABCDEF" });
-
- // Try different stack frames
- executeExpressionSubTests(tests, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
- executeExpressionSubTests(tests, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 1));
- executeExpressionSubTests(tests, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 2));
- }
-
- /**
- * This test verifies that the ExpressionService can handle having a
- * variable with the same name in two different methods but at the same
- * stack depth.
- */
- @Test
- public void testNamingSameDepth() throws Throwable {
- SyncUtil.runToLocation("testName1");
- MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
- IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- Map<String, String[]> tests = new HashMap<String, String[]>();
- tests.put("a", new String[] { "0x1", "01", "1", "1", "1", "1" });
- executeExpressionSubTests(tests, frameDmc);
-
- SyncUtil.runToLocation("testName2");
- stoppedEvent = SyncUtil.step(1, StepType.STEP_INTO);
- frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
- tests = new HashMap<String, String[]>();
- tests.put("a", new String[] { "0x2", "02", "10", "2", "2", "2" });
- executeExpressionSubTests(tests, frameDmc);
-
- SyncUtil.runToLocation("testName1");
- stoppedEvent = SyncUtil.step(1, StepType.STEP_INTO);
- frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
- tests = new HashMap<String, String[]>();
- tests.put("a", new String[] { "0x3", "03", "11", "3", "3", "3" });
- executeExpressionSubTests(tests, frameDmc);
- }
-
- /**
- * This test verifies that the ExpressionService can handle having a
- * variable with the same name in two methods that also have the same name
- */
- @Test
- public void testNamingSameMethod() throws Throwable {
- SyncUtil.runToLocation("testSameName");
- MIStoppedEvent stoppedEvent = SyncUtil.step(2, StepType.STEP_INTO);
- IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- Map<String, String[]> tests = new HashMap<String, String[]>();
- tests.put("a", new String[] { "0x1", "01", "1", "1", "1" , "1" });
- executeExpressionSubTests(tests, frameDmc);
-
- SyncUtil.step(StepType.STEP_RETURN);
- stoppedEvent = SyncUtil.step(2, StepType.STEP_INTO);
- frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
- tests = new HashMap<String, String[]>();
- tests.put("a", new String[] { "0x2", "02", "10", "2", "2", "2" });
- executeExpressionSubTests(tests, frameDmc);
-
- SyncUtil.step(StepType.STEP_RETURN);
- stoppedEvent = SyncUtil.step(2, StepType.STEP_INTO);
- frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
- tests = new HashMap<String, String[]>();
- tests.put("a", new String[] { "0x3", "03", "11", "3", "3", "3" });
- executeExpressionSubTests(tests, frameDmc);
- }
-
- /**
- * This test makes sure that if a request for expression values are made with
- * a thread selected, the top-most stack frame is used for evaluation
- */
- @Test
- public void testThreadContext() throws Throwable {
-
- // Step to a stack level of 2 to be able to test differen stack frames
- SyncUtil.runToLocation("locals2");
- MIStoppedEvent stoppedEvent = SyncUtil.step(StepType.STEP_OVER);
-
- // Create a map of expressions to expected values.
- Map<String, String[]> tests = new HashMap<String, String[]>();
-
- // First make sure we have a different value on the other stack frame and that we select
- // a frame that is not the top frame
- tests.put("lIntVar", new String[] { "0x3039", "030071", "11000000111001", "12345", "12345", "12345" });
- executeExpressionSubTests(tests, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 1));
-
- // Now check that we get the same values as the top stack when selecting the thread only
- tests = new HashMap<String, String[]>();
- tests.put("lIntVar", new String[] { "0x1a85", "015205", "1101010000101", "6789", "6789" , "6789" });
- executeExpressionSubTests(tests, stoppedEvent.getDMContext());
- }
-
- /**
- * This test verifies that the ExpressionService can handle having a
- * child variable with the same name in two methods that also have the same name
- */
- @Test
- public void testChildNamingSameMethod() throws Throwable {
- SyncUtil.runToLocation("testSameName");
- MIStoppedEvent stoppedEvent = SyncUtil.step(4, StepType.STEP_INTO);
- final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
-
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(exprDmc2, IFormattedValues.NATURAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (isSuccess()) {
+ wait.setReturnInfo(getData());
+ }
+
+ wait.waitFinished(getStatus());
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+
+ String actualAddrStr = ((FormattedValueDMData) wait.getReturnInfo()).getFormattedValue();
+ wait.waitReset();
+
+ // Now check the address through our getAddressData
+ checkAddressData(exprDmc, actualAddrStr, 4);
+
+ assertTrue("ExprChangedEvent problem: expected 0, received " + getExprChangedCount(),
+ getExprChangedCount() == 0);
+ }
+
+ /**
+ * Test that we can correctly evaluate C expressions involving global
+ * variables.
+ *
+ * @return void
+ */
+ @Test
+ public void testGlobalVariables() throws Throwable {
+
+ // Step to a stack level of 2 to be able to test differen stack frames
+ MIStoppedEvent stoppedEvent = SyncUtil.runToLocation("locals2");
+
+ // Create a map of expressions to expected values.
+ Map<String, String[]> tests = new HashMap<String, String[]>();
+
+ // Global variables
+ tests.put("gIntVar", new String[] { "0x21F", "01037", "1000011111", "543", "543", "543" });
+ tests.put("gDoubleVar",
+ new String[] { "0x21F", "01037", "1000011111", "543", "543.54300000000001", "543.54300000000001" });
+ tests.put("gCharVar", new String[] { "0x67", "0147", "1100111", "103", "103 'g'", "103 'g'" });
+ tests.put("gBoolVar", new String[] { "0x0", "0", "0", "0", "false", "false" });
+
+ tests.put("gIntArray[1]", new String[] { "0x28E", "01216", "1010001110", "654", "654", "654" });
+ tests.put("gDoubleArray[1]",
+ new String[] { "0x28E", "01216", "1010001110", "654", "654.32100000000003", "654.32100000000003" });
+ tests.put("gCharArray[1]", new String[] { "0x64", "0144", "1100100", "100", "100 'd'", "100 'd'" });
+ tests.put("gBoolArray[1]", new String[] { "0x0", "0", "0", "0", "false", "false" });
+
+ tests.put("*gIntPtr", new String[] { "0x21F", "01037", "1000011111", "543", "543", "543" });
+ tests.put("*gDoublePtr",
+ new String[] { "0x21F", "01037", "1000011111", "543", "543.54300000000001", "543.54300000000001" });
+ tests.put("*gCharPtr", new String[] { "0x67", "0147", "1100111", "103", "103 'g'", "103 'g'" });
+ tests.put("*gBoolPtr", new String[] { "0x0", "0", "0", "0", "false", "false" });
+
+ tests.put("gIntPtr2", new String[] { "0x8", "010", "1000", "8", "0x8", "0x8" });
+ tests.put("gDoublePtr2", new String[] { "0x5432", "052062", "101010000110010", "21554", "0x5432", "0x5432" });
+ // GDB says a char* is out of bounds, but not the other pointers???
+ // tests.put("gCharPtr2", new String[] { "0x4321", "041441",
+ // "100001100100001", "17185", "0x4321" });
+ tests.put("gBoolPtr2", new String[] { "0x12ABCDEF", "02252746757", "10010101010111100110111101111", "313249263",
+ "0x12ABCDEF", "0x12ABCDEF" });
+
+ // Try different stack frames
+ executeExpressionSubTests(tests, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
+ executeExpressionSubTests(tests, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 1));
+ executeExpressionSubTests(tests, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 2));
+ }
+
+ /**
+ * This test verifies that the ExpressionService can handle having a
+ * variable with the same name in two different methods but at the same
+ * stack depth.
+ */
+ @Test
+ public void testNamingSameDepth() throws Throwable {
+ SyncUtil.runToLocation("testName1");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
+ IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ Map<String, String[]> tests = new HashMap<String, String[]>();
+ tests.put("a", new String[] { "0x1", "01", "1", "1", "1", "1" });
+ executeExpressionSubTests(tests, frameDmc);
+
+ SyncUtil.runToLocation("testName2");
+ stoppedEvent = SyncUtil.step(1, StepType.STEP_INTO);
+ frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+ tests = new HashMap<String, String[]>();
+ tests.put("a", new String[] { "0x2", "02", "10", "2", "2", "2" });
+ executeExpressionSubTests(tests, frameDmc);
+
+ SyncUtil.runToLocation("testName1");
+ stoppedEvent = SyncUtil.step(1, StepType.STEP_INTO);
+ frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+ tests = new HashMap<String, String[]>();
+ tests.put("a", new String[] { "0x3", "03", "11", "3", "3", "3" });
+ executeExpressionSubTests(tests, frameDmc);
+ }
+
+ /**
+ * This test verifies that the ExpressionService can handle having a
+ * variable with the same name in two methods that also have the same name
+ */
+ @Test
+ public void testNamingSameMethod() throws Throwable {
+ SyncUtil.runToLocation("testSameName");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(2, StepType.STEP_INTO);
+ IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ Map<String, String[]> tests = new HashMap<String, String[]>();
+ tests.put("a", new String[] { "0x1", "01", "1", "1", "1", "1" });
+ executeExpressionSubTests(tests, frameDmc);
+
+ SyncUtil.step(StepType.STEP_RETURN);
+ stoppedEvent = SyncUtil.step(2, StepType.STEP_INTO);
+ frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+ tests = new HashMap<String, String[]>();
+ tests.put("a", new String[] { "0x2", "02", "10", "2", "2", "2" });
+ executeExpressionSubTests(tests, frameDmc);
+
+ SyncUtil.step(StepType.STEP_RETURN);
+ stoppedEvent = SyncUtil.step(2, StepType.STEP_INTO);
+ frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+ tests = new HashMap<String, String[]>();
+ tests.put("a", new String[] { "0x3", "03", "11", "3", "3", "3" });
+ executeExpressionSubTests(tests, frameDmc);
+ }
+
+ /**
+ * This test makes sure that if a request for expression values are made with
+ * a thread selected, the top-most stack frame is used for evaluation
+ */
+ @Test
+ public void testThreadContext() throws Throwable {
+
+ // Step to a stack level of 2 to be able to test differen stack frames
+ SyncUtil.runToLocation("locals2");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(StepType.STEP_OVER);
+
+ // Create a map of expressions to expected values.
+ Map<String, String[]> tests = new HashMap<String, String[]>();
+
+ // First make sure we have a different value on the other stack frame and that we select
+ // a frame that is not the top frame
+ tests.put("lIntVar", new String[] { "0x3039", "030071", "11000000111001", "12345", "12345", "12345" });
+ executeExpressionSubTests(tests, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 1));
+
+ // Now check that we get the same values as the top stack when selecting the thread only
+ tests = new HashMap<String, String[]>();
+ tests.put("lIntVar", new String[] { "0x1a85", "015205", "1101010000101", "6789", "6789", "6789" });
+ executeExpressionSubTests(tests, stoppedEvent.getDMContext());
+ }
+
+ /**
+ * This test verifies that the ExpressionService can handle having a
+ * child variable with the same name in two methods that also have the same name
+ */
+ @Test
+ public void testChildNamingSameMethod() throws Throwable {
+ SyncUtil.runToLocation("testSameName");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(4, StepType.STEP_INTO);
+ final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
+
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- // First create the var object and all its children
- IExpressionDMContext parentDmc = fExpService.createExpression(frameDmc, "z");
-
- fExpService.getSubExpressions(
- parentDmc,
- new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (getData().length != 2) {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed getting children; expecting 2 got " + getData().length, null));
- } else {
+ // First create the var object and all its children
+ IExpressionDMContext parentDmc = fExpService.createExpression(frameDmc, "z");
+
+ fExpService.getSubExpressions(parentDmc,
+ new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (getData().length != 2) {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed getting children; expecting 2 got " + getData().length, null));
+ } else {
// now get the value of the child
- final String valueStr = "1";
- final IExpressionDMContext child = getData()[0];
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(child, IFormattedValues.NATURAL_FORMAT),
- new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (getData().getFormattedValue().equals(valueStr)) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating " + child.getExpression() + ", got " + getData().getFormattedValue()
- + " instead of " + valueStr, null));
- }
- }
-
- });
- }
-
-
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
- wait.waitReset();
-
- SyncUtil.step(StepType.STEP_RETURN);
- stoppedEvent = SyncUtil.step(4, StepType.STEP_INTO);
- final IFrameDMContext frameDmc2 = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ final String valueStr = "1";
+ final IExpressionDMContext child = getData()[0];
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(child,
+ IFormattedValues.NATURAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(),
+ null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (getData().getFormattedValue().equals(valueStr)) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(new Status(IStatus.ERROR,
+ TestsPlugin.PLUGIN_ID,
+ "Failed evaluating " + child.getExpression() + ", got "
+ + getData().getFormattedValue() + " instead of "
+ + valueStr,
+ null));
+ }
+ }
+
+ });
+ }
+
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+ wait.waitReset();
+
+ SyncUtil.step(StepType.STEP_RETURN);
+ stoppedEvent = SyncUtil.step(4, StepType.STEP_INTO);
+ final IFrameDMContext frameDmc2 = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- // First create the var object and all its children
- IExpressionDMContext parentDmc = fExpService.createExpression(frameDmc2, "z");
-
- fExpService.getSubExpressions(
- parentDmc,
- new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (getData().length != 2) {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed getting children; expecting 2 got " + getData().length, null));
- } else {
+ // First create the var object and all its children
+ IExpressionDMContext parentDmc = fExpService.createExpression(frameDmc2, "z");
+
+ fExpService.getSubExpressions(parentDmc,
+ new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (getData().length != 2) {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed getting children; expecting 2 got " + getData().length, null));
+ } else {
// now get the value of the child
- final String valueStr = "2";
- final IExpressionDMContext child = getData()[0];
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(child, IFormattedValues.NATURAL_FORMAT),
- new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (getData().getFormattedValue().equals(valueStr)) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating " + child.getExpression() + ", got " + getData().getFormattedValue()
- + " instead of " + valueStr, null));
- }
- }
-
- });
- }
-
-
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
- wait.waitReset();
-
- SyncUtil.step(StepType.STEP_RETURN);
- stoppedEvent = SyncUtil.step(4, StepType.STEP_INTO);
- final IFrameDMContext frameDmc3 = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ final String valueStr = "2";
+ final IExpressionDMContext child = getData()[0];
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(child,
+ IFormattedValues.NATURAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(),
+ null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (getData().getFormattedValue().equals(valueStr)) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(new Status(IStatus.ERROR,
+ TestsPlugin.PLUGIN_ID,
+ "Failed evaluating " + child.getExpression() + ", got "
+ + getData().getFormattedValue() + " instead of "
+ + valueStr,
+ null));
+ }
+ }
+
+ });
+ }
+
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+ wait.waitReset();
+
+ SyncUtil.step(StepType.STEP_RETURN);
+ stoppedEvent = SyncUtil.step(4, StepType.STEP_INTO);
+ final IFrameDMContext frameDmc3 = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- // First create the var object and all its children
- IExpressionDMContext parentDmc = fExpService.createExpression(frameDmc3, "z");
-
- fExpService.getSubExpressions(
- parentDmc,
- new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (getData().length != 2) {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed getting children; expecting 2 got " + getData().length, null));
- } else {
+ // First create the var object and all its children
+ IExpressionDMContext parentDmc = fExpService.createExpression(frameDmc3, "z");
+
+ fExpService.getSubExpressions(parentDmc,
+ new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (getData().length != 2) {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed getting children; expecting 2 got " + getData().length, null));
+ } else {
// now get the value of the child
- final String valueStr = "3";
- final IExpressionDMContext child = getData()[0];
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(child, IFormattedValues.NATURAL_FORMAT),
- new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (getData().getFormattedValue().equals(valueStr)) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating " + child.getExpression() + ", got " + getData().getFormattedValue()
- + " instead of " + valueStr, null));
- }
- }
-
- });
- }
-
-
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
- wait.waitReset();
-
- }
-
- /**
- * This test verifies that the ExpressionService properly updates
- * children variables, when we do not update the parent explicitly
- */
- @Test
- public void testUpdatingChildren() throws Throwable {
- SyncUtil.runToLocation("testUpdateChildren");
- MIStoppedEvent stoppedEvent = SyncUtil.step(2, StepType.STEP_OVER);
- final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
- doUpdateTest(frameDmc, 0);
-
- // Re-run the test to test out-of-scope update again
- SyncUtil.step(StepType.STEP_RETURN);
- stoppedEvent = SyncUtil.step(3, StepType.STEP_INTO);
- final IFrameDMContext frameDmc2 = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
- doUpdateTest(frameDmc2, 100);
-
- // Re-run the test within a different method test out-of-scope updates
- SyncUtil.step(StepType.STEP_RETURN);
- stoppedEvent = SyncUtil.step(3, StepType.STEP_INTO);
- final IFrameDMContext frameDmc3 = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
- doUpdateTest(frameDmc3, 200);
-
- }
-
-
- public void doUpdateTest(final IFrameDMContext frameDmc, final int baseValue) throws Throwable {
- final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
-
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ final String valueStr = "3";
+ final IExpressionDMContext child = getData()[0];
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(child,
+ IFormattedValues.NATURAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(),
+ null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (getData().getFormattedValue().equals(valueStr)) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(new Status(IStatus.ERROR,
+ TestsPlugin.PLUGIN_ID,
+ "Failed evaluating " + child.getExpression() + ", got "
+ + getData().getFormattedValue() + " instead of "
+ + valueStr,
+ null));
+ }
+ }
+
+ });
+ }
+
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+ wait.waitReset();
+
+ }
+
+ /**
+ * This test verifies that the ExpressionService properly updates
+ * children variables, when we do not update the parent explicitly
+ */
+ @Test
+ public void testUpdatingChildren() throws Throwable {
+ SyncUtil.runToLocation("testUpdateChildren");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(2, StepType.STEP_OVER);
+ final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+ doUpdateTest(frameDmc, 0);
+
+ // Re-run the test to test out-of-scope update again
+ SyncUtil.step(StepType.STEP_RETURN);
+ stoppedEvent = SyncUtil.step(3, StepType.STEP_INTO);
+ final IFrameDMContext frameDmc2 = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+ doUpdateTest(frameDmc2, 100);
+
+ // Re-run the test within a different method test out-of-scope updates
+ SyncUtil.step(StepType.STEP_RETURN);
+ stoppedEvent = SyncUtil.step(3, StepType.STEP_INTO);
+ final IFrameDMContext frameDmc3 = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+ doUpdateTest(frameDmc3, 200);
+
+ }
+
+ public void doUpdateTest(final IFrameDMContext frameDmc, final int baseValue) throws Throwable {
+ final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
+
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- // First create the var object and all its children
- IExpressionDMContext parentDmc = fExpService.createExpression(frameDmc, "a");
-
- fExpService.getSubExpressions(
- parentDmc,
- new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (getData().length != 1) {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed getting children; expecting 1 got " + getData().length, null));
- } else {
- // Now list the children of this child
- fExpService.getSubExpressions(
- getData()[0],
- new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- final IExpressionDMContext[] childDmcs = getData();
-
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (childDmcs.length != 2) {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed getting children; expecting 2 got " + childDmcs.length, null));
- } else {
- // now get the value of the two children
- for (int i =0; i<2; i++) {
- final String valueStr = Integer.toString(baseValue + i + 10);
- final int finali = i;
-
- wait.increment();
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(childDmcs[i], IFormattedValues.NATURAL_FORMAT),
- new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (getData().getFormattedValue().equals(valueStr)) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating " + childDmcs[finali].getExpression() + ", got " + getData().getFormattedValue()
- + " instead of " + valueStr, null));
- }
- }
-
- });
- }
- }
- }
- });
- }
-
-
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
- wait.waitReset();
-
- // Now step to change the value of a.z.x and a.z.y and verify the changed values.
- // This will confirm that the parent "a" will have been properly updated
- // It is a better test to do it for two children because it tests concurrent update requests
- MIStoppedEvent stoppedEvent = SyncUtil.step(2, StepType.STEP_OVER);
- final IFrameDMContext frameDmc2 = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ // First create the var object and all its children
+ IExpressionDMContext parentDmc = fExpService.createExpression(frameDmc, "a");
+
+ fExpService.getSubExpressions(parentDmc,
+ new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (getData().length != 1) {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed getting children; expecting 1 got " + getData().length, null));
+ } else {
+ // Now list the children of this child
+ fExpService.getSubExpressions(getData()[0],
+ new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(),
+ null) {
+ @Override
+ protected void handleCompleted() {
+ final IExpressionDMContext[] childDmcs = getData();
+
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (childDmcs.length != 2) {
+ wait.waitFinished(
+ new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed getting children; expecting 2 got "
+ + childDmcs.length,
+ null));
+ } else {
+ // now get the value of the two children
+ for (int i = 0; i < 2; i++) {
+ final String valueStr = Integer
+ .toString(baseValue + i + 10);
+ final int finali = i;
+
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(childDmcs[i],
+ IFormattedValues.NATURAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(
+ fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (getData().getFormattedValue()
+ .equals(valueStr)) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(new Status(
+ IStatus.ERROR,
+ TestsPlugin.PLUGIN_ID,
+ "Failed evaluating "
+ + childDmcs[finali]
+ .getExpression()
+ + ", got "
+ + getData()
+ .getFormattedValue()
+ + " instead of "
+ + valueStr,
+ null));
+ }
+ }
+
+ });
+ }
+ }
+ }
+ });
+ }
+
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+ wait.waitReset();
+
+ // Now step to change the value of a.z.x and a.z.y and verify the changed values.
+ // This will confirm that the parent "a" will have been properly updated
+ // It is a better test to do it for two children because it tests concurrent update requests
+ MIStoppedEvent stoppedEvent = SyncUtil.step(2, StepType.STEP_OVER);
+ final IFrameDMContext frameDmc2 = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- // First create the var object and all its children
- IExpressionDMContext parentDmc = fExpService.createExpression(frameDmc2, "a");
-
- fExpService.getSubExpressions(
- parentDmc,
- new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (getData().length != 1) {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed getting children; expecting 1 got " + getData().length, null));
- } else {
- // Now list the children of this child
- fExpService.getSubExpressions(
- getData()[0],
- new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- final IExpressionDMContext[] childDmcs = getData();
-
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (childDmcs.length != 2) {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed getting children; expecting 2 got " + childDmcs.length, null));
- } else {
- // now get the value of the two children
- for (int i =0; i<2; i++) {
- final String valueStr = Integer.toString(baseValue + i + 20);
- final int finali = i;
-
- wait.increment();
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(childDmcs[i], IFormattedValues.NATURAL_FORMAT),
- new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (getData().getFormattedValue().equals(valueStr)) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating " + childDmcs[finali].getExpression() + ", got " + getData().getFormattedValue()
- + " instead of " + valueStr, null));
- }
- }
-
- });
- }
- }
- }
- });
- }
-
-
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
- wait.waitReset();
- }
-
- /**
- * This test creates a variable object with children (not an array) and then gets these children
- * to be deleted because of a large number of other variable objects being created.
- * We then check that the expression service can handle a request for one of those deleted children,
- * which has a complex path.
- */
- @Test
- public void testDeleteChildren() throws Throwable {
- assumeGdbVersionAtLeast(ITestConstants.SUFFIX_GDB_6_7);
- assumeGdbVersionLowerThen(ITestConstants.SUFFIX_GDB_7_3);
-
- SyncUtil.runToLocation("testDeleteChildren");
- MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
- final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
-
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ // First create the var object and all its children
+ IExpressionDMContext parentDmc = fExpService.createExpression(frameDmc2, "a");
+
+ fExpService.getSubExpressions(parentDmc,
+ new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (getData().length != 1) {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed getting children; expecting 1 got " + getData().length, null));
+ } else {
+ // Now list the children of this child
+ fExpService.getSubExpressions(getData()[0],
+ new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(),
+ null) {
+ @Override
+ protected void handleCompleted() {
+ final IExpressionDMContext[] childDmcs = getData();
+
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (childDmcs.length != 2) {
+ wait.waitFinished(
+ new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed getting children; expecting 2 got "
+ + childDmcs.length,
+ null));
+ } else {
+ // now get the value of the two children
+ for (int i = 0; i < 2; i++) {
+ final String valueStr = Integer
+ .toString(baseValue + i + 20);
+ final int finali = i;
+
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(childDmcs[i],
+ IFormattedValues.NATURAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(
+ fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (getData().getFormattedValue()
+ .equals(valueStr)) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(new Status(
+ IStatus.ERROR,
+ TestsPlugin.PLUGIN_ID,
+ "Failed evaluating "
+ + childDmcs[finali]
+ .getExpression()
+ + ", got "
+ + getData()
+ .getFormattedValue()
+ + " instead of "
+ + valueStr,
+ null));
+ }
+ }
+
+ });
+ }
+ }
+ }
+ });
+ }
+
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+ wait.waitReset();
+ }
+
+ /**
+ * This test creates a variable object with children (not an array) and then gets these children
+ * to be deleted because of a large number of other variable objects being created.
+ * We then check that the expression service can handle a request for one of those deleted children,
+ * which has a complex path.
+ */
+ @Test
+ public void testDeleteChildren() throws Throwable {
+ assumeGdbVersionAtLeast(ITestConstants.SUFFIX_GDB_6_7);
+ assumeGdbVersionLowerThen(ITestConstants.SUFFIX_GDB_7_3);
+
+ SyncUtil.runToLocation("testDeleteChildren");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
+ final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
+
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- // First create the var object and all its children
- IExpressionDMContext parentDmc = fExpService.createExpression(frameDmc, "f");
-
- fExpService.getSubExpressions(
- parentDmc,
- new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData().length != 5) {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed getting children; expecting 5 got " + getData().length, null));
- } else {
- String childStr = "((bar) f)";
- if (!getData()[0].getExpression().equals(childStr)) {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Got child " + getData()[0].getExpression() + " instead of " + childStr, null));
- } else {
- // Now list the children of the first element
- fExpService.getSubExpressions(
- getData()[0],
- new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData().length != 2) {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed getting children; expecting 2 got " + getData().length, null));
- } else {
- String childStr = "((((bar) f)).d)";
- if (!getData()[0].getExpression().equals(childStr)) {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Got child " + getData()[0].getExpression() + " instead of " + childStr, null));
- } else {
- wait.setReturnInfo(getData()[0]);
- wait.waitFinished();
- }
- }
- }
- }
- });
- }
- }
- }
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
- final IExpressionDMContext deletedChildDmc = (IExpressionDMContext)wait.getReturnInfo();
-
- wait.waitReset();
-
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ // First create the var object and all its children
+ IExpressionDMContext parentDmc = fExpService.createExpression(frameDmc, "f");
+
+ fExpService.getSubExpressions(parentDmc,
+ new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData().length != 5) {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed getting children; expecting 5 got " + getData().length, null));
+ } else {
+ String childStr = "((bar) f)";
+ if (!getData()[0].getExpression().equals(childStr)) {
+ wait.waitFinished(new Status(
+ IStatus.ERROR, TestsPlugin.PLUGIN_ID, "Got child "
+ + getData()[0].getExpression() + " instead of " + childStr,
+ null));
+ } else {
+ // Now list the children of the first element
+ fExpService.getSubExpressions(getData()[0],
+ new DataRequestMonitor<IExpressionDMContext[]>(
+ fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData().length != 2) {
+ wait.waitFinished(new Status(IStatus.ERROR,
+ TestsPlugin.PLUGIN_ID,
+ "Failed getting children; expecting 2 got "
+ + getData().length,
+ null));
+ } else {
+ String childStr = "((((bar) f)).d)";
+ if (!getData()[0].getExpression()
+ .equals(childStr)) {
+ wait.waitFinished(new Status(IStatus.ERROR,
+ TestsPlugin.PLUGIN_ID,
+ "Got child "
+ + getData()[0].getExpression()
+ + " instead of " + childStr,
+ null));
+ } else {
+ wait.setReturnInfo(getData()[0]);
+ wait.waitFinished();
+ }
+ }
+ }
+ }
+ });
+ }
+ }
+ }
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+ final IExpressionDMContext deletedChildDmc = (IExpressionDMContext) wait.getReturnInfo();
+
+ wait.waitReset();
+
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- // Now create more than 1000 expressions to trigger the deletion of the children
- // that were created above
- for (int i=0; i<1100; i++) {
- IExpressionDMContext dmc = fExpService.createExpression(frameDmc, "a[" + i + "]");
-
- wait.increment();
- fExpService.getExpressionData(
- dmc,
- new DataRequestMonitor<IExpressionDMData>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- wait.waitFinished();
- }
- }
- });
- }
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
- wait.waitReset();
-
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ // Now create more than 1000 expressions to trigger the deletion of the children
+ // that were created above
+ for (int i = 0; i < 1100; i++) {
+ IExpressionDMContext dmc = fExpService.createExpression(frameDmc, "a[" + i + "]");
+
+ wait.increment();
+ fExpService.getExpressionData(dmc,
+ new DataRequestMonitor<IExpressionDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ wait.waitFinished();
+ }
+ }
+ });
+ }
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+ wait.waitReset();
+
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- // Evaluate the expression of a child that we know is deleted to make sure
- // the expression service can handle that
- fExpService.getExpressionData(
- deletedChildDmc,
- new DataRequestMonitor<IExpressionDMData>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- wait.waitFinished();
- }
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
- wait.waitReset();
-
- }
-
- /**
+ // Evaluate the expression of a child that we know is deleted to make sure
+ // the expression service can handle that
+ fExpService.getExpressionData(deletedChildDmc,
+ new DataRequestMonitor<IExpressionDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ wait.waitFinished();
+ }
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+ wait.waitReset();
+
+ }
+
+ /**
* GDB 6.7 has a bug which will cause var-update not to show
* the new value of 'a' if we switch the format to binary,
* since binary of 3 is 11 which is the same as the old value
* in natural format. Our expression service should work around this.
- *
+ *
* int main() {
* int a = 11;
* a = 3;
* return 0;
* }
- */
- @Test
- public void testUpdateGDBBug() throws Throwable {
- SyncUtil.runToLocation("testUpdateGDBBug");
- MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
- final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
-
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ */
+ @Test
+ public void testUpdateGDBBug() throws Throwable {
+ SyncUtil.runToLocation("testUpdateGDBBug");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
+ final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
+
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- // First create the var object and all its children
- IExpressionDMContext exprDmc = fExpService.createExpression(frameDmc, "a");
-
- // This call will create the variable object in natural format and then change
- // it to binary to fetch the value
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(exprDmc, IFormattedValues.BINARY_FORMAT),
- new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData().getFormattedValue().equals("1011")) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating binary format, expected 1011 but got " +
- getData().getFormattedValue(), null));
- }
- }
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
- wait.waitReset();
-
- // Now step to change the value of "a" and ask for it again
- stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
- final IFrameDMContext frameDmc2 = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ // First create the var object and all its children
+ IExpressionDMContext exprDmc = fExpService.createExpression(frameDmc, "a");
+
+ // This call will create the variable object in natural format and then change
+ // it to binary to fetch the value
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(exprDmc, IFormattedValues.BINARY_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData().getFormattedValue().equals("1011")) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating binary format, expected 1011 but got "
+ + getData().getFormattedValue(),
+ null));
+ }
+ }
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+ wait.waitReset();
+
+ // Now step to change the value of "a" and ask for it again
+ stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
+ final IFrameDMContext frameDmc2 = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- // First create the var object and all its children
- IExpressionDMContext exprDmc = fExpService.createExpression(frameDmc2, "a");
-
- // This call will create the variable object in natural format and then change
- // it to binary to fetch the value
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(exprDmc, IFormattedValues.BINARY_FORMAT),
- new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData().getFormattedValue().equals("11")) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating binary format, expected 11 but got " +
- getData().getFormattedValue(), null));
- }
- }
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
- wait.waitReset();
- }
-
- /**
+ // First create the var object and all its children
+ IExpressionDMContext exprDmc = fExpService.createExpression(frameDmc2, "a");
+
+ // This call will create the variable object in natural format and then change
+ // it to binary to fetch the value
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(exprDmc, IFormattedValues.BINARY_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData().getFormattedValue().equals("11")) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating binary format, expected 11 but got "
+ + getData().getFormattedValue(),
+ null));
+ }
+ }
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+ wait.waitReset();
+ }
+
+ /**
* var-update will not show a change if eval-expression is the same
* in the current format. This is a problem for us because we don't
* know if another format changed:
- *
+ *
* int main() {
* double a = 1.99;
* a = 1.11;
* }
- *
+ *
* If a is displayed in anything but natural, both values of a are the same
* and we won't know it changed in the natural format.
- *
+ *
* The test below is in case GDB fixes var-update to keep track of the last
* printed value through eval-expression. Until they do that, we do not have
* a problem because of our caching: where, if we change formats since the last
@@ -2090,181 +2155,191 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
* So, the -var-update will show a change because of the new current format.
* But if GDB has eval-expression reset their stored printed_value, this test
* will fail and we'll know we have to fix something.
- */
- @Test
- public void testUpdateIssue() throws Throwable {
- SyncUtil.runToLocation("testUpdateIssue");
- MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
- final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
-
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ */
+ @Test
+ public void testUpdateIssue() throws Throwable {
+ SyncUtil.runToLocation("testUpdateIssue");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
+ final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
+
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- // First create the var object and all its children
- IExpressionDMContext exprDmc = fExpService.createExpression(frameDmc, "a");
-
- // check that we have the proper value
- wait.increment();
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(exprDmc, IFormattedValues.NATURAL_FORMAT),
- new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData().getFormattedValue().equals("1.99")) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating a, expected 1.99 but got " +
- getData().getFormattedValue(), null));
- }
- }
- }
- });
-
- // ask for hex to set the format to hex
- wait.increment();
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(exprDmc, IFormattedValues.HEX_FORMAT),
- new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData().getFormattedValue().equals("0x1")) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating a, expected 0x1 but got " +
- getData().getFormattedValue(), null));
- }
- }
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
- wait.waitReset();
-
- // Now step to change the value of "a" and ask for it again but in the natural format
- stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
- final IFrameDMContext frameDmc2 = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ // First create the var object and all its children
+ IExpressionDMContext exprDmc = fExpService.createExpression(frameDmc, "a");
+
+ // check that we have the proper value
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(exprDmc, IFormattedValues.NATURAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData().getFormattedValue().equals("1.99")) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating a, expected 1.99 but got "
+ + getData().getFormattedValue(),
+ null));
+ }
+ }
+ }
+ });
+
+ // ask for hex to set the format to hex
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(exprDmc, IFormattedValues.HEX_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData().getFormattedValue().equals("0x1")) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating a, expected 0x1 but got "
+ + getData().getFormattedValue(),
+ null));
+ }
+ }
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+ wait.waitReset();
+
+ // Now step to change the value of "a" and ask for it again but in the natural format
+ stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
+ final IFrameDMContext frameDmc2 = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- // First create the var object and all its children
- IExpressionDMContext exprDmc = fExpService.createExpression(frameDmc2, "a");
-
- // trigger the var-update in the last format (hex)
- // then request the actual value in natural which should not be taken from the cache
- wait.increment();
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(exprDmc, IFormattedValues.NATURAL_FORMAT),
- new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData().getFormattedValue().equals("1.22")) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating natural format, expected 1.22 but got " +
- getData().getFormattedValue(), null));
- }
- }
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
- wait.waitReset();
- }
-
- /**
+ // First create the var object and all its children
+ IExpressionDMContext exprDmc = fExpService.createExpression(frameDmc2, "a");
+
+ // trigger the var-update in the last format (hex)
+ // then request the actual value in natural which should not be taken from the cache
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(exprDmc, IFormattedValues.NATURAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData().getFormattedValue().equals("1.22")) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating natural format, expected 1.22 but got "
+ + getData().getFormattedValue(),
+ null));
+ }
+ }
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+ wait.waitReset();
+ }
+
+ /**
* var-update will not show a change if eval-expression is the same
* in the current format. This is a problem for us because we don't
* know if another format changed:
- *
+ *
* int main() {
* struct {
* double d;
* } z;
- *
+ *
* z.d = 1.0;
* z.d = 1.22;
* }
- *
+ *
* If a is displayed in anything but natural, both values of a are the same
* and we won't know it changed in the natural format.
* This test uses a child to increase the value of the test.
* Also, it avoids the cache saving us since we start with the 1.0 value
* which is the same in natural and decimal
- */
- @Test
- public void testUpdateIssue2() throws Throwable {
- SyncUtil.runToLocation("testUpdateIssue2");
- MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
- final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
-
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ */
+ @Test
+ public void testUpdateIssue2() throws Throwable {
+ SyncUtil.runToLocation("testUpdateIssue2");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
+ final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
+
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
-
- IExpressionDMContext parentDmc = fExpService.createExpression(frameDmc, "z");
-
- fExpService.getSubExpressions(
- parentDmc,
- new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (getData().length != 1) {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed getting children; expecting 1 got " + getData().length, null));
- } else {
- // check that we have the proper value
- // This will cache the value 1 in the natural format cache
- final String valueStr = "1";
- globalExpressionCtx1 = getData()[0];
-
- wait.increment();
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(globalExpressionCtx1, IFormattedValues.NATURAL_FORMAT),
- new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (getData().getFormattedValue().equals(valueStr)) {
+
+ IExpressionDMContext parentDmc = fExpService.createExpression(frameDmc, "z");
+
+ fExpService.getSubExpressions(parentDmc,
+ new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (getData().length != 1) {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed getting children; expecting 1 got " + getData().length, null));
+ } else {
+ // check that we have the proper value
+ // This will cache the value 1 in the natural format cache
+ final String valueStr = "1";
+ globalExpressionCtx1 = getData()[0];
+
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(globalExpressionCtx1,
+ IFormattedValues.NATURAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(),
+ null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (getData().getFormattedValue().equals(valueStr)) {
wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating " + globalExpressionCtx1.getExpression() + ", got " + getData().getFormattedValue()
- + " instead of " + valueStr, null));
- }
- }
- });
-
- // ask for decimal to set the format to decimal
- wait.increment();
+ } else {
+ wait.waitFinished(new Status(IStatus.ERROR,
+ TestsPlugin.PLUGIN_ID,
+ "Failed evaluating "
+ + globalExpressionCtx1.getExpression()
+ + ", got " + getData().getFormattedValue()
+ + " instead of " + valueStr,
+ null));
+ }
+ }
+ });
+
+ // ask for decimal to set the format to decimal
+ wait.increment();
fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(globalExpressionCtx1, IFormattedValues.DECIMAL_FORMAT),
- new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ fExpService.getFormattedValueContext(globalExpressionCtx1,
+ IFormattedValues.DECIMAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(),
+ null) {
@Override
protected void handleCompleted() {
if (!isSuccess()) {
@@ -2273,330 +2348,350 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
if (getData().getFormattedValue().equals(valueStr)) {
wait.waitFinished();
} else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating " + globalExpressionCtx1.getExpression() + ", got " + getData().getFormattedValue()
- + " instead of " + valueStr, null));
+ wait.waitFinished(new Status(IStatus.ERROR,
+ TestsPlugin.PLUGIN_ID,
+ "Failed evaluating "
+ + globalExpressionCtx1.getExpression()
+ + ", got " + getData().getFormattedValue()
+ + " instead of " + valueStr,
+ null));
}
}
}
});
- }
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
- wait.waitReset();
-
- // Now step to change the value of "a" in natural but it remains the same in decimal
- SyncUtil.step(1, StepType.STEP_OVER);
-
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ }
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+ wait.waitReset();
+
+ // Now step to change the value of "a" in natural but it remains the same in decimal
+ SyncUtil.step(1, StepType.STEP_OVER);
+
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- // trigger the var-update in the last format (decimal)
- // then request the actual value in natural which should not be taken from the cache
- wait.increment();
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(globalExpressionCtx1, IFormattedValues.NATURAL_FORMAT),
- new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- if (getData().getFormattedValue().equals("1.22")) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating natural format, expected 1.22 but got " +
- getData().getFormattedValue(), null));
- }
- }
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
- wait.waitReset();
- }
-
- /**
- * This test verifies the state handling of a child variable object
- * to make sure that our locking scheme works even though we must deal
- * with an update call, internally
- */
- @Test
- public void testConcurrentReadAndUpdateChild() throws Throwable {
- SyncUtil.runToLocation("testConcurrentReadAndUpdateChild");
- MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
- final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
-
- // Ask for one value to create the var object
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ // trigger the var-update in the last format (decimal)
+ // then request the actual value in natural which should not be taken from the cache
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(globalExpressionCtx1, IFormattedValues.NATURAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ if (getData().getFormattedValue().equals("1.22")) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating natural format, expected 1.22 but got "
+ + getData().getFormattedValue(),
+ null));
+ }
+ }
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+ wait.waitReset();
+ }
+
+ /**
+ * This test verifies the state handling of a child variable object
+ * to make sure that our locking scheme works even though we must deal
+ * with an update call, internally
+ */
+ @Test
+ public void testConcurrentReadAndUpdateChild() throws Throwable {
+ SyncUtil.runToLocation("testConcurrentReadAndUpdateChild");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
+ final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
+
+ // Ask for one value to create the var object
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- // First create the var object and all its children
- IExpressionDMContext parentDmc = fExpService.createExpression(frameDmc, "z");
-
- wait.increment();
- fExpService.getSubExpressions(
- parentDmc,
- new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (getData().length != 1) {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed getting children; expecting 1 got " + getData().length, null));
- } else {
+ // First create the var object and all its children
+ IExpressionDMContext parentDmc = fExpService.createExpression(frameDmc, "z");
+
+ wait.increment();
+ fExpService.getSubExpressions(parentDmc,
+ new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (getData().length != 1) {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed getting children; expecting 1 got " + getData().length, null));
+ } else {
// now get the value of the child
- final String valueStr = "01";
- globalExpressionCtx1 = getData()[0];
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(globalExpressionCtx1, IFormattedValues.OCTAL_FORMAT),
- new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (getData().getFormattedValue().equals(valueStr)) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating " + globalExpressionCtx1.getExpression() + ", got " + getData().getFormattedValue()
- + " instead of " + valueStr, null));
- }
- }
- });
- }
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
- wait.waitReset();
-
- // Now do two reads in two different formats
- // We need to make sure that the locking properly works although we are calling
- // the internal update method, which does affect the state of the object
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ final String valueStr = "01";
+ globalExpressionCtx1 = getData()[0];
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(globalExpressionCtx1,
+ IFormattedValues.OCTAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(),
+ null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (getData().getFormattedValue().equals(valueStr)) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(new Status(IStatus.ERROR,
+ TestsPlugin.PLUGIN_ID,
+ "Failed evaluating "
+ + globalExpressionCtx1.getExpression()
+ + ", got " + getData().getFormattedValue()
+ + " instead of " + valueStr,
+ null));
+ }
+ }
+ });
+ }
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+ wait.waitReset();
+
+ // Now do two reads in two different formats
+ // We need to make sure that the locking properly works although we are calling
+ // the internal update method, which does affect the state of the object
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- wait.increment();
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(globalExpressionCtx1, IFormattedValues.BINARY_FORMAT),
- new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(globalExpressionCtx1, IFormattedValues.BINARY_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
final String valueStr = "1";
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (getData().getFormattedValue().equals(valueStr)) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating " + globalExpressionCtx1.getExpression() + ", got " + getData().getFormattedValue()
- + " instead of " + valueStr, null));
- }
- }
- });
-
- wait.increment();
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(globalExpressionCtx1, IFormattedValues.HEX_FORMAT),
- new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (getData().getFormattedValue().equals(valueStr)) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating " + globalExpressionCtx1.getExpression() + ", got "
+ + getData().getFormattedValue() + " instead of " + valueStr,
+ null));
+ }
+ }
+ });
+
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(globalExpressionCtx1, IFormattedValues.HEX_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
final String valueStr = "0x1";
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (getData().getFormattedValue().equals(valueStr)) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating " + globalExpressionCtx1.getExpression() + ", got " + getData().getFormattedValue()
- + " instead of " + valueStr, null));
- }
- }
-
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
- wait.waitReset();
- }
-
- /**
- * This test verifies some of the logic of dealing with out-of-scope variables.
- * This particular scenario is that we create a parent with a child and then
- * have them go out of scope. Then we request the child which will update the parent
- * and mark it as out-of-scope and recreate the child. The parent is not re-created.
- * We then ask twice for the parent which is already known to be out-of-scope and we need
- * to make sure that the parent is re-created once and only once.
- * We had a bug where we would enter an infinite loop in this case.
- */
- @Test
- public void testConcurrentUpdateOutOfScopeChildThenParent() throws Throwable {
- SyncUtil.runToLocation("testConcurrentUpdateOutOfScopeChildThenParent");
- MIStoppedEvent stoppedEvent = SyncUtil.step(2, StepType.STEP_INTO);
-
- final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
-
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (getData().getFormattedValue().equals(valueStr)) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating " + globalExpressionCtx1.getExpression() + ", got "
+ + getData().getFormattedValue() + " instead of " + valueStr,
+ null));
+ }
+ }
+
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+ wait.waitReset();
+ }
+
+ /**
+ * This test verifies some of the logic of dealing with out-of-scope variables.
+ * This particular scenario is that we create a parent with a child and then
+ * have them go out of scope. Then we request the child which will update the parent
+ * and mark it as out-of-scope and recreate the child. The parent is not re-created.
+ * We then ask twice for the parent which is already known to be out-of-scope and we need
+ * to make sure that the parent is re-created once and only once.
+ * We had a bug where we would enter an infinite loop in this case.
+ */
+ @Test
+ public void testConcurrentUpdateOutOfScopeChildThenParent() throws Throwable {
+ SyncUtil.runToLocation("testConcurrentUpdateOutOfScopeChildThenParent");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(2, StepType.STEP_INTO);
+
+ final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
+
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- // First create the var object and its child
- globalExpressionCtx1 = fExpService.createExpression(frameDmc, "z");
-
- wait.increment();
- fExpService.getSubExpressions(
- globalExpressionCtx1,
- new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (getData().length != 1) {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed getting children; expecting 1 got " + getData().length, null));
- } else {
+ // First create the var object and its child
+ globalExpressionCtx1 = fExpService.createExpression(frameDmc, "z");
+
+ wait.increment();
+ fExpService.getSubExpressions(globalExpressionCtx1,
+ new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (getData().length != 1) {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed getting children; expecting 1 got " + getData().length, null));
+ } else {
// now get the value of the child
- final String valueStr = "1";
- globalExpressionCtx2 = getData()[0];
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(globalExpressionCtx2, IFormattedValues.NATURAL_FORMAT),
- new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (getData().getFormattedValue().equals(valueStr)) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating " + globalExpressionCtx2.getExpression() + ", got " + getData().getFormattedValue()
- + " instead of " + valueStr, null));
- }
- }
- });
- }
- }
- });
- }
- });
-
- wait.waitUntilDone(TestsPlugin.massageTimeout(5000));
- assertTrue(wait.getMessage(), wait.isOK());
- wait.waitReset();
-
- SyncUtil.step(StepType.STEP_RETURN);
- stoppedEvent = SyncUtil.step(2, StepType.STEP_INTO);
-
- // Now step to another method to make the previous variable objects out-of-scope
- // then first request the child and then the parent. We want to test this order
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ final String valueStr = "1";
+ globalExpressionCtx2 = getData()[0];
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(globalExpressionCtx2,
+ IFormattedValues.NATURAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(),
+ null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (getData().getFormattedValue().equals(valueStr)) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(new Status(IStatus.ERROR,
+ TestsPlugin.PLUGIN_ID,
+ "Failed evaluating "
+ + globalExpressionCtx2.getExpression()
+ + ", got " + getData().getFormattedValue()
+ + " instead of " + valueStr,
+ null));
+ }
+ }
+ });
+ }
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(TestsPlugin.massageTimeout(5000));
+ assertTrue(wait.getMessage(), wait.isOK());
+ wait.waitReset();
+
+ SyncUtil.step(StepType.STEP_RETURN);
+ stoppedEvent = SyncUtil.step(2, StepType.STEP_INTO);
+
+ // Now step to another method to make the previous variable objects out-of-scope
+ // then first request the child and then the parent. We want to test this order
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- wait.increment();
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(globalExpressionCtx2, IFormattedValues.NATURAL_FORMAT),
- new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(globalExpressionCtx2, IFormattedValues.NATURAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
final String valueStr = "2";
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (getData().getFormattedValue().equals(valueStr)) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating " + globalExpressionCtx2.getExpression() + ", got " + getData().getFormattedValue()
- + " instead of " + valueStr, null));
- }
- }
- });
- }
- });
-
- wait.waitUntilDone(TestsPlugin.massageTimeout(5000));
- assertTrue(wait.getMessage(), wait.isOK());
- wait.waitReset();
-
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (getData().getFormattedValue().equals(valueStr)) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating " + globalExpressionCtx2.getExpression() + ", got "
+ + getData().getFormattedValue() + " instead of " + valueStr,
+ null));
+ }
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(TestsPlugin.massageTimeout(5000));
+ assertTrue(wait.getMessage(), wait.isOK());
+ wait.waitReset();
+
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- wait.increment();
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(globalExpressionCtx1, IFormattedValues.NATURAL_FORMAT),
- new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(globalExpressionCtx1, IFormattedValues.NATURAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
final String valueStr = "{...}";
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (getData().getFormattedValue().equals(valueStr)) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating " + globalExpressionCtx1.getExpression() + ", got " + getData().getFormattedValue()
- + " instead of " + valueStr, null));
- }
- }
- });
-
- // Ask a second time but in a different format, to avoid the cache
- wait.increment();
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(globalExpressionCtx1, IFormattedValues.DECIMAL_FORMAT),
- new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (getData().getFormattedValue().equals(valueStr)) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating " + globalExpressionCtx1.getExpression() + ", got "
+ + getData().getFormattedValue() + " instead of " + valueStr,
+ null));
+ }
+ }
+ });
+
+ // Ask a second time but in a different format, to avoid the cache
+ wait.increment();
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(globalExpressionCtx1, IFormattedValues.DECIMAL_FORMAT),
+ new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
final String valueStr = "{...}";
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (getData().getFormattedValue().equals(valueStr)) {
- wait.waitFinished();
- } else {
- wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed evaluating " + globalExpressionCtx1.getExpression() + ", got " + getData().getFormattedValue()
- + " instead of " + valueStr, null));
- }
- }
- });
-
- }
- });
-
- wait.waitUntilDone(TestsPlugin.massageTimeout(5000));
- assertTrue(wait.getMessage(), wait.isOK());
- wait.waitReset();
-
- //TODO although this test passes, the variable z is created twice, without being
- // deleted in GDB. We should fix this
- }
-
- /**
- * This test verifies that we properly update a pointer and its child since they can both
- * change and be reported by var-update
- */
- @Test
- public void testUpdateOfPointer() throws Throwable {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (getData().getFormattedValue().equals(valueStr)) {
+ wait.waitFinished();
+ } else {
+ wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Failed evaluating " + globalExpressionCtx1.getExpression() + ", got "
+ + getData().getFormattedValue() + " instead of " + valueStr,
+ null));
+ }
+ }
+ });
+
+ }
+ });
+
+ wait.waitUntilDone(TestsPlugin.massageTimeout(5000));
+ assertTrue(wait.getMessage(), wait.isOK());
+ wait.waitReset();
+
+ //TODO although this test passes, the variable z is created twice, without being
+ // deleted in GDB. We should fix this
+ }
+
+ /**
+ * This test verifies that we properly update a pointer and its child since they can both
+ * change and be reported by var-update
+ */
+ @Test
+ public void testUpdateOfPointer() throws Throwable {
/* Places we're going to run to. */
String tag1 = String.format("%s:%d", SOURCE_NAME, getLineForTag("testUpdateOfPointer_1"));
String tag2 = String.format("%s:%d", SOURCE_NAME, getLineForTag("testUpdateOfPointer_2"));
@@ -2638,16 +2733,16 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
/* Get the value pointed by the pointer field. */
pointeeActualValue = SyncUtil.getExpressionValue(pointeeDmc, IFormattedValues.NATURAL_FORMAT);
assertThat(pointeeActualValue, is("3"));
- }
+ }
- /**
+ /**
* This test is similar to {@link #testUpdateOfPointer()
* testUpdateOfPointer}, but uses a pointer declared using a typedef. We
* test both a pointer that is a root varobj (a variable) and a pointer that
* is a child varobj (field in a structure).
*/
- @Test
- public void testUpdateOfPointerTypedef() throws Throwable {
+ @Test
+ public void testUpdateOfPointerTypedef() throws Throwable {
/* Places we're going to run to. */
String tag1 = String.format("%s:%d", SOURCE_NAME, getLineForTag("testUpdateOfPointerTypedef_1"));
String tag2 = String.format("%s:%d", SOURCE_NAME, getLineForTag("testUpdateOfPointerTypedef_2"));
@@ -2671,8 +2766,10 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
String pointerFieldValue1 = SyncUtil.getExpressionValue(pointerFieldDmc, IFormattedValues.NATURAL_FORMAT);
/* Verify the pointed values. */
- String pointerVarTargetValue = SyncUtil.getExpressionValue(pointerVarTargetDmc, IFormattedValues.NATURAL_FORMAT);
- String pointerFieldTargetValue = SyncUtil.getExpressionValue(pointerFieldTargetDmc, IFormattedValues.NATURAL_FORMAT);
+ String pointerVarTargetValue = SyncUtil.getExpressionValue(pointerVarTargetDmc,
+ IFormattedValues.NATURAL_FORMAT);
+ String pointerFieldTargetValue = SyncUtil.getExpressionValue(pointerFieldTargetDmc,
+ IFormattedValues.NATURAL_FORMAT);
assertThat(pointerVarTargetValue, is("1"));
assertThat(pointerFieldTargetValue, is("2"));
@@ -2690,134 +2787,134 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
pointerFieldTargetValue = SyncUtil.getExpressionValue(pointerFieldTargetDmc, IFormattedValues.NATURAL_FORMAT);
assertThat(pointerVarTargetValue, is("3"));
assertThat(pointerFieldTargetValue, is("4"));
- }
+ }
- /**
- * This test verifies that we properly return if we can write to different expressions
- */
- @Test
- public void testCanWrite() throws Throwable {
- MIStoppedEvent stoppedEvent = SyncUtil.runToLocation("testCanWrite");
- final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+ /**
+ * This test verifies that we properly return if we can write to different expressions
+ */
+ @Test
+ public void testCanWrite() throws Throwable {
+ MIStoppedEvent stoppedEvent = SyncUtil.runToLocation("testCanWrite");
+ final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
- final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
+ final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- final int exprCount = 5;
- final IExpressionDMContext dmcs[] = new IExpressionDMContext[exprCount];
- final boolean expectedValues[] = new boolean[exprCount];
-
- int exprIndex = 0;
- dmcs[exprIndex] = fExpService.createExpression(frameDmc, "a");
- expectedValues[exprIndex] = true;
- exprIndex++;
- dmcs[exprIndex] = fExpService.createExpression(frameDmc, "b");
- expectedValues[exprIndex] = true;
- exprIndex++;
- dmcs[exprIndex] = fExpService.createExpression(frameDmc, "c");
- expectedValues[exprIndex] = false;
- exprIndex++;
- dmcs[exprIndex] = fExpService.createExpression(frameDmc, "d");
- expectedValues[exprIndex] = false;
- exprIndex++;
- dmcs[exprIndex] = fExpService.createExpression(frameDmc, "d[1]");
- expectedValues[exprIndex] = true;
- exprIndex++;
-
- for (int index = 0; index < exprCount; index++) {
- final int finalIndex = index;
- wait.increment();
- fExpService.canWriteExpression(
- dmcs[finalIndex],
- new DataRequestMonitor<Boolean>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (getData() == expectedValues[finalIndex]) {
+ final int exprCount = 5;
+ final IExpressionDMContext dmcs[] = new IExpressionDMContext[exprCount];
+ final boolean expectedValues[] = new boolean[exprCount];
+
+ int exprIndex = 0;
+ dmcs[exprIndex] = fExpService.createExpression(frameDmc, "a");
+ expectedValues[exprIndex] = true;
+ exprIndex++;
+ dmcs[exprIndex] = fExpService.createExpression(frameDmc, "b");
+ expectedValues[exprIndex] = true;
+ exprIndex++;
+ dmcs[exprIndex] = fExpService.createExpression(frameDmc, "c");
+ expectedValues[exprIndex] = false;
+ exprIndex++;
+ dmcs[exprIndex] = fExpService.createExpression(frameDmc, "d");
+ expectedValues[exprIndex] = false;
+ exprIndex++;
+ dmcs[exprIndex] = fExpService.createExpression(frameDmc, "d[1]");
+ expectedValues[exprIndex] = true;
+ exprIndex++;
+
+ for (int index = 0; index < exprCount; index++) {
+ final int finalIndex = index;
+ wait.increment();
+ fExpService.canWriteExpression(dmcs[finalIndex],
+ new DataRequestMonitor<Boolean>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (getData() == expectedValues[finalIndex]) {
wait.waitFinished();
} else {
wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed establishing proper canWrite for " + dmcs[finalIndex].getExpression() +
- ", got " + getData() + " instead of " + expectedValues[finalIndex], null));
+ "Failed establishing proper canWrite for "
+ + dmcs[finalIndex].getExpression() + ", got " + getData()
+ + " instead of " + expectedValues[finalIndex],
+ null));
}
+ }
+ });
+ }
+ }
+ });
- }
- });
- }
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
- wait.waitReset();
- }
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+ wait.waitReset();
+ }
- /**
- * This test verifies that we properly return if we can write to an expression
- * that is an L-Value or a Constant
- */
- @Test
- public void testCanWriteLValue() throws Throwable {
- assumeGdbVersionAtLeast(ITestConstants.SUFFIX_GDB_6_8);
- MIStoppedEvent stoppedEvent = SyncUtil.runToLocation("testCanWrite"); // Re-use test
- final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+ /**
+ * This test verifies that we properly return if we can write to an expression
+ * that is an L-Value or a Constant
+ */
+ @Test
+ public void testCanWriteLValue() throws Throwable {
+ assumeGdbVersionAtLeast(ITestConstants.SUFFIX_GDB_6_8);
+ MIStoppedEvent stoppedEvent = SyncUtil.runToLocation("testCanWrite"); // Re-use test
+ final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
- final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
+ final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- final int exprCount = 2;
- final IExpressionDMContext dmcs[] = new IExpressionDMContext[exprCount];
- final boolean expectedValues[] = new boolean[exprCount];
-
- int exprIndex = 0;
- dmcs[exprIndex] = fExpService.createExpression(frameDmc, "&a");
- expectedValues[exprIndex] = false;
- exprIndex++;
- dmcs[exprIndex] = fExpService.createExpression(frameDmc, "1");
- expectedValues[exprIndex] = false;
- exprIndex++;
-
- for (int index = 0; index < exprCount; index++) {
- final int finalIndex = index;
- wait.increment();
- fExpService.canWriteExpression(
- dmcs[finalIndex],
- new DataRequestMonitor<Boolean>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else if (getData() == expectedValues[finalIndex]) {
+ final int exprCount = 2;
+ final IExpressionDMContext dmcs[] = new IExpressionDMContext[exprCount];
+ final boolean expectedValues[] = new boolean[exprCount];
+
+ int exprIndex = 0;
+ dmcs[exprIndex] = fExpService.createExpression(frameDmc, "&a");
+ expectedValues[exprIndex] = false;
+ exprIndex++;
+ dmcs[exprIndex] = fExpService.createExpression(frameDmc, "1");
+ expectedValues[exprIndex] = false;
+ exprIndex++;
+
+ for (int index = 0; index < exprCount; index++) {
+ final int finalIndex = index;
+ wait.increment();
+ fExpService.canWriteExpression(dmcs[finalIndex],
+ new DataRequestMonitor<Boolean>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else if (getData() == expectedValues[finalIndex]) {
wait.waitFinished();
} else {
wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Failed establishing proper canWrite for " + dmcs[finalIndex].getExpression() +
- ", got " + getData() + " instead of " + expectedValues[finalIndex], null));
+ "Failed establishing proper canWrite for "
+ + dmcs[finalIndex].getExpression() + ", got " + getData()
+ + " instead of " + expectedValues[finalIndex],
+ null));
}
+ }
+ });
+ }
+ }
+ });
- }
- });
- }
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
- wait.waitReset();
- }
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+ wait.waitReset();
+ }
/**
* Executes a group of sub-tests.
- *
+ *
* @param tests
* A Map in which the key is an expression to evaluate and the
* value is an array of expected values, one for each of the
@@ -2835,1010 +2932,1019 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
* if, e.g., the gdb expression resolves to "1.23456789", but the
* caller only supplied "1.2345".
*/
- private void executeExpressionSubTests(final Map<String, String[]> tests, final boolean exact, IDMContext dmc)
- throws Throwable
- {
-
- // Now evaluate each of the above expressions and compare the actual
- // value against
- // the expected value.
- for (final String expressionToEvaluate : tests.keySet()) {
-
- // Get an IExpressionDMContext object representing the expression to
- // be evaluated.
- final IExpressionDMContext exprDMC = SyncUtil.createExpression(dmc, expressionToEvaluate);
-
- final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
-
- // Get the list of available format IDs for this expression and for
- // each one,
- // get the value of the expression
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ private void executeExpressionSubTests(final Map<String, String[]> tests, final boolean exact, IDMContext dmc)
+ throws Throwable {
+
+ // Now evaluate each of the above expressions and compare the actual
+ // value against
+ // the expected value.
+ for (final String expressionToEvaluate : tests.keySet()) {
+
+ // Get an IExpressionDMContext object representing the expression to
+ // be evaluated.
+ final IExpressionDMContext exprDMC = SyncUtil.createExpression(dmc, expressionToEvaluate);
+
+ final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
+
+ // Get the list of available format IDs for this expression and for
+ // each one,
+ // get the value of the expression
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- fExpService.getAvailableFormats(exprDMC, new DataRequestMonitor<String[]>(
- fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
- final String[] formatIds = getData();
-
- // Now run the current sub-test using each of
- // the formats available for the type of
- // the expression in the sub-test.
-
- for (final String formatId : formatIds) {
- // Get a FormattedValueCMContext object for
- // the expression-formatID pair.
- final FormattedValueDMContext valueDmc = fExpService.getFormattedValueContext(
- exprDMC, formatId);
-
- // Increment the number of completed
- // requests to wait for, since we will send
- // multiple concurrent requests
- wait.increment();
-
- // Evaluate the expression represented by
- // the FormattedValueDMContext object
- // This actually evaluates the expression.
- fExpService.getFormattedExpressionValue(valueDmc,
- new DataRequestMonitor<FormattedValueDMData>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (!isSuccess()) {
- wait.waitFinished(getStatus());
- } else {
-
- // Get the
- // FormattedValueDMData
- // object from the waiter.
- FormattedValueDMData exprValueDMData = getData();
-
- final String[] expectedValues = tests.get(expressionToEvaluate);
-
- // Check the value of the expression for correctness.
- String actualValue = exprValueDMData.getFormattedValue();
- String expectedValue;
-
- if (formatId.equals(IFormattedValues.HEX_FORMAT))
- expectedValue = expectedValues[0];
- else if (formatId.equals(IFormattedValues.OCTAL_FORMAT))
- expectedValue = expectedValues[1];
- else if (formatId.equals(IFormattedValues.BINARY_FORMAT))
- expectedValue = expectedValues[2];
- else if (formatId.equals(IFormattedValues.DECIMAL_FORMAT))
- expectedValue = expectedValues[3];
- else if (formatId.equals(IFormattedValues.NATURAL_FORMAT))
- expectedValue = expectedValues[4];
- else if (formatId.equals(MIExpressions.DETAILS_FORMAT))
- expectedValue = expectedValues[5];
- else
- expectedValue = "[Unrecognized format ID: " + formatId + "]";
-
- if ((exact == false) &&
- (formatId.equals(IFormattedValues.NATURAL_FORMAT) || formatId.equals(MIExpressions.DETAILS_FORMAT)) &&
- (expectedValue.length() < actualValue.length())) {
- actualValue = actualValue.substring(0, expectedValue.length());
- }
-
- if (actualValue.equalsIgnoreCase(expectedValue)) {
- wait.waitFinished();
- } else {
- String errorMsg = "Failed to correctly evalutate '"
- + expressionToEvaluate + "': expected '" + expectedValue
- + "', got '" + actualValue + "'";
- wait.waitFinished(new Status(IStatus.ERROR,
- TestsPlugin.PLUGIN_ID, errorMsg, null));
- }
- }
- }
- });
- }
- }
- }
- });
- }
- });
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
- assertTrue("ExprChangedEvent problem: expected 0, received " + getExprChangedCount(),
- getExprChangedCount() == 0);
- }
- }
-
- private void executeExpressionSubTests(final Map<String, String[]> tests, IDMContext dmc) throws Throwable {
- executeExpressionSubTests(tests, true, dmc);
- }
-
- private boolean addressesEqual(IExpressionDMAddress addrToTest, String addrStr, int size) {
- IAddress addr;
- if (addrStr.length() <= 10) {
- addr = new Addr32(addrStr);
- } else {
- addr = new Addr64(addrStr);
- }
- return addrToTest.getAddress().equals(addr) && addrToTest.getSize() == size;
- }
-
- private void checkAddressData(final IExpressionDMContext dmc, String actualAddrStr, int actualAddrSize) throws Throwable {
-
- final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
-
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ fExpService.getAvailableFormats(exprDMC,
+ new DataRequestMonitor<String[]>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+ final String[] formatIds = getData();
+
+ // Now run the current sub-test using each of
+ // the formats available for the type of
+ // the expression in the sub-test.
+
+ for (final String formatId : formatIds) {
+ // Get a FormattedValueCMContext object for
+ // the expression-formatID pair.
+ final FormattedValueDMContext valueDmc = fExpService
+ .getFormattedValueContext(exprDMC, formatId);
+
+ // Increment the number of completed
+ // requests to wait for, since we will send
+ // multiple concurrent requests
+ wait.increment();
+
+ // Evaluate the expression represented by
+ // the FormattedValueDMContext object
+ // This actually evaluates the expression.
+ fExpService.getFormattedExpressionValue(valueDmc,
+ new DataRequestMonitor<FormattedValueDMData>(
+ fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (!isSuccess()) {
+ wait.waitFinished(getStatus());
+ } else {
+
+ // Get the
+ // FormattedValueDMData
+ // object from the waiter.
+ FormattedValueDMData exprValueDMData = getData();
+
+ final String[] expectedValues = tests
+ .get(expressionToEvaluate);
+
+ // Check the value of the expression for correctness.
+ String actualValue = exprValueDMData
+ .getFormattedValue();
+ String expectedValue;
+
+ if (formatId.equals(IFormattedValues.HEX_FORMAT))
+ expectedValue = expectedValues[0];
+ else if (formatId.equals(IFormattedValues.OCTAL_FORMAT))
+ expectedValue = expectedValues[1];
+ else if (formatId
+ .equals(IFormattedValues.BINARY_FORMAT))
+ expectedValue = expectedValues[2];
+ else if (formatId
+ .equals(IFormattedValues.DECIMAL_FORMAT))
+ expectedValue = expectedValues[3];
+ else if (formatId
+ .equals(IFormattedValues.NATURAL_FORMAT))
+ expectedValue = expectedValues[4];
+ else if (formatId.equals(MIExpressions.DETAILS_FORMAT))
+ expectedValue = expectedValues[5];
+ else
+ expectedValue = "[Unrecognized format ID: "
+ + formatId + "]";
+
+ if ((exact == false)
+ && (formatId
+ .equals(IFormattedValues.NATURAL_FORMAT)
+ || formatId.equals(
+ MIExpressions.DETAILS_FORMAT))
+ && (expectedValue.length() < actualValue
+ .length())) {
+ actualValue = actualValue.substring(0,
+ expectedValue.length());
+ }
+
+ if (actualValue.equalsIgnoreCase(expectedValue)) {
+ wait.waitFinished();
+ } else {
+ String errorMsg = "Failed to correctly evalutate '"
+ + expressionToEvaluate + "': expected '"
+ + expectedValue + "', got '" + actualValue
+ + "'";
+ wait.waitFinished(new Status(IStatus.ERROR,
+ TestsPlugin.PLUGIN_ID, errorMsg, null));
+ }
+ }
+ }
+ });
+ }
+ }
+ }
+ });
+ }
+ });
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+ assertTrue("ExprChangedEvent problem: expected 0, received " + getExprChangedCount(),
+ getExprChangedCount() == 0);
+ }
+ }
+
+ private void executeExpressionSubTests(final Map<String, String[]> tests, IDMContext dmc) throws Throwable {
+ executeExpressionSubTests(tests, true, dmc);
+ }
+
+ private boolean addressesEqual(IExpressionDMAddress addrToTest, String addrStr, int size) {
+ IAddress addr;
+ if (addrStr.length() <= 10) {
+ addr = new Addr32(addrStr);
+ } else {
+ addr = new Addr64(addrStr);
+ }
+ return addrToTest.getAddress().equals(addr) && addrToTest.getSize() == size;
+ }
+
+ private void checkAddressData(final IExpressionDMContext dmc, String actualAddrStr, int actualAddrSize)
+ throws Throwable {
+
+ final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
+
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- fExpService.getExpressionAddressData(dmc, new DataRequestMonitor<IExpressionDMAddress>(fExpService
- .getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (isSuccess()) {
- wait.setReturnInfo(getData());
- }
-
- wait.waitFinished(getStatus());
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
-
- IExpressionDMAddress addr = (IExpressionDMAddress)wait.getReturnInfo();
-
- assertTrue("Unable to get address", addr != null);
- if (addr != null) {
- assertTrue("Received wrong address of " + addr.toString() + " instead of (" +
- actualAddrStr + ", " + actualAddrSize + ")",
- addressesEqual(addr, actualAddrStr, actualAddrSize));
- }
- }
-
- private void doTestChildren(IExpressionDMContext exprDMC) throws Throwable
- {
- IExpressionDMContext[] children =
- getChildren(exprDMC, new String[] {"bar", "bar2", "a", "b", "c"});
-
- // f.bar
- IExpressionDMContext[] children1 =
- getChildren(children[0], new String[] {"d", "e"});
- // f.bar.d
- getChildren(children1[0], new String[0]);
- // f.bar.e
- IExpressionDMContext[] children2 =
- getChildren(children1[1], new String[] {"e[0]", "e[1]"});
- // f.bar.e[0]
- getChildren(children2[0], new String[0]);
- // f.bar.e[1]
- getChildren(children2[1], new String[0]);
-
- // f.bar2
- children1 = getChildren(children[1], new String[] {"f", "g"});
- // f.bar2.f
- getChildren(children1[0], new String[0]);
- // f.bar2.g
- children2 = getChildren(children1[1], new String[] {"g[0]", "g[1]"});
- // f.bar2.g[0]
- getChildren(children2[0], new String[0]);
- // f.bar2.g[1]
- getChildren(children2[1], new String[0]);
-
- // f.a
- children1 = getChildren(children[2], new String[] {"a[0]", "a[1]"});
- // f.a[0]
- getChildren(children1[0], new String[0]);
- // f.a[1]
- getChildren(children1[1], new String[0]);
-
- // f.b
- children1 = getChildren(children[3], new String[] {"d", "e"});
- // f.b.d
- getChildren(children1[0], new String[0]);
- // f.b.e
- children2 = getChildren(children1[1], new String[] {"e[0]", "e[1]"});
- // f.b.e[0]
- getChildren(children2[0], new String[0]);
- // f.b.e[1]
- getChildren(children2[1], new String[0]);
-
- // f.c
- getChildren(children[4], new String[0]);
-
- assertTrue("ExprChangedEvent problem: expected 0, received " + getExprChangedCount(),
- getExprChangedCount() == 0);
+ fExpService.getExpressionAddressData(dmc,
+ new DataRequestMonitor<IExpressionDMAddress>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (isSuccess()) {
+ wait.setReturnInfo(getData());
+ }
+
+ wait.waitFinished(getStatus());
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+
+ IExpressionDMAddress addr = (IExpressionDMAddress) wait.getReturnInfo();
+
+ assertTrue("Unable to get address", addr != null);
+ if (addr != null) {
+ assertTrue("Received wrong address of " + addr.toString() + " instead of (" + actualAddrStr + ", "
+ + actualAddrSize + ")", addressesEqual(addr, actualAddrStr, actualAddrSize));
+ }
}
- // This method tests IExspressions.getSubExpressions(IExpressionDMC, DRM);
- protected IExpressionDMContext[] getChildren(
- final IExpressionDMContext parentDmc,
- String[] expectedValues) throws Throwable {
+ private void doTestChildren(IExpressionDMContext exprDMC) throws Throwable {
+ IExpressionDMContext[] children = getChildren(exprDMC, new String[] { "bar", "bar2", "a", "b", "c" });
+
+ // f.bar
+ IExpressionDMContext[] children1 = getChildren(children[0], new String[] { "d", "e" });
+ // f.bar.d
+ getChildren(children1[0], new String[0]);
+ // f.bar.e
+ IExpressionDMContext[] children2 = getChildren(children1[1], new String[] { "e[0]", "e[1]" });
+ // f.bar.e[0]
+ getChildren(children2[0], new String[0]);
+ // f.bar.e[1]
+ getChildren(children2[1], new String[0]);
+
+ // f.bar2
+ children1 = getChildren(children[1], new String[] { "f", "g" });
+ // f.bar2.f
+ getChildren(children1[0], new String[0]);
+ // f.bar2.g
+ children2 = getChildren(children1[1], new String[] { "g[0]", "g[1]" });
+ // f.bar2.g[0]
+ getChildren(children2[0], new String[0]);
+ // f.bar2.g[1]
+ getChildren(children2[1], new String[0]);
+
+ // f.a
+ children1 = getChildren(children[2], new String[] { "a[0]", "a[1]" });
+ // f.a[0]
+ getChildren(children1[0], new String[0]);
+ // f.a[1]
+ getChildren(children1[1], new String[0]);
+
+ // f.b
+ children1 = getChildren(children[3], new String[] { "d", "e" });
+ // f.b.d
+ getChildren(children1[0], new String[0]);
+ // f.b.e
+ children2 = getChildren(children1[1], new String[] { "e[0]", "e[1]" });
+ // f.b.e[0]
+ getChildren(children2[0], new String[0]);
+ // f.b.e[1]
+ getChildren(children2[1], new String[0]);
+
+ // f.c
+ getChildren(children[4], new String[0]);
+
+ assertTrue("ExprChangedEvent problem: expected 0, received " + getExprChangedCount(),
+ getExprChangedCount() == 0);
+ }
+
+ // This method tests IExspressions.getSubExpressions(IExpressionDMC, DRM);
+ protected IExpressionDMContext[] getChildren(final IExpressionDMContext parentDmc, String[] expectedValues)
+ throws Throwable {
- final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
+ final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- fExpService.getSubExpressions(parentDmc,
- new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (isSuccess()) {
- wait.setReturnInfo(getData());
- }
- wait.waitFinished(getStatus());
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
-
- IExpressionDMContext[] childDmcs =
- (IExpressionDMContext[]) wait.getReturnInfo();
-
- String[] childExpressions = new String[childDmcs.length];
- MIExpressionDMCAccessor[] childDmcsAccessor = new MIExpressionDMCAccessor[childDmcs.length];
-
- // Convert to a MIExpressionDMCAccessor to be able to call getRelativeExpression
- // Also convert to String[] to be able to use Arrays.toString()
- for (int i = 0; i < childExpressions.length; i++) {
- childDmcsAccessor[i] = new MIExpressionDMCAccessor(childDmcs[i]);
- childExpressions[i] = childDmcsAccessor[i].getRelativeExpression();
- }
- assertTrue("Expected " + Arrays.toString(expectedValues) + " but got " + Arrays.toString(childExpressions),
- expectedValues.length == childExpressions.length);
-
- for (int i = 0; i < childDmcsAccessor.length; i++) {
- assertEquals(expectedValues[i], childDmcsAccessor[i].getRelativeExpression());
- }
-
- return childDmcs;
- }
-
- // This method tests IExpressions.getSubExpressions(IExpressionDMC, int, int, DRM);
- protected IExpressionDMContext[] getChildren(
- final IExpressionDMContext parentDmc,
- final int startIndex,
- final int length,
- String[] expectedValues) throws Throwable {
-
- final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
-
- fExpService.getExecutor().submit(new Runnable() {
- @Override
+ fExpService.getSubExpressions(parentDmc,
+ new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (isSuccess()) {
+ wait.setReturnInfo(getData());
+ }
+ wait.waitFinished(getStatus());
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+
+ IExpressionDMContext[] childDmcs = (IExpressionDMContext[]) wait.getReturnInfo();
+
+ String[] childExpressions = new String[childDmcs.length];
+ MIExpressionDMCAccessor[] childDmcsAccessor = new MIExpressionDMCAccessor[childDmcs.length];
+
+ // Convert to a MIExpressionDMCAccessor to be able to call getRelativeExpression
+ // Also convert to String[] to be able to use Arrays.toString()
+ for (int i = 0; i < childExpressions.length; i++) {
+ childDmcsAccessor[i] = new MIExpressionDMCAccessor(childDmcs[i]);
+ childExpressions[i] = childDmcsAccessor[i].getRelativeExpression();
+ }
+ assertTrue("Expected " + Arrays.toString(expectedValues) + " but got " + Arrays.toString(childExpressions),
+ expectedValues.length == childExpressions.length);
+
+ for (int i = 0; i < childDmcsAccessor.length; i++) {
+ assertEquals(expectedValues[i], childDmcsAccessor[i].getRelativeExpression());
+ }
+
+ return childDmcs;
+ }
+
+ // This method tests IExpressions.getSubExpressions(IExpressionDMC, int, int, DRM);
+ protected IExpressionDMContext[] getChildren(final IExpressionDMContext parentDmc, final int startIndex,
+ final int length, String[] expectedValues) throws Throwable {
+
+ final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
+
+ fExpService.getExecutor().submit(new Runnable() {
+ @Override
public void run() {
- fExpService.getSubExpressions(
- parentDmc,
- startIndex,
- length,
- new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- if (isSuccess()) {
- wait.setReturnInfo(getData());
- }
- wait.waitFinished(getStatus());
- }
- });
- }
- });
-
- wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
- assertTrue(wait.getMessage(), wait.isOK());
-
- IExpressionDMContext[] childDmcs =
- (IExpressionDMContext[]) wait.getReturnInfo();
-
- String[] childExpressions = new String[childDmcs.length];
- MIExpressionDMCAccessor[] childDmcsAccessor = new MIExpressionDMCAccessor[childDmcs.length];
-
- // Convert to a MIExpressionDMCAccessor to be able to call getRelativeExpression
- // Also convert to String[] to be able to use Arrays.toString()
- for (int i = 0; i < childExpressions.length; i++) {
- childDmcsAccessor[i] = new MIExpressionDMCAccessor(childDmcs[i]);
- childExpressions[i] = childDmcsAccessor[i].getRelativeExpression();
- }
- assertTrue("Expected " + Arrays.toString(expectedValues) + " but got " + Arrays.toString(childExpressions),
- expectedValues.length == childExpressions.length);
-
- for (int i = 0; i < childDmcsAccessor.length; i++) {
- assertTrue("Expected: " + expectedValues[i] + " got: " + childDmcsAccessor[i].getRelativeExpression(),
- childDmcsAccessor[i].getRelativeExpression().equals(expectedValues[i]));
- }
-
- return childDmcs;
- }
-
- /**
- * This test verifies that large arrays are properly partitioned and
- * the handling of "small" arrays is not affected.
- */
- @Test
- public void testArrays() throws Throwable {
- MIStoppedEvent stoppedEvent = SyncUtil.runToLocation("testArrays");
-
- IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- // int array_simple[10];
- IExpressionDMContext arraySimpleExprDMC = SyncUtil.createExpression(frameDmc, "array_simple");
-
- assertChildrenCount(arraySimpleExprDMC, 10);
-
- // get all children
- String[] expectedValues = new String[10];
- for (int i = 0; i < expectedValues.length; ++i) {
- expectedValues[i] = String.format("array_simple[%d]", i);
- }
- IExpressionDMContext[] arraySimpleChildren = getChildren(arraySimpleExprDMC, expectedValues);
- for (IExpressionDMContext ctx : arraySimpleChildren)
- getChildren(ctx, new String[0]);
-
- // get some parts of the children array
- getChildren(arraySimpleExprDMC, 3, 2, new String[] { "array_simple[3]", "array_simple[4]" });
- getChildren(arraySimpleExprDMC, 9, 3, new String[] { "array_simple[9]" });
-
- // int array_int[24321];
- IExpressionDMContext arrayIntExprDMC = SyncUtil.createExpression(frameDmc, "array_int");
- assertChildrenCount(arrayIntExprDMC, 3);
-
- // get top level partitions: [0-9999], [10000-19999], [20000-24321]
- IExpressionDMContext[] arrayIntPartitions =
- getChildren(arrayIntExprDMC, new String[] {"*((array_int)+0)@10000", "*((array_int)+10000)@10000", "*((array_int)+20000)@4321"});
- assertTrue(String.format("Invalid number of partition: expected 3 got %d", arrayIntPartitions.length), arrayIntPartitions.length == 3);
-
- // get children of the last partition: [20000-24321]
- expectedValues = new String[44];
- for(int i = 0; i < expectedValues.length - 1; ++i) {
- expectedValues[i] = String.format("*((array_int)+%d)@100", 20000 + i*100);
- }
- expectedValues[expectedValues.length - 1] = "*((array_int)+24300)@21";
- IExpressionDMContext[] arrayIntPartitions1 = getChildren(arrayIntPartitions[2], expectedValues);
- expectedValues = new String[21];
- for(int i = 0; i < expectedValues.length; ++i) {
- expectedValues[i] = String.format("array_int[%d]", 24300 + i);
- }
- getChildren(arrayIntPartitions1[arrayIntPartitions1.length - 1], expectedValues);
-
- // foo array_foo[1200];
- IExpressionDMContext arrayFooExprDMC = SyncUtil.createExpression(frameDmc, "array_foo");
- assertChildrenCount(arrayFooExprDMC, 12);
- expectedValues = new String[12];
- for (int i = 0; i < expectedValues.length; ++i) {
- expectedValues[i] = String.format("*((array_foo)+%d)@%d", i*100, 100);
- }
- IExpressionDMContext[] arrayFooPartitions = getChildren(arrayFooExprDMC, expectedValues);
- for (int i = 0; i < arrayFooPartitions.length; ++i) {
- IExpressionDMContext ctx = arrayFooPartitions[i];
- assertTrue(String.format("Invalid DM context type: expected '%s' got '%s'",
- IIndexedPartitionDMContext.class.getName(), ctx.getClass().getName()),
- ctx instanceof IIndexedPartitionDMContext);
- expectedValues = new String[100];
- for (int j = 0; j < expectedValues.length; ++j) {
- expectedValues[j] = String.format("array_foo[%d]", i*100 + j);
- }
- IExpressionDMContext[] arrayFooChildren = getChildren(ctx, expectedValues);
- // check the children of a couple of children
- getChildren(arrayFooChildren[0], new String[] {"bar", "bar2", "a", "b", "c"});
- getChildren(arrayFooChildren[80], new String[] {"bar", "bar2", "a", "b", "c"});
-
- // get parts of the children array
- expectedValues = new String[] { String.format("array_foo[%d]", i*100 + 3), String.format("array_foo[%d]", i*100 + 4) };
- getChildren(ctx, 3, 2, expectedValues);
- getChildren(ctx, 99, 3, new String[] { String.format("array_foo[%d]", i*100 + 99) });
- }
- }
-
- /**
- * This test verifies that large double arrays are properly partitioned
- */
- @Test
- public void testLargeDoubleArray() throws Throwable {
- MIStoppedEvent stoppedEvent = SyncUtil.runToLocation("testArrays");
-
- IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- // char array_double_large[111][210]
- IExpressionDMContext arrayDoubleLargeExprDMC = SyncUtil.createExpression(frameDmc, "array_double_large");
-
- assertChildrenCount(arrayDoubleLargeExprDMC, 2);
-
- // get top level partitions: [0-99], [100-110]
- IExpressionDMContext[] arrayTopPartitions =
- getChildren(arrayDoubleLargeExprDMC, new String[] {"*((array_double_large)+0)@100", "*((array_double_large)+100)@11"});
- assertTrue(String.format("Invalid number of partition: expected 2 got %d", arrayTopPartitions.length), arrayTopPartitions.length == 2);
-
- // get children child array_double_large[100-110]
- IExpressionDMContext arrayDoubleLargeChildExprDMC = arrayTopPartitions[1];
-
- assertChildrenCount(arrayDoubleLargeChildExprDMC, 11);
-
- String[] expectedValues = new String[11];
- for(int i = 0; i < expectedValues.length; ++i) {
- expectedValues[i] = String.format("array_double_large[%d]", 100 +i);
- }
- IExpressionDMContext[] arrayChild = getChildren(arrayDoubleLargeChildExprDMC, expectedValues);
-
- // get second level partitions: array_double_large[101][0-99], [100-199], [200-209]
- IExpressionDMContext arrayDoubleLargeChildExprDMC2 = arrayChild[1];
-
- assertChildrenCount(arrayDoubleLargeChildExprDMC2, 3);
-
- IExpressionDMContext[] arraySecondLevelPartitions =
- getChildren(arrayDoubleLargeChildExprDMC2, new String[] {"*((array_double_large[101])+0)@100",
- "*((array_double_large[101])+100)@100",
- "*((array_double_large[101])+200)@10"});
- assertTrue(String.format("Invalid number of partition: expected 3 got %d", arraySecondLevelPartitions.length), arraySecondLevelPartitions.length == 3);
-
- // get children of array_double_large[101][0-99]
- IExpressionDMContext arrayDoubleLargeChildExprDMC3 = arraySecondLevelPartitions[0];
-
- assertChildrenCount(arrayDoubleLargeChildExprDMC3, 100);
-
- expectedValues = new String[100];
- for(int i = 0; i < expectedValues.length; ++i) {
- expectedValues[i] = String.format("array_double_large[101][%d]", i);
- }
- IExpressionDMContext[] arrayChild2 = getChildren(arrayDoubleLargeChildExprDMC3, expectedValues);
-
- // No more children for array_double_large[101][*]
- for (IExpressionDMContext ctx : arrayChild2)
- getChildren(ctx, new String[0]);
-
- // get some parts of the children array
- getChildren(arrayDoubleLargeChildExprDMC3, 3, 2, new String[] { "array_double_large[101][3]", "array_double_large[101][4]" });
- getChildren(arrayDoubleLargeChildExprDMC3, 98, 3, new String[] { "array_double_large[101][98]","array_double_large[101][99]" });
- }
-
- /**
- * This test verifies that "small" double arrays is not affected by partitions.
- */
- @Test
- public void testSmallDoubleArray() throws Throwable {
- MIStoppedEvent stoppedEvent = SyncUtil.runToLocation("testArrays");
-
- IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- // int array_double_small[11][21];
- IExpressionDMContext arrayDoubleSmallExprDMC = SyncUtil.createExpression(frameDmc, "array_double_small");
-
- assertChildrenCount(arrayDoubleSmallExprDMC, 11);
-
- // get all children of array_double_small
- String[] expectedValues = new String[11];
- for (int i = 0; i < expectedValues.length; ++i) {
- expectedValues[i] = String.format("array_double_small[%d]", i);
- }
- IExpressionDMContext[] arrayDoubleSmallChildren = getChildren(arrayDoubleSmallExprDMC, expectedValues);
-
- // get all children of array_double_small[3]
- IExpressionDMContext arrayDoubleSmallChildExprDMC = arrayDoubleSmallChildren[3];
-
- assertChildrenCount(arrayDoubleSmallChildExprDMC, 21);
-
- expectedValues = new String[21];
- for (int i = 0; i < expectedValues.length; ++i) {
- expectedValues[i] = arrayDoubleSmallChildExprDMC.getExpression() + "[" + i +"]";
- }
- IExpressionDMContext[] arrayDoubleSmallGrandChildren = getChildren(arrayDoubleSmallChildExprDMC, expectedValues);
-
- // No more children for array_double_small[3][*]
- for (IExpressionDMContext ctx : arrayDoubleSmallGrandChildren)
- getChildren(ctx, new String[0]);
-
- // get some parts of the children array
- getChildren(arrayDoubleSmallChildExprDMC, 3, 2, new String[] { "array_double_small[3][3]", "array_double_small[3][4]" });
- getChildren(arrayDoubleSmallChildExprDMC, 19, 3, new String[] { "array_double_small[3][19]","array_double_small[3][20]" });
- }
-
- /**
- * This test verifies that there is no RTTI support before GDB 7.5.
- */
- @Test
- public void testRTTI() throws Throwable {
- assumeGdbVersionNot(ITestConstants.SUFFIX_GDB_6_7); // crashing
- assumeGdbVersionLowerThen(ITestConstants.SUFFIX_GDB_7_5);
- SyncUtil.runToLocation("testRTTI");
- MIStoppedEvent stoppedEvent = SyncUtil.step(3, StepType.STEP_OVER);
- IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- // The expression we will follow as it changes types: derived.ptr
- IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "derived.ptr");
-
- // Now, the expression should be type VirtualBase
- getExpressionType(exprDmc, "VirtualBase *");
- assertChildrenCount(exprDmc, 2);
- // get all children
- String[] expectedValues = new String[2];
- expectedValues[0] = "a";
- expectedValues[1] = "b";
- getChildren(exprDmc, expectedValues);
-
- // Make the type of our expression change
- SyncUtil.step(1, StepType.STEP_OVER);
- // Now, the expression should be type Derived, but GDB < 7.5 does not tell us
- // so we should still get the base type.
- getExpressionType(exprDmc, "VirtualBase *");
- assertChildrenCount(exprDmc, 2);
- // The children are also the same as before
- getChildren(exprDmc, expectedValues);
-
- // Make the type of our expression change
- SyncUtil.step(1, StepType.STEP_OVER);
- // Now, the expression should be type OtherDerived, but GDB < 7.5 does not tell us
- // so we should still get the base type.
- getExpressionType(exprDmc, "VirtualBase *");
- assertChildrenCount(exprDmc, 2);
- // The children are also the same as before
- getChildren(exprDmc, expectedValues);
+ fExpService.getSubExpressions(parentDmc, startIndex, length,
+ new DataRequestMonitor<IExpressionDMContext[]>(fExpService.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ if (isSuccess()) {
+ wait.setReturnInfo(getData());
+ }
+ wait.waitFinished(getStatus());
+ }
+ });
+ }
+ });
+
+ wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER);
+ assertTrue(wait.getMessage(), wait.isOK());
+
+ IExpressionDMContext[] childDmcs = (IExpressionDMContext[]) wait.getReturnInfo();
+
+ String[] childExpressions = new String[childDmcs.length];
+ MIExpressionDMCAccessor[] childDmcsAccessor = new MIExpressionDMCAccessor[childDmcs.length];
+
+ // Convert to a MIExpressionDMCAccessor to be able to call getRelativeExpression
+ // Also convert to String[] to be able to use Arrays.toString()
+ for (int i = 0; i < childExpressions.length; i++) {
+ childDmcsAccessor[i] = new MIExpressionDMCAccessor(childDmcs[i]);
+ childExpressions[i] = childDmcsAccessor[i].getRelativeExpression();
+ }
+ assertTrue("Expected " + Arrays.toString(expectedValues) + " but got " + Arrays.toString(childExpressions),
+ expectedValues.length == childExpressions.length);
+
+ for (int i = 0; i < childDmcsAccessor.length; i++) {
+ assertTrue("Expected: " + expectedValues[i] + " got: " + childDmcsAccessor[i].getRelativeExpression(),
+ childDmcsAccessor[i].getRelativeExpression().equals(expectedValues[i]));
+ }
+
+ return childDmcs;
+ }
+
+ /**
+ * This test verifies that large arrays are properly partitioned and
+ * the handling of "small" arrays is not affected.
+ */
+ @Test
+ public void testArrays() throws Throwable {
+ MIStoppedEvent stoppedEvent = SyncUtil.runToLocation("testArrays");
+
+ IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ // int array_simple[10];
+ IExpressionDMContext arraySimpleExprDMC = SyncUtil.createExpression(frameDmc, "array_simple");
+
+ assertChildrenCount(arraySimpleExprDMC, 10);
+
+ // get all children
+ String[] expectedValues = new String[10];
+ for (int i = 0; i < expectedValues.length; ++i) {
+ expectedValues[i] = String.format("array_simple[%d]", i);
+ }
+ IExpressionDMContext[] arraySimpleChildren = getChildren(arraySimpleExprDMC, expectedValues);
+ for (IExpressionDMContext ctx : arraySimpleChildren)
+ getChildren(ctx, new String[0]);
+
+ // get some parts of the children array
+ getChildren(arraySimpleExprDMC, 3, 2, new String[] { "array_simple[3]", "array_simple[4]" });
+ getChildren(arraySimpleExprDMC, 9, 3, new String[] { "array_simple[9]" });
+
+ // int array_int[24321];
+ IExpressionDMContext arrayIntExprDMC = SyncUtil.createExpression(frameDmc, "array_int");
+ assertChildrenCount(arrayIntExprDMC, 3);
+
+ // get top level partitions: [0-9999], [10000-19999], [20000-24321]
+ IExpressionDMContext[] arrayIntPartitions = getChildren(arrayIntExprDMC,
+ new String[] { "*((array_int)+0)@10000", "*((array_int)+10000)@10000", "*((array_int)+20000)@4321" });
+ assertTrue(String.format("Invalid number of partition: expected 3 got %d", arrayIntPartitions.length),
+ arrayIntPartitions.length == 3);
+
+ // get children of the last partition: [20000-24321]
+ expectedValues = new String[44];
+ for (int i = 0; i < expectedValues.length - 1; ++i) {
+ expectedValues[i] = String.format("*((array_int)+%d)@100", 20000 + i * 100);
+ }
+ expectedValues[expectedValues.length - 1] = "*((array_int)+24300)@21";
+ IExpressionDMContext[] arrayIntPartitions1 = getChildren(arrayIntPartitions[2], expectedValues);
+ expectedValues = new String[21];
+ for (int i = 0; i < expectedValues.length; ++i) {
+ expectedValues[i] = String.format("array_int[%d]", 24300 + i);
+ }
+ getChildren(arrayIntPartitions1[arrayIntPartitions1.length - 1], expectedValues);
+
+ // foo array_foo[1200];
+ IExpressionDMContext arrayFooExprDMC = SyncUtil.createExpression(frameDmc, "array_foo");
+ assertChildrenCount(arrayFooExprDMC, 12);
+ expectedValues = new String[12];
+ for (int i = 0; i < expectedValues.length; ++i) {
+ expectedValues[i] = String.format("*((array_foo)+%d)@%d", i * 100, 100);
+ }
+ IExpressionDMContext[] arrayFooPartitions = getChildren(arrayFooExprDMC, expectedValues);
+ for (int i = 0; i < arrayFooPartitions.length; ++i) {
+ IExpressionDMContext ctx = arrayFooPartitions[i];
+ assertTrue(
+ String.format("Invalid DM context type: expected '%s' got '%s'",
+ IIndexedPartitionDMContext.class.getName(), ctx.getClass().getName()),
+ ctx instanceof IIndexedPartitionDMContext);
+ expectedValues = new String[100];
+ for (int j = 0; j < expectedValues.length; ++j) {
+ expectedValues[j] = String.format("array_foo[%d]", i * 100 + j);
+ }
+ IExpressionDMContext[] arrayFooChildren = getChildren(ctx, expectedValues);
+ // check the children of a couple of children
+ getChildren(arrayFooChildren[0], new String[] { "bar", "bar2", "a", "b", "c" });
+ getChildren(arrayFooChildren[80], new String[] { "bar", "bar2", "a", "b", "c" });
+
+ // get parts of the children array
+ expectedValues = new String[] { String.format("array_foo[%d]", i * 100 + 3),
+ String.format("array_foo[%d]", i * 100 + 4) };
+ getChildren(ctx, 3, 2, expectedValues);
+ getChildren(ctx, 99, 3, new String[] { String.format("array_foo[%d]", i * 100 + 99) });
+ }
+ }
+
+ /**
+ * This test verifies that large double arrays are properly partitioned
+ */
+ @Test
+ public void testLargeDoubleArray() throws Throwable {
+ MIStoppedEvent stoppedEvent = SyncUtil.runToLocation("testArrays");
+
+ IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ // char array_double_large[111][210]
+ IExpressionDMContext arrayDoubleLargeExprDMC = SyncUtil.createExpression(frameDmc, "array_double_large");
+
+ assertChildrenCount(arrayDoubleLargeExprDMC, 2);
+
+ // get top level partitions: [0-99], [100-110]
+ IExpressionDMContext[] arrayTopPartitions = getChildren(arrayDoubleLargeExprDMC,
+ new String[] { "*((array_double_large)+0)@100", "*((array_double_large)+100)@11" });
+ assertTrue(String.format("Invalid number of partition: expected 2 got %d", arrayTopPartitions.length),
+ arrayTopPartitions.length == 2);
+
+ // get children child array_double_large[100-110]
+ IExpressionDMContext arrayDoubleLargeChildExprDMC = arrayTopPartitions[1];
+
+ assertChildrenCount(arrayDoubleLargeChildExprDMC, 11);
+
+ String[] expectedValues = new String[11];
+ for (int i = 0; i < expectedValues.length; ++i) {
+ expectedValues[i] = String.format("array_double_large[%d]", 100 + i);
+ }
+ IExpressionDMContext[] arrayChild = getChildren(arrayDoubleLargeChildExprDMC, expectedValues);
+
+ // get second level partitions: array_double_large[101][0-99], [100-199], [200-209]
+ IExpressionDMContext arrayDoubleLargeChildExprDMC2 = arrayChild[1];
+
+ assertChildrenCount(arrayDoubleLargeChildExprDMC2, 3);
+
+ IExpressionDMContext[] arraySecondLevelPartitions = getChildren(arrayDoubleLargeChildExprDMC2,
+ new String[] { "*((array_double_large[101])+0)@100", "*((array_double_large[101])+100)@100",
+ "*((array_double_large[101])+200)@10" });
+ assertTrue(String.format("Invalid number of partition: expected 3 got %d", arraySecondLevelPartitions.length),
+ arraySecondLevelPartitions.length == 3);
+
+ // get children of array_double_large[101][0-99]
+ IExpressionDMContext arrayDoubleLargeChildExprDMC3 = arraySecondLevelPartitions[0];
+
+ assertChildrenCount(arrayDoubleLargeChildExprDMC3, 100);
+
+ expectedValues = new String[100];
+ for (int i = 0; i < expectedValues.length; ++i) {
+ expectedValues[i] = String.format("array_double_large[101][%d]", i);
+ }
+ IExpressionDMContext[] arrayChild2 = getChildren(arrayDoubleLargeChildExprDMC3, expectedValues);
+
+ // No more children for array_double_large[101][*]
+ for (IExpressionDMContext ctx : arrayChild2)
+ getChildren(ctx, new String[0]);
+
+ // get some parts of the children array
+ getChildren(arrayDoubleLargeChildExprDMC3, 3, 2,
+ new String[] { "array_double_large[101][3]", "array_double_large[101][4]" });
+ getChildren(arrayDoubleLargeChildExprDMC3, 98, 3,
+ new String[] { "array_double_large[101][98]", "array_double_large[101][99]" });
+ }
+
+ /**
+ * This test verifies that "small" double arrays is not affected by partitions.
+ */
+ @Test
+ public void testSmallDoubleArray() throws Throwable {
+ MIStoppedEvent stoppedEvent = SyncUtil.runToLocation("testArrays");
+
+ IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ // int array_double_small[11][21];
+ IExpressionDMContext arrayDoubleSmallExprDMC = SyncUtil.createExpression(frameDmc, "array_double_small");
+
+ assertChildrenCount(arrayDoubleSmallExprDMC, 11);
+
+ // get all children of array_double_small
+ String[] expectedValues = new String[11];
+ for (int i = 0; i < expectedValues.length; ++i) {
+ expectedValues[i] = String.format("array_double_small[%d]", i);
+ }
+ IExpressionDMContext[] arrayDoubleSmallChildren = getChildren(arrayDoubleSmallExprDMC, expectedValues);
+
+ // get all children of array_double_small[3]
+ IExpressionDMContext arrayDoubleSmallChildExprDMC = arrayDoubleSmallChildren[3];
+
+ assertChildrenCount(arrayDoubleSmallChildExprDMC, 21);
+
+ expectedValues = new String[21];
+ for (int i = 0; i < expectedValues.length; ++i) {
+ expectedValues[i] = arrayDoubleSmallChildExprDMC.getExpression() + "[" + i + "]";
+ }
+ IExpressionDMContext[] arrayDoubleSmallGrandChildren = getChildren(arrayDoubleSmallChildExprDMC,
+ expectedValues);
+
+ // No more children for array_double_small[3][*]
+ for (IExpressionDMContext ctx : arrayDoubleSmallGrandChildren)
+ getChildren(ctx, new String[0]);
+
+ // get some parts of the children array
+ getChildren(arrayDoubleSmallChildExprDMC, 3, 2,
+ new String[] { "array_double_small[3][3]", "array_double_small[3][4]" });
+ getChildren(arrayDoubleSmallChildExprDMC, 19, 3,
+ new String[] { "array_double_small[3][19]", "array_double_small[3][20]" });
}
- /**
- * This test verifies that we can cast to a type and then revert.
- */
- @Test
- public void testCastToType() throws Throwable {
- SyncUtil.runToLocation("testCasting");
- MIStoppedEvent stoppedEvent = SyncUtil.step(3, StepType.STEP_OVER);
- IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "int_ptr");
-
- assertTrue("Expression service does not support casting", fExpService instanceof IExpressions2);
-
- ICastedExpressionDMContext castExprDmc =
- ((IExpressions2)fExpService).createCastedExpression(exprDmc, new CastInfo("char*"));
-
- // Check type of original expression and new casted one
- getExpressionType(exprDmc, "int *");
- getExpressionType(castExprDmc, "char *");
-
- assertChildrenCount(castExprDmc, 1);
- // get child and its value
- final IExpressionDMContext[] children = getChildren(exprDmc, new String[] {"*int_ptr"});
-
- Query<String> query = new Query<String>() {
+ /**
+ * This test verifies that there is no RTTI support before GDB 7.5.
+ */
+ @Test
+ public void testRTTI() throws Throwable {
+ assumeGdbVersionNot(ITestConstants.SUFFIX_GDB_6_7); // crashing
+ assumeGdbVersionLowerThen(ITestConstants.SUFFIX_GDB_7_5);
+ SyncUtil.runToLocation("testRTTI");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(3, StepType.STEP_OVER);
+ IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ // The expression we will follow as it changes types: derived.ptr
+ IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "derived.ptr");
+
+ // Now, the expression should be type VirtualBase
+ getExpressionType(exprDmc, "VirtualBase *");
+ assertChildrenCount(exprDmc, 2);
+ // get all children
+ String[] expectedValues = new String[2];
+ expectedValues[0] = "a";
+ expectedValues[1] = "b";
+ getChildren(exprDmc, expectedValues);
+
+ // Make the type of our expression change
+ SyncUtil.step(1, StepType.STEP_OVER);
+ // Now, the expression should be type Derived, but GDB < 7.5 does not tell us
+ // so we should still get the base type.
+ getExpressionType(exprDmc, "VirtualBase *");
+ assertChildrenCount(exprDmc, 2);
+ // The children are also the same as before
+ getChildren(exprDmc, expectedValues);
+
+ // Make the type of our expression change
+ SyncUtil.step(1, StepType.STEP_OVER);
+ // Now, the expression should be type OtherDerived, but GDB < 7.5 does not tell us
+ // so we should still get the base type.
+ getExpressionType(exprDmc, "VirtualBase *");
+ assertChildrenCount(exprDmc, 2);
+ // The children are also the same as before
+ getChildren(exprDmc, expectedValues);
+ }
+
+ /**
+ * This test verifies that we can cast to a type and then revert.
+ */
+ @Test
+ public void testCastToType() throws Throwable {
+ SyncUtil.runToLocation("testCasting");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(3, StepType.STEP_OVER);
+ IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "int_ptr");
+
+ assertTrue("Expression service does not support casting", fExpService instanceof IExpressions2);
+
+ ICastedExpressionDMContext castExprDmc = ((IExpressions2) fExpService).createCastedExpression(exprDmc,
+ new CastInfo("char*"));
+
+ // Check type of original expression and new casted one
+ getExpressionType(exprDmc, "int *");
+ getExpressionType(castExprDmc, "char *");
+
+ assertChildrenCount(castExprDmc, 1);
+ // get child and its value
+ final IExpressionDMContext[] children = getChildren(exprDmc, new String[] { "*int_ptr" });
+
+ Query<String> query = new Query<String>() {
@Override
protected void execute(final DataRequestMonitor<String> rm) {
fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(children[0], IFormattedValues.NATURAL_FORMAT),
+ fExpService.getFormattedValueContext(children[0], IFormattedValues.NATURAL_FORMAT),
new ImmediateDataRequestMonitor<FormattedValueDMData>(rm) {
@Override
protected void handleCompleted() {
rm.done(getData().getFormattedValue());
- }
+ }
});
}
- };
-
- fSession.getExecutor().execute(query);
- String value = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
+ };
+
+ fSession.getExecutor().execute(query);
+ String value = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
assertEquals("65", value);
-
- final IExpressionDMContext[] castChildren = getChildren(castExprDmc, new String[] {"*((char*)(int_ptr))"});
- query = new Query<String>() {
+
+ final IExpressionDMContext[] castChildren = getChildren(castExprDmc, new String[] { "*((char*)(int_ptr))" });
+ query = new Query<String>() {
@Override
protected void execute(final DataRequestMonitor<String> rm) {
fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(castChildren[0], IFormattedValues.NATURAL_FORMAT),
+ fExpService.getFormattedValueContext(castChildren[0], IFormattedValues.NATURAL_FORMAT),
new ImmediateDataRequestMonitor<FormattedValueDMData>(rm) {
@Override
protected void handleCompleted() {
rm.done(getData().getFormattedValue());
- }
+ }
});
}
- };
- fSession.getExecutor().execute(query);
- value = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
+ };
+ fSession.getExecutor().execute(query);
+ value = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
assertEquals("65 'A'", value);
-
+
// Now check that the casted type still remembers what its original type is
assertEquals(castExprDmc.getParents()[0], exprDmc);
- }
-
- /**
- * This test verifies that we can display as array and then revert.
- */
- @Test
- public void testDisplayAsArray() throws Throwable {
- SyncUtil.runToLocation("testCasting");
- MIStoppedEvent stoppedEvent = SyncUtil.step(3, StepType.STEP_OVER);
- IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "int_ptr");
-
- assertTrue("Expression service does not support casting", fExpService instanceof IExpressions2);
-
- // Display as an array of 2 elements, starting at index 1
- ICastedExpressionDMContext castExprDmc =
- ((IExpressions2)fExpService).createCastedExpression(exprDmc, new CastInfo(1,2));
-
- // Check type of original expression and new casted one
- getExpressionType(exprDmc, "int *");
- getExpressionType(castExprDmc, "int [2]");
-
- assertChildrenCount(castExprDmc, 2);
- // get children and their values
- final IExpressionDMContext[] children = getChildren(castExprDmc, new String[] {"int_ptr[1]", "int_ptr[2]"});
- String[] expectedValues = new String[] {"1094861636", "1162233672"};
- for (int i = 0; i<children.length;i++) {
- final IExpressionDMContext child = children[i];
- Query<String> query = new Query<String>() {
- @Override
- protected void execute(final DataRequestMonitor<String> rm) {
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(child, IFormattedValues.NATURAL_FORMAT),
- new ImmediateDataRequestMonitor<FormattedValueDMData>(rm) {
- @Override
- protected void handleCompleted() {
- rm.done(getData().getFormattedValue());
- }
- });
- }
- };
-
- fSession.getExecutor().execute(query);
- String value = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
- assertEquals(expectedValues[i], value);
- }
-
-
+ }
+
+ /**
+ * This test verifies that we can display as array and then revert.
+ */
+ @Test
+ public void testDisplayAsArray() throws Throwable {
+ SyncUtil.runToLocation("testCasting");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(3, StepType.STEP_OVER);
+ IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "int_ptr");
+
+ assertTrue("Expression service does not support casting", fExpService instanceof IExpressions2);
+
+ // Display as an array of 2 elements, starting at index 1
+ ICastedExpressionDMContext castExprDmc = ((IExpressions2) fExpService).createCastedExpression(exprDmc,
+ new CastInfo(1, 2));
+
+ // Check type of original expression and new casted one
+ getExpressionType(exprDmc, "int *");
+ getExpressionType(castExprDmc, "int [2]");
+
+ assertChildrenCount(castExprDmc, 2);
+ // get children and their values
+ final IExpressionDMContext[] children = getChildren(castExprDmc, new String[] { "int_ptr[1]", "int_ptr[2]" });
+ String[] expectedValues = new String[] { "1094861636", "1162233672" };
+ for (int i = 0; i < children.length; i++) {
+ final IExpressionDMContext child = children[i];
+ Query<String> query = new Query<String>() {
+ @Override
+ protected void execute(final DataRequestMonitor<String> rm) {
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(child, IFormattedValues.NATURAL_FORMAT),
+ new ImmediateDataRequestMonitor<FormattedValueDMData>(rm) {
+ @Override
+ protected void handleCompleted() {
+ rm.done(getData().getFormattedValue());
+ }
+ });
+ }
+ };
+
+ fSession.getExecutor().execute(query);
+ String value = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
+ assertEquals(expectedValues[i], value);
+ }
+
// Now check that the casted type still remembers what its original type is
assertEquals(castExprDmc.getParents()[0], exprDmc);
- }
-
- /**
- * This test verifies that we can display as array and cast to a type together
- * and then revert.
- */
- @Test
- public void testDisplayAsArrayAndCastToType() throws Throwable {
- SyncUtil.runToLocation("testCasting");
- MIStoppedEvent stoppedEvent = SyncUtil.step(3, StepType.STEP_OVER);
- IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "int_ptr");
-
- assertTrue("Expression service does not support casting", fExpService instanceof IExpressions2);
-
- // We create the casted type and the displaying as an array in a single request. This is because
- // that is the way the UI does it. Furthermore, the service handles the cast first, then the
- // array, which is why our array of 2 ints becomes 8 chars, and then we only look at 4 of them
- // starting at index 4.
- ICastedExpressionDMContext castExprDmc =
- ((IExpressions2)fExpService).createCastedExpression(exprDmc, new CastInfo("char*", 4,4));
-
- getExpressionType(castExprDmc, "char [4]");
-
- assertChildrenCount(castExprDmc, 4);
- // get children and their values
- // The array index starts at 0 again because the cast to char[] creates a new array
- final IExpressionDMContext[] children =
- getChildren(castExprDmc, new String[] {"int_ptr[4]", "int_ptr[5]", "int_ptr[6]", "int_ptr[7]"});
- String[] expectedValues = new String[] { "68 'D'", "67 'C'", "66 'B'", "65 'A'"};
- for (int i = 0; i<children.length;i++) {
- final IExpressionDMContext child = children[i];
-
- getExpressionType(child, "char");
-
- Query<String> query = new Query<String>() {
- @Override
- protected void execute(final DataRequestMonitor<String> rm) {
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(child, IFormattedValues.NATURAL_FORMAT),
- new ImmediateDataRequestMonitor<FormattedValueDMData>(rm) {
- @Override
- protected void handleCompleted() {
- rm.done(getData().getFormattedValue());
- }
- });
- }
- };
-
- fSession.getExecutor().execute(query);
- String value = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
- assertEquals(expectedValues[i], value);
- }
-
-
+ }
+
+ /**
+ * This test verifies that we can display as array and cast to a type together
+ * and then revert.
+ */
+ @Test
+ public void testDisplayAsArrayAndCastToType() throws Throwable {
+ SyncUtil.runToLocation("testCasting");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(3, StepType.STEP_OVER);
+ IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "int_ptr");
+
+ assertTrue("Expression service does not support casting", fExpService instanceof IExpressions2);
+
+ // We create the casted type and the displaying as an array in a single request. This is because
+ // that is the way the UI does it. Furthermore, the service handles the cast first, then the
+ // array, which is why our array of 2 ints becomes 8 chars, and then we only look at 4 of them
+ // starting at index 4.
+ ICastedExpressionDMContext castExprDmc = ((IExpressions2) fExpService).createCastedExpression(exprDmc,
+ new CastInfo("char*", 4, 4));
+
+ getExpressionType(castExprDmc, "char [4]");
+
+ assertChildrenCount(castExprDmc, 4);
+ // get children and their values
+ // The array index starts at 0 again because the cast to char[] creates a new array
+ final IExpressionDMContext[] children = getChildren(castExprDmc,
+ new String[] { "int_ptr[4]", "int_ptr[5]", "int_ptr[6]", "int_ptr[7]" });
+ String[] expectedValues = new String[] { "68 'D'", "67 'C'", "66 'B'", "65 'A'" };
+ for (int i = 0; i < children.length; i++) {
+ final IExpressionDMContext child = children[i];
+
+ getExpressionType(child, "char");
+
+ Query<String> query = new Query<String>() {
+ @Override
+ protected void execute(final DataRequestMonitor<String> rm) {
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(child, IFormattedValues.NATURAL_FORMAT),
+ new ImmediateDataRequestMonitor<FormattedValueDMData>(rm) {
+ @Override
+ protected void handleCompleted() {
+ rm.done(getData().getFormattedValue());
+ }
+ });
+ }
+ };
+
+ fSession.getExecutor().execute(query);
+ String value = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
+ assertEquals(expectedValues[i], value);
+ }
+
// Now check that the casted type still remembers what its original type is
assertEquals(castExprDmc.getParents()[0], exprDmc);
- }
-
- /**
- * This test verifies that we can cast an array to a different type and then revert.
- */
- @Test
- public void testCastToTypeOfArray() throws Throwable {
- SyncUtil.runToLocation("testCasting");
- MIStoppedEvent stoppedEvent = SyncUtil.step(3, StepType.STEP_OVER);
- IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "array_small");
-
- assertTrue("Expression service does not support casting", fExpService instanceof IExpressions2);
-
- ICastedExpressionDMContext castExprDmc =
- ((IExpressions2)fExpService).createCastedExpression(exprDmc, new CastInfo("char[]"));
-
- getExpressionType(exprDmc, "int [4]");
- getExpressionType(castExprDmc, "char [16]");
-
- assertChildrenCount(castExprDmc, 16);
- // get children and their values
- // The array index starts at 0 again because the cast to char[] creates a new array
- final IExpressionDMContext[] children =
- getChildren(castExprDmc, new String[] {"array_small[0]", "array_small[1]", "array_small[2]", "array_small[3]",
- "array_small[4]", "array_small[5]", "array_small[6]", "array_small[7]",
- "array_small[8]", "array_small[9]", "array_small[10]", "array_small[11]",
- "array_small[12]", "array_small[13]", "array_small[14]", "array_small[15]"});
- // Only check elements 4 through 7 for simplicity
- String[] expectedValues = new String[] { "68 'D'", "67 'C'", "66 'B'", "65 'A'"};
- for (int i = 4; i<8;i++) {
- final IExpressionDMContext child = children[i];
-
- getExpressionType(child, "char");
-
- Query<String> query = new Query<String>() {
- @Override
- protected void execute(final DataRequestMonitor<String> rm) {
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(child, IFormattedValues.NATURAL_FORMAT),
- new ImmediateDataRequestMonitor<FormattedValueDMData>(rm) {
- @Override
- protected void handleCompleted() {
- rm.done(getData().getFormattedValue());
- }
- });
- }
- };
-
- fSession.getExecutor().execute(query);
- String value = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
- assertEquals(expectedValues[i-4], value);
- }
-
-
+ }
+
+ /**
+ * This test verifies that we can cast an array to a different type and then revert.
+ */
+ @Test
+ public void testCastToTypeOfArray() throws Throwable {
+ SyncUtil.runToLocation("testCasting");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(3, StepType.STEP_OVER);
+ IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "array_small");
+
+ assertTrue("Expression service does not support casting", fExpService instanceof IExpressions2);
+
+ ICastedExpressionDMContext castExprDmc = ((IExpressions2) fExpService).createCastedExpression(exprDmc,
+ new CastInfo("char[]"));
+
+ getExpressionType(exprDmc, "int [4]");
+ getExpressionType(castExprDmc, "char [16]");
+
+ assertChildrenCount(castExprDmc, 16);
+ // get children and their values
+ // The array index starts at 0 again because the cast to char[] creates a new array
+ final IExpressionDMContext[] children = getChildren(castExprDmc,
+ new String[] { "array_small[0]", "array_small[1]", "array_small[2]", "array_small[3]", "array_small[4]",
+ "array_small[5]", "array_small[6]", "array_small[7]", "array_small[8]", "array_small[9]",
+ "array_small[10]", "array_small[11]", "array_small[12]", "array_small[13]", "array_small[14]",
+ "array_small[15]" });
+ // Only check elements 4 through 7 for simplicity
+ String[] expectedValues = new String[] { "68 'D'", "67 'C'", "66 'B'", "65 'A'" };
+ for (int i = 4; i < 8; i++) {
+ final IExpressionDMContext child = children[i];
+
+ getExpressionType(child, "char");
+
+ Query<String> query = new Query<String>() {
+ @Override
+ protected void execute(final DataRequestMonitor<String> rm) {
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(child, IFormattedValues.NATURAL_FORMAT),
+ new ImmediateDataRequestMonitor<FormattedValueDMData>(rm) {
+ @Override
+ protected void handleCompleted() {
+ rm.done(getData().getFormattedValue());
+ }
+ });
+ }
+ };
+
+ fSession.getExecutor().execute(query);
+ String value = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
+ assertEquals(expectedValues[i - 4], value);
+ }
+
// Now check that the casted type still remembers what its original type is
assertEquals(castExprDmc.getParents()[0], exprDmc);
- }
-
- /**
- * This test verifies that we can cast to a type and then revert
- * when dealing with an array with partitions.
- */
- @Test
- public void testCastToTypeWithPartition() throws Throwable {
- SyncUtil.runToLocation("testCasting");
- MIStoppedEvent stoppedEvent = SyncUtil.step(3, StepType.STEP_OVER);
- IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "array_large");
-
- assertTrue("Expression service does not support casting", fExpService instanceof IExpressions2);
-
- ICastedExpressionDMContext castExprDmc =
- ((IExpressions2)fExpService).createCastedExpression(exprDmc, new CastInfo("char[]"));
-
- // Check type of original expression and new casted one
- getExpressionType(exprDmc, "int [111]");
- getExpressionType(castExprDmc, "char [444]");
-
- // get the 5 partition children
- assertChildrenCount(castExprDmc, 5);
- IExpressionDMContext[] children = getChildren(castExprDmc, new String[] {"*((((char[])(array_large)))+0)@100", "*((((char[])(array_large)))+100)@100",
- "*((((char[])(array_large)))+200)@100", "*((((char[])(array_large)))+300)@100",
- "*((((char[])(array_large)))+400)@44" });
-
- // Now make sure the children of the partitions have the proper casting
- final String[] expectedChildren = new String[100];
- for (int i=0; i < expectedChildren.length; i++) {
- expectedChildren[i] = String.format("array_large[%d]", i);
- }
- IExpressionDMContext[] castedChildren = getChildren(children[0], expectedChildren);
- assertEquals(100, castedChildren.length);
-
- // Check the type and value of a few of the first children
- final String[] expectedValues = new String[] { "65 'A'", "0 '\\0'", "0 '\\0'", "0 '\\0'", "68 'D'", "67 'C'", "66 'B'", "65 'A'" };
- for (int i = 0; i < expectedValues.length; i++) {
- final IExpressionDMContext child = castedChildren[i];
- getExpressionType(child, "char");
-
- Query<String> query = new Query<String>() {
- @Override
- protected void execute(final DataRequestMonitor<String> rm) {
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(child, IFormattedValues.NATURAL_FORMAT),
- new ImmediateDataRequestMonitor<FormattedValueDMData>(rm) {
- @Override
- protected void handleCompleted() {
- rm.done(getData().getFormattedValue());
- }
- });
- }
- };
-
- fSession.getExecutor().execute(query);
- String value = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
- assertEquals(expectedValues[i], value);
- }
-
+ }
+
+ /**
+ * This test verifies that we can cast to a type and then revert
+ * when dealing with an array with partitions.
+ */
+ @Test
+ public void testCastToTypeWithPartition() throws Throwable {
+ SyncUtil.runToLocation("testCasting");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(3, StepType.STEP_OVER);
+ IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "array_large");
+
+ assertTrue("Expression service does not support casting", fExpService instanceof IExpressions2);
+
+ ICastedExpressionDMContext castExprDmc = ((IExpressions2) fExpService).createCastedExpression(exprDmc,
+ new CastInfo("char[]"));
+
+ // Check type of original expression and new casted one
+ getExpressionType(exprDmc, "int [111]");
+ getExpressionType(castExprDmc, "char [444]");
+
+ // get the 5 partition children
+ assertChildrenCount(castExprDmc, 5);
+ IExpressionDMContext[] children = getChildren(castExprDmc,
+ new String[] { "*((((char[])(array_large)))+0)@100", "*((((char[])(array_large)))+100)@100",
+ "*((((char[])(array_large)))+200)@100", "*((((char[])(array_large)))+300)@100",
+ "*((((char[])(array_large)))+400)@44" });
+
+ // Now make sure the children of the partitions have the proper casting
+ final String[] expectedChildren = new String[100];
+ for (int i = 0; i < expectedChildren.length; i++) {
+ expectedChildren[i] = String.format("array_large[%d]", i);
+ }
+ IExpressionDMContext[] castedChildren = getChildren(children[0], expectedChildren);
+ assertEquals(100, castedChildren.length);
+
+ // Check the type and value of a few of the first children
+ final String[] expectedValues = new String[] { "65 'A'", "0 '\\0'", "0 '\\0'", "0 '\\0'", "68 'D'", "67 'C'",
+ "66 'B'", "65 'A'" };
+ for (int i = 0; i < expectedValues.length; i++) {
+ final IExpressionDMContext child = castedChildren[i];
+ getExpressionType(child, "char");
+
+ Query<String> query = new Query<String>() {
+ @Override
+ protected void execute(final DataRequestMonitor<String> rm) {
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(child, IFormattedValues.NATURAL_FORMAT),
+ new ImmediateDataRequestMonitor<FormattedValueDMData>(rm) {
+ @Override
+ protected void handleCompleted() {
+ rm.done(getData().getFormattedValue());
+ }
+ });
+ }
+ };
+
+ fSession.getExecutor().execute(query);
+ String value = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
+ assertEquals(expectedValues[i], value);
+ }
+
// Now check that the casted type still remembers what its original type is
assertEquals(castExprDmc.getParents()[0], exprDmc);
- }
-
- /**
- * This test verifies that we can display as array and then revert
- * when dealing with an array with partitions.
- */
- @Test
- public void testDisplayAsArrayWithPartition() throws Throwable {
- SyncUtil.runToLocation("testCasting");
- MIStoppedEvent stoppedEvent = SyncUtil.step(3, StepType.STEP_OVER);
- IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- // The expression we will cast from int to char
- IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "array_large");
-
- assertTrue("Expression service does not support casting", fExpService instanceof IExpressions2);
-
- // Display as an array of 101 elements, starting at index 1 (we need at least 101 elements to get partitions)
- ICastedExpressionDMContext castExprDmc =
- ((IExpressions2)fExpService).createCastedExpression(exprDmc, new CastInfo(1, 101));
-
- // Check type of original expression and new casted one
- getExpressionType(exprDmc, "int [111]");
- getExpressionType(castExprDmc, "int [101]");
-
- // Two partitions as children
- assertChildrenCount(castExprDmc, 2);
- IExpressionDMContext[] children = getChildren(castExprDmc, new String[] {"*(((*((array_large)+1)@101))+0)@100", "*(((*((array_large)+1)@101))+100)@1" });
-
- assertTrue("Should have seen the child as a partition", children[0] instanceof IIndexedPartitionDMContext);
- assertEquals("Wrong start index for partition", 0, ((IIndexedPartitionDMContext)children[0]).getIndex());
- assertEquals("Wrong partition length", 100, ((IIndexedPartitionDMContext)children[0]).getLength());
- assertTrue("Should have seen the child as a partition", children[1] instanceof IIndexedPartitionDMContext);
- assertEquals("Wrong start index for partition", 100, ((IIndexedPartitionDMContext)children[1]).getIndex());
- assertEquals("Wrong partition length", 1, ((IIndexedPartitionDMContext)children[1]).getLength());
-
- // Now make sure the children of the partitions have the proper casting and start at the proper index
- final String[] expectedChildren = new String[100];
- for (int i=0; i < expectedChildren.length; i++) {
- expectedChildren[i] = String.format("array_large[%d]", i+1);
- }
- IExpressionDMContext[] castedChildren = getChildren(children[0], expectedChildren);
- assertEquals(100, castedChildren.length);
-
- // Check the type and value of a few of the first children
- final String[] expectedValues = new String[] { "1094861636", "1162233672" };
- for (int i = 0; i < expectedValues.length; i++) {
- final IExpressionDMContext child = castedChildren[i];
- getExpressionType(child, "int");
-
- Query<String> query = new Query<String>() {
- @Override
- protected void execute(final DataRequestMonitor<String> rm) {
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(child, IFormattedValues.NATURAL_FORMAT),
- new ImmediateDataRequestMonitor<FormattedValueDMData>(rm) {
- @Override
- protected void handleCompleted() {
- rm.done(getData().getFormattedValue());
- }
- });
- }
- };
-
- fSession.getExecutor().execute(query);
- String value = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
- assertEquals(expectedValues[i], value);
- }
-
+ }
+
+ /**
+ * This test verifies that we can display as array and then revert
+ * when dealing with an array with partitions.
+ */
+ @Test
+ public void testDisplayAsArrayWithPartition() throws Throwable {
+ SyncUtil.runToLocation("testCasting");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(3, StepType.STEP_OVER);
+ IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ // The expression we will cast from int to char
+ IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "array_large");
+
+ assertTrue("Expression service does not support casting", fExpService instanceof IExpressions2);
+
+ // Display as an array of 101 elements, starting at index 1 (we need at least 101 elements to get partitions)
+ ICastedExpressionDMContext castExprDmc = ((IExpressions2) fExpService).createCastedExpression(exprDmc,
+ new CastInfo(1, 101));
+
+ // Check type of original expression and new casted one
+ getExpressionType(exprDmc, "int [111]");
+ getExpressionType(castExprDmc, "int [101]");
+
+ // Two partitions as children
+ assertChildrenCount(castExprDmc, 2);
+ IExpressionDMContext[] children = getChildren(castExprDmc,
+ new String[] { "*(((*((array_large)+1)@101))+0)@100", "*(((*((array_large)+1)@101))+100)@1" });
+
+ assertTrue("Should have seen the child as a partition", children[0] instanceof IIndexedPartitionDMContext);
+ assertEquals("Wrong start index for partition", 0, ((IIndexedPartitionDMContext) children[0]).getIndex());
+ assertEquals("Wrong partition length", 100, ((IIndexedPartitionDMContext) children[0]).getLength());
+ assertTrue("Should have seen the child as a partition", children[1] instanceof IIndexedPartitionDMContext);
+ assertEquals("Wrong start index for partition", 100, ((IIndexedPartitionDMContext) children[1]).getIndex());
+ assertEquals("Wrong partition length", 1, ((IIndexedPartitionDMContext) children[1]).getLength());
+
+ // Now make sure the children of the partitions have the proper casting and start at the proper index
+ final String[] expectedChildren = new String[100];
+ for (int i = 0; i < expectedChildren.length; i++) {
+ expectedChildren[i] = String.format("array_large[%d]", i + 1);
+ }
+ IExpressionDMContext[] castedChildren = getChildren(children[0], expectedChildren);
+ assertEquals(100, castedChildren.length);
+
+ // Check the type and value of a few of the first children
+ final String[] expectedValues = new String[] { "1094861636", "1162233672" };
+ for (int i = 0; i < expectedValues.length; i++) {
+ final IExpressionDMContext child = castedChildren[i];
+ getExpressionType(child, "int");
+
+ Query<String> query = new Query<String>() {
+ @Override
+ protected void execute(final DataRequestMonitor<String> rm) {
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(child, IFormattedValues.NATURAL_FORMAT),
+ new ImmediateDataRequestMonitor<FormattedValueDMData>(rm) {
+ @Override
+ protected void handleCompleted() {
+ rm.done(getData().getFormattedValue());
+ }
+ });
+ }
+ };
+
+ fSession.getExecutor().execute(query);
+ String value = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
+ assertEquals(expectedValues[i], value);
+ }
+
// Now check that the casted type still remembers what its original type is
assertEquals(castExprDmc.getParents()[0], exprDmc);
- }
-
- /**
- * This test verifies that we can display as array and cast to a type together
- * and then revert when dealing with an array with partitions.
- */
- @Test
- public void testDisplayAsArrayAndCastToTypeWithPartition() throws Throwable {
- SyncUtil.runToLocation("testCasting");
- MIStoppedEvent stoppedEvent = SyncUtil.step(3, StepType.STEP_OVER);
- IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "array_large");
-
- assertTrue("Expression service does not support casting", fExpService instanceof IExpressions2);
-
- ICastedExpressionDMContext castExprDmc =
- ((IExpressions2)fExpService).createCastedExpression(exprDmc, new CastInfo("char[]", 4, 101));
-
- // Check type of original expression and new casted one
- getExpressionType(exprDmc, "int [111]");
- getExpressionType(castExprDmc, "char [101]");
-
- // get the 5 partition children
- assertChildrenCount(castExprDmc, 2);
- IExpressionDMContext[] children = getChildren(castExprDmc, new String[] {"*(((*(((char[])(array_large))+4)@101))+0)@100", "*(((*(((char[])(array_large))+4)@101))+100)@1"});
-
- assertTrue("Should have seen the child as a partition", children[0] instanceof IIndexedPartitionDMContext);
- assertEquals("Wrong start index for partition", 0, ((IIndexedPartitionDMContext)children[0]).getIndex());
- assertEquals("Wrong partition length", 100, ((IIndexedPartitionDMContext)children[0]).getLength());
- assertTrue("Should have seen the child as a partition", children[1] instanceof IIndexedPartitionDMContext);
- assertEquals("Wrong start index for partition", 100, ((IIndexedPartitionDMContext)children[1]).getIndex());
- assertEquals("Wrong partition length", 1, ((IIndexedPartitionDMContext)children[1]).getLength());
-
- // Now make sure the children of the partitions have the proper casting
- final String[] expectedChildren = new String[100];
- for (int i=0; i < expectedChildren.length; i++) {
- expectedChildren[i] = String.format("array_large[%d]", i+4);
- }
- IExpressionDMContext[] castedChildren = getChildren(children[0], expectedChildren);
- assertEquals(100, castedChildren.length);
-
- // Check the type and value of a few of the first children
- final String[] expectedValues = new String[] { "68 'D'", "67 'C'", "66 'B'", "65 'A'" };
- for (int i = 0; i < expectedValues.length; i++) {
- final IExpressionDMContext child = castedChildren[i];
- getExpressionType(child, "char");
-
- Query<String> query = new Query<String>() {
- @Override
- protected void execute(final DataRequestMonitor<String> rm) {
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(child, IFormattedValues.NATURAL_FORMAT),
- new ImmediateDataRequestMonitor<FormattedValueDMData>(rm) {
- @Override
- protected void handleCompleted() {
- rm.done(getData().getFormattedValue());
- }
- });
- }
- };
-
- fSession.getExecutor().execute(query);
- String value = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
- assertEquals(expectedValues[i], value);
- }
-
+ }
+
+ /**
+ * This test verifies that we can display as array and cast to a type together
+ * and then revert when dealing with an array with partitions.
+ */
+ @Test
+ public void testDisplayAsArrayAndCastToTypeWithPartition() throws Throwable {
+ SyncUtil.runToLocation("testCasting");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(3, StepType.STEP_OVER);
+ IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ IExpressionDMContext exprDmc = SyncUtil.createExpression(frameDmc, "array_large");
+
+ assertTrue("Expression service does not support casting", fExpService instanceof IExpressions2);
+
+ ICastedExpressionDMContext castExprDmc = ((IExpressions2) fExpService).createCastedExpression(exprDmc,
+ new CastInfo("char[]", 4, 101));
+
+ // Check type of original expression and new casted one
+ getExpressionType(exprDmc, "int [111]");
+ getExpressionType(castExprDmc, "char [101]");
+
+ // get the 5 partition children
+ assertChildrenCount(castExprDmc, 2);
+ IExpressionDMContext[] children = getChildren(castExprDmc, new String[] {
+ "*(((*(((char[])(array_large))+4)@101))+0)@100", "*(((*(((char[])(array_large))+4)@101))+100)@1" });
+
+ assertTrue("Should have seen the child as a partition", children[0] instanceof IIndexedPartitionDMContext);
+ assertEquals("Wrong start index for partition", 0, ((IIndexedPartitionDMContext) children[0]).getIndex());
+ assertEquals("Wrong partition length", 100, ((IIndexedPartitionDMContext) children[0]).getLength());
+ assertTrue("Should have seen the child as a partition", children[1] instanceof IIndexedPartitionDMContext);
+ assertEquals("Wrong start index for partition", 100, ((IIndexedPartitionDMContext) children[1]).getIndex());
+ assertEquals("Wrong partition length", 1, ((IIndexedPartitionDMContext) children[1]).getLength());
+
+ // Now make sure the children of the partitions have the proper casting
+ final String[] expectedChildren = new String[100];
+ for (int i = 0; i < expectedChildren.length; i++) {
+ expectedChildren[i] = String.format("array_large[%d]", i + 4);
+ }
+ IExpressionDMContext[] castedChildren = getChildren(children[0], expectedChildren);
+ assertEquals(100, castedChildren.length);
+
+ // Check the type and value of a few of the first children
+ final String[] expectedValues = new String[] { "68 'D'", "67 'C'", "66 'B'", "65 'A'" };
+ for (int i = 0; i < expectedValues.length; i++) {
+ final IExpressionDMContext child = castedChildren[i];
+ getExpressionType(child, "char");
+
+ Query<String> query = new Query<String>() {
+ @Override
+ protected void execute(final DataRequestMonitor<String> rm) {
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(child, IFormattedValues.NATURAL_FORMAT),
+ new ImmediateDataRequestMonitor<FormattedValueDMData>(rm) {
+ @Override
+ protected void handleCompleted() {
+ rm.done(getData().getFormattedValue());
+ }
+ });
+ }
+ };
+
+ fSession.getExecutor().execute(query);
+ String value = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
+ assertEquals(expectedValues[i], value);
+ }
+
// Now check that the casted type still remembers what its original type is
- assertEquals(castExprDmc.getParents()[0], exprDmc);
- }
-
- /**
- * This test verifies that we display the simple return value of a method after
- * a step-return operation, but only for the first stack frame.
- */
- @Test
- public void testDisplaySimpleReturnValueForStepReturn() throws Throwable {
- SyncUtil.runToLocation("testSimpleReturn");
- MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_RETURN);
-
- // Check the return value is shown when looking at the first frame
- final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
- IVariableDMData[] result = SyncUtil.getLocals(frameDmc);
-
- assertEquals(3, result.length); // Two variables and one return value
-
- // Return value
- assertEquals("$2", result[0].getName());
- assertEquals("6", result[0].getValue());
- // first variable
- assertEquals("a", result[1].getName());
- assertEquals("10", result[1].getValue());
- // Second variable
- assertEquals("b", result[2].getName());
- assertEquals("false", result[2].getValue());
-
- // Now check how the return value will be displayed to the user
- final IExpressionDMContext returnExprDmc = SyncUtil.createExpression(frameDmc, "$2");
+ assertEquals(castExprDmc.getParents()[0], exprDmc);
+ }
+
+ /**
+ * This test verifies that we display the simple return value of a method after
+ * a step-return operation, but only for the first stack frame.
+ */
+ @Test
+ public void testDisplaySimpleReturnValueForStepReturn() throws Throwable {
+ SyncUtil.runToLocation("testSimpleReturn");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_RETURN);
+
+ // Check the return value is shown when looking at the first frame
+ final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+ IVariableDMData[] result = SyncUtil.getLocals(frameDmc);
+
+ assertEquals(3, result.length); // Two variables and one return value
+
+ // Return value
+ assertEquals("$2", result[0].getName());
+ assertEquals("6", result[0].getValue());
+ // first variable
+ assertEquals("a", result[1].getName());
+ assertEquals("10", result[1].getValue());
+ // Second variable
+ assertEquals("b", result[2].getName());
+ assertEquals("false", result[2].getValue());
+
+ // Now check how the return value will be displayed to the user
+ final IExpressionDMContext returnExprDmc = SyncUtil.createExpression(frameDmc, "$2");
Query<IExpressionDMData> query = new Query<IExpressionDMData>() {
@Override
protected void execute(final DataRequestMonitor<IExpressionDMData> rm) {
@@ -3852,44 +3958,44 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
// Now check the actual value using the expression service
String value = SyncUtil.getExpressionValue(returnExprDmc, IFormattedValues.DECIMAL_FORMAT);
assertEquals("6", value);
-
- // Now make sure we don't show the return value for another frame
+
+ // Now make sure we don't show the return value for another frame
final IFrameDMContext frameDmc2 = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 1);
- result = SyncUtil.getLocals(frameDmc2);
-
- // only one variable
- assertEquals(1, result.length);
- assertEquals("b", result[0].getName());
- }
-
- /**
- * This test verifies that we display the complex return value of a method after
- * a step-return operation, but only for the first stack frame.
- */
- @Test
- public void testDisplayComplexReturnValueForStepReturn() throws Throwable {
- SyncUtil.runToLocation("testComplexReturn");
- MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_RETURN);
-
- // Check the return value is show when looking at the first frame
- final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
- IVariableDMData[] result = SyncUtil.getLocals(frameDmc);
-
- assertEquals(3, result.length); // Two variables and one return value
-
- // Return value
- assertEquals("$2", result[0].getName());
-
- // first variable
- assertEquals("a", result[1].getName());
- assertEquals("10", result[1].getValue());
- // Second variable
- assertEquals("b", result[2].getName());
- assertEquals("false", result[2].getValue());
-
- // Now check how the return value will be displayed to the user
- final IExpressionDMContext returnExprDmc = SyncUtil.createExpression(frameDmc, "$2");
- Query<IExpressionDMData> query = new Query<IExpressionDMData>() {
+ result = SyncUtil.getLocals(frameDmc2);
+
+ // only one variable
+ assertEquals(1, result.length);
+ assertEquals("b", result[0].getName());
+ }
+
+ /**
+ * This test verifies that we display the complex return value of a method after
+ * a step-return operation, but only for the first stack frame.
+ */
+ @Test
+ public void testDisplayComplexReturnValueForStepReturn() throws Throwable {
+ SyncUtil.runToLocation("testComplexReturn");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_RETURN);
+
+ // Check the return value is show when looking at the first frame
+ final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+ IVariableDMData[] result = SyncUtil.getLocals(frameDmc);
+
+ assertEquals(3, result.length); // Two variables and one return value
+
+ // Return value
+ assertEquals("$2", result[0].getName());
+
+ // first variable
+ assertEquals("a", result[1].getName());
+ assertEquals("10", result[1].getValue());
+ // Second variable
+ assertEquals("b", result[2].getName());
+ assertEquals("false", result[2].getValue());
+
+ // Now check how the return value will be displayed to the user
+ final IExpressionDMContext returnExprDmc = SyncUtil.createExpression(frameDmc, "$2");
+ Query<IExpressionDMData> query = new Query<IExpressionDMData>() {
@Override
protected void execute(final DataRequestMonitor<IExpressionDMData> rm) {
fExpService.getExpressionData(returnExprDmc, rm);
@@ -3902,206 +4008,207 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
// Now check the content of the complex return expression
doTestChildren(returnExprDmc);
- // Now make sure we don't show the return value for another frame
+ // Now make sure we don't show the return value for another frame
IFrameDMContext frameDmc2 = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 1);
- result = SyncUtil.getLocals(frameDmc2);
-
- // only one variable
- assertEquals(1, result.length);
- assertEquals("b", result[0].getName());
- }
-
- /**
- * This test verifies that we properly display variables after a step-return operation
- * from a method returning void.
- */
- @Test
- public void testNoReturnValueForEmptyStepReturn() throws Throwable {
- SyncUtil.runToLocation("noReturnValue");
- MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_RETURN);
-
- // Check no return value is shown when looking at the first frame
- final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
- IVariableDMData[] result = SyncUtil.getLocals(frameDmc);
-
- assertEquals(2, result.length); // Two variables and one return value
-
- // first variable
- assertEquals("a", result[0].getName());
- assertEquals("10", result[0].getValue());
- // Second variable
- assertEquals("b", result[1].getName());
- assertEquals("false", result[1].getValue());
- }
-
- /**
- * This tests verifies that we can obtain a child even though
- * is was already created directly.
- */
- @Test
- public void testExistingChild() throws Throwable {
- SyncUtil.runToLocation("testExistingChild");
- MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
- IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- final String PARENT_EXPR = "b";
- final String CHILD_EXPR = "((b).d)";
- final String CHILD__REL_EXPR = "d";
-
- // Fetch the child directly
- final IExpressionDMContext childDmc = SyncUtil.createExpression(frameDmc, CHILD_EXPR);
- Query<String> query = new Query<String>() {
+ result = SyncUtil.getLocals(frameDmc2);
+
+ // only one variable
+ assertEquals(1, result.length);
+ assertEquals("b", result[0].getName());
+ }
+
+ /**
+ * This test verifies that we properly display variables after a step-return operation
+ * from a method returning void.
+ */
+ @Test
+ public void testNoReturnValueForEmptyStepReturn() throws Throwable {
+ SyncUtil.runToLocation("noReturnValue");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_RETURN);
+
+ // Check no return value is shown when looking at the first frame
+ final IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+ IVariableDMData[] result = SyncUtil.getLocals(frameDmc);
+
+ assertEquals(2, result.length); // Two variables and one return value
+
+ // first variable
+ assertEquals("a", result[0].getName());
+ assertEquals("10", result[0].getValue());
+ // Second variable
+ assertEquals("b", result[1].getName());
+ assertEquals("false", result[1].getValue());
+ }
+
+ /**
+ * This tests verifies that we can obtain a child even though
+ * is was already created directly.
+ */
+ @Test
+ public void testExistingChild() throws Throwable {
+ SyncUtil.runToLocation("testExistingChild");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
+ IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ final String PARENT_EXPR = "b";
+ final String CHILD_EXPR = "((b).d)";
+ final String CHILD__REL_EXPR = "d";
+
+ // Fetch the child directly
+ final IExpressionDMContext childDmc = SyncUtil.createExpression(frameDmc, CHILD_EXPR);
+ Query<String> query = new Query<String>() {
@Override
protected void execute(final DataRequestMonitor<String> rm) {
fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(childDmc, IFormattedValues.NATURAL_FORMAT),
+ fExpService.getFormattedValueContext(childDmc, IFormattedValues.NATURAL_FORMAT),
new ImmediateDataRequestMonitor<FormattedValueDMData>(rm) {
@Override
protected void handleSuccess() {
rm.done(getData().getFormattedValue());
- }
+ }
});
}
- };
-
- fSession.getExecutor().execute(query);
- String value = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
+ };
+
+ fSession.getExecutor().execute(query);
+ String value = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
assertEquals("8", value);
- // Now fetch the child through its parent
- final IExpressionDMContext parentDmc = SyncUtil.createExpression(frameDmc, PARENT_EXPR);
- query = new Query<String>() {
+ // Now fetch the child through its parent
+ final IExpressionDMContext parentDmc = SyncUtil.createExpression(frameDmc, PARENT_EXPR);
+ query = new Query<String>() {
@Override
protected void execute(final DataRequestMonitor<String> rm) {
- fExpService.getSubExpressions(
- parentDmc,
- new ImmediateDataRequestMonitor<IExpressionDMContext[]>(rm) {
- @Override
- protected void handleSuccess() {
- if (getData().length != 2) {
- rm.done(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Wrong number for children. Expecting 2 but got " + getData().length, null));
- return;
- }
-
- MIExpressionDMC firstChildContext = (MIExpressionDMC)getData()[0];
- if (firstChildContext.getExpression().equals(CHILD_EXPR) == false) {
- rm.done(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Got wrong first child. Expected " + CHILD_EXPR + " but got " + firstChildContext.getExpression(), null));
- return;
- }
-
- if (firstChildContext.getRelativeExpression().equals(CHILD__REL_EXPR) == false) {
- rm.done(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Got wrong relative expression. Expected " + CHILD__REL_EXPR + " but got " + firstChildContext.getRelativeExpression(), null));
- return;
- }
-
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(firstChildContext, IFormattedValues.NATURAL_FORMAT),
- new ImmediateDataRequestMonitor<FormattedValueDMData>(rm) {
- @Override
- protected void handleSuccess() {
- rm.done(getData().getFormattedValue());
- }
- });
-
- }
- });
+ fExpService.getSubExpressions(parentDmc, new ImmediateDataRequestMonitor<IExpressionDMContext[]>(rm) {
+ @Override
+ protected void handleSuccess() {
+ if (getData().length != 2) {
+ rm.done(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Wrong number for children. Expecting 2 but got " + getData().length, null));
+ return;
+ }
+
+ MIExpressionDMC firstChildContext = (MIExpressionDMC) getData()[0];
+ if (firstChildContext.getExpression().equals(CHILD_EXPR) == false) {
+ rm.done(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID, "Got wrong first child. Expected "
+ + CHILD_EXPR + " but got " + firstChildContext.getExpression(), null));
+ return;
+ }
+
+ if (firstChildContext.getRelativeExpression().equals(CHILD__REL_EXPR) == false) {
+ rm.done(new Status(
+ IStatus.ERROR, TestsPlugin.PLUGIN_ID, "Got wrong relative expression. Expected "
+ + CHILD__REL_EXPR + " but got " + firstChildContext.getRelativeExpression(),
+ null));
+ return;
+ }
+
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(firstChildContext,
+ IFormattedValues.NATURAL_FORMAT),
+ new ImmediateDataRequestMonitor<FormattedValueDMData>(rm) {
+ @Override
+ protected void handleSuccess() {
+ rm.done(getData().getFormattedValue());
+ }
+ });
+
+ }
+ });
}
- };
-
- fSession.getExecutor().execute(query);
- value = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
+ };
+
+ fSession.getExecutor().execute(query);
+ value = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
assertEquals("8", value);
- }
-
- /**
- * This tests verifies that we can manually create a child of an expression
- * after that child was automatically created through the parent.
- * This case happens when selecting a child of an expression and using "Watch"
- * to create an expression automatically.
- */
- @Test
- public void testExplicitChildCreation() throws Throwable {
- SyncUtil.runToLocation("testExistingChild");
- MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
- IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
-
- final String PARENT_EXPR = "b";
- final String CHILD_EXPR = "((b).d)";
- final String CHILD__REL_EXPR = "d";
-
- // First fetch the child through its parent
- final IExpressionDMContext parentDmc = SyncUtil.createExpression(frameDmc, PARENT_EXPR);
- Query<String> query = new Query<String>() {
+ }
+
+ /**
+ * This tests verifies that we can manually create a child of an expression
+ * after that child was automatically created through the parent.
+ * This case happens when selecting a child of an expression and using "Watch"
+ * to create an expression automatically.
+ */
+ @Test
+ public void testExplicitChildCreation() throws Throwable {
+ SyncUtil.runToLocation("testExistingChild");
+ MIStoppedEvent stoppedEvent = SyncUtil.step(1, StepType.STEP_OVER);
+ IFrameDMContext frameDmc = SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0);
+
+ final String PARENT_EXPR = "b";
+ final String CHILD_EXPR = "((b).d)";
+ final String CHILD__REL_EXPR = "d";
+
+ // First fetch the child through its parent
+ final IExpressionDMContext parentDmc = SyncUtil.createExpression(frameDmc, PARENT_EXPR);
+ Query<String> query = new Query<String>() {
@Override
protected void execute(final DataRequestMonitor<String> rm) {
- fExpService.getSubExpressions(
- parentDmc,
- new ImmediateDataRequestMonitor<IExpressionDMContext[]>(rm) {
- @Override
- protected void handleSuccess() {
- if (getData().length != 2) {
- rm.done(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Wrong number for children. Expecting 2 but got " + getData().length, null));
- return;
- }
-
- MIExpressionDMC firstChildContext = (MIExpressionDMC)getData()[0];
- if (firstChildContext.getExpression().equals(CHILD_EXPR) == false) {
- rm.done(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Got wrong first child. Expected " + CHILD_EXPR + " but got " + firstChildContext.getExpression(), null));
- return;
- }
-
- if (firstChildContext.getRelativeExpression().equals(CHILD__REL_EXPR) == false) {
- rm.done(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
- "Got wrong relative expression. Expected " + CHILD__REL_EXPR + " but got " + firstChildContext.getRelativeExpression(), null));
- return;
- }
-
- fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(firstChildContext, IFormattedValues.NATURAL_FORMAT),
- new ImmediateDataRequestMonitor<FormattedValueDMData>(rm) {
- @Override
- protected void handleSuccess() {
- rm.done(getData().getFormattedValue());
- }
- });
-
- }
- });
+ fExpService.getSubExpressions(parentDmc, new ImmediateDataRequestMonitor<IExpressionDMContext[]>(rm) {
+ @Override
+ protected void handleSuccess() {
+ if (getData().length != 2) {
+ rm.done(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
+ "Wrong number for children. Expecting 2 but got " + getData().length, null));
+ return;
+ }
+
+ MIExpressionDMC firstChildContext = (MIExpressionDMC) getData()[0];
+ if (firstChildContext.getExpression().equals(CHILD_EXPR) == false) {
+ rm.done(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID, "Got wrong first child. Expected "
+ + CHILD_EXPR + " but got " + firstChildContext.getExpression(), null));
+ return;
+ }
+
+ if (firstChildContext.getRelativeExpression().equals(CHILD__REL_EXPR) == false) {
+ rm.done(new Status(
+ IStatus.ERROR, TestsPlugin.PLUGIN_ID, "Got wrong relative expression. Expected "
+ + CHILD__REL_EXPR + " but got " + firstChildContext.getRelativeExpression(),
+ null));
+ return;
+ }
+
+ fExpService.getFormattedExpressionValue(
+ fExpService.getFormattedValueContext(firstChildContext,
+ IFormattedValues.NATURAL_FORMAT),
+ new ImmediateDataRequestMonitor<FormattedValueDMData>(rm) {
+ @Override
+ protected void handleSuccess() {
+ rm.done(getData().getFormattedValue());
+ }
+ });
+
+ }
+ });
}
- };
-
- fSession.getExecutor().execute(query);
- String value = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
+ };
+
+ fSession.getExecutor().execute(query);
+ String value = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
assertEquals("8", value);
- // Now access the child directly
- final IExpressionDMContext childDmc = SyncUtil.createExpression(frameDmc, CHILD_EXPR);
- query = new Query<String>() {
+ // Now access the child directly
+ final IExpressionDMContext childDmc = SyncUtil.createExpression(frameDmc, CHILD_EXPR);
+ query = new Query<String>() {
@Override
protected void execute(final DataRequestMonitor<String> rm) {
fExpService.getFormattedExpressionValue(
- fExpService.getFormattedValueContext(childDmc, IFormattedValues.NATURAL_FORMAT),
+ fExpService.getFormattedValueContext(childDmc, IFormattedValues.NATURAL_FORMAT),
new ImmediateDataRequestMonitor<FormattedValueDMData>(rm) {
@Override
protected void handleSuccess() {
rm.done(getData().getFormattedValue());
- }
+ }
});
}
- };
-
- fSession.getExecutor().execute(query);
- value = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
+ };
+
+ fSession.getExecutor().execute(query);
+ value = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
assertEquals("8", value);
- }
+ }
- protected void assertChildrenCount(final IExpressionDMContext parentDmc,
- final int expectedCount) throws Throwable {
+ protected void assertChildrenCount(final IExpressionDMContext parentDmc, final int expectedCount) throws Throwable {
Query<Integer> query = new Query<Integer>() {
@Override
@@ -4117,28 +4224,26 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
assertThat(count, is(expectedCount));
}
- protected String getExpressionType(final IExpressionDMContext exprDmc, final String expectedType) throws Throwable {
-
- Query<String> query = new Query<String>() {
+ protected String getExpressionType(final IExpressionDMContext exprDmc, final String expectedType) throws Throwable {
+
+ Query<String> query = new Query<String>() {
@Override
protected void execute(final DataRequestMonitor<String> rm) {
- fExpService.getExpressionData(
- exprDmc,
- new ImmediateDataRequestMonitor<IExpressionDMData>(rm) {
- @Override
- protected void handleCompleted() {
- rm.done(getData().getTypeName());
- }
- });
+ fExpService.getExpressionData(exprDmc, new ImmediateDataRequestMonitor<IExpressionDMData>(rm) {
+ @Override
+ protected void handleCompleted() {
+ rm.done(getData().getTypeName());
+ }
+ });
}
- };
-
- fSession.getExecutor().execute(query);
- String type = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
+ };
+
+ fSession.getExecutor().execute(query);
+ String type = query.get(TestsPlugin.massageTimeout(500), TimeUnit.MILLISECONDS);
assertEquals(expectedType, type);
return type;
- }
-
+ }
+
// Slight change in GDB output to fix a bug, so we must change the test a
// little
// Bug 320277

Back to the top