mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-06 09:16:02 +02:00
Bug 376901: JUnit tests for RTTI feature
Change-Id: Id72d0d170b8f78201a36d1f95da5ca7a3d07cfa5 Reviewed-on: https://git.eclipse.org/r/5868 Reviewed-by: Marc Khouzam <marc.khouzam@ericsson.com> IP-Clean: Marc Khouzam <marc.khouzam@ericsson.com> Tested-by: Marc Khouzam <marc.khouzam@ericsson.com>
This commit is contained in:
parent
caf06d61a3
commit
cfff2b91fb
3 changed files with 171 additions and 4 deletions
|
@ -303,6 +303,44 @@ int testArrays() {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For bug 376901 RTTI tests
|
||||||
|
class VirtualBase {
|
||||||
|
public:
|
||||||
|
virtual ~VirtualBase() {} // Necessary to force RTTI generation for the base class
|
||||||
|
int a;
|
||||||
|
private:
|
||||||
|
bool b;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Derived: public VirtualBase {
|
||||||
|
public:
|
||||||
|
int c;
|
||||||
|
VirtualBase* ptr;
|
||||||
|
private:
|
||||||
|
bool d;
|
||||||
|
int e[4];
|
||||||
|
};
|
||||||
|
|
||||||
|
class OtherDerived: public VirtualBase {
|
||||||
|
public:
|
||||||
|
int d;
|
||||||
|
private:
|
||||||
|
bool c;
|
||||||
|
int f[4];
|
||||||
|
};
|
||||||
|
int testRTTI() {
|
||||||
|
Derived derived;
|
||||||
|
Derived child1;
|
||||||
|
OtherDerived child2;
|
||||||
|
|
||||||
|
derived.ptr = &child1; // here derived.b is of type bar
|
||||||
|
|
||||||
|
derived.ptr = &child2; // here derived.b is of type foo
|
||||||
|
|
||||||
|
return 1; // here derived.b is of type Derived
|
||||||
|
}
|
||||||
|
// End of bug 376901 RTTI tests
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
printf("Running ExpressionTest App\n");
|
printf("Running ExpressionTest App\n");
|
||||||
|
|
||||||
|
@ -328,6 +366,7 @@ int main() {
|
||||||
testUpdateOfPointer();
|
testUpdateOfPointer();
|
||||||
testCanWrite();
|
testCanWrite();
|
||||||
testArrays();
|
testArrays();
|
||||||
|
testRTTI();
|
||||||
|
|
||||||
// For bug 320277
|
// For bug 320277
|
||||||
BaseTest b; b.test();
|
BaseTest b; b.test();
|
||||||
|
|
|
@ -11,14 +11,18 @@
|
||||||
package org.eclipse.cdt.tests.dsf.gdb.tests;
|
package org.eclipse.cdt.tests.dsf.gdb.tests;
|
||||||
|
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.IAddress;
|
import org.eclipse.cdt.core.IAddress;
|
||||||
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
|
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
|
||||||
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
|
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
|
||||||
|
import org.eclipse.cdt.dsf.concurrent.ImmediateDataRequestMonitor;
|
||||||
|
import org.eclipse.cdt.dsf.concurrent.Query;
|
||||||
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
|
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
|
||||||
import org.eclipse.cdt.dsf.datamodel.IDMContext;
|
import org.eclipse.cdt.dsf.datamodel.IDMContext;
|
||||||
import org.eclipse.cdt.dsf.debug.service.IExpressions;
|
import org.eclipse.cdt.dsf.debug.service.IExpressions;
|
||||||
|
@ -3238,7 +3242,7 @@ public class MIExpressionsTest extends BaseTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
// This method tests IExspressions.getSubExpressions(IExpressionDMC, DRM);
|
// This method tests IExspressions.getSubExpressions(IExpressionDMC, DRM);
|
||||||
private IExpressionDMContext[] getChildren(
|
protected IExpressionDMContext[] getChildren(
|
||||||
final IExpressionDMContext parentDmc,
|
final IExpressionDMContext parentDmc,
|
||||||
String[] expectedValues) throws Throwable {
|
String[] expectedValues) throws Throwable {
|
||||||
|
|
||||||
|
@ -3288,7 +3292,7 @@ public class MIExpressionsTest extends BaseTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
// This method tests IExpressions.getSubExpressions(IExpressionDMC, int, int, DRM);
|
// This method tests IExpressions.getSubExpressions(IExpressionDMC, int, int, DRM);
|
||||||
private IExpressionDMContext[] getChildren(
|
protected IExpressionDMContext[] getChildren(
|
||||||
final IExpressionDMContext parentDmc,
|
final IExpressionDMContext parentDmc,
|
||||||
final int startIndex,
|
final int startIndex,
|
||||||
final int length,
|
final int length,
|
||||||
|
@ -3522,8 +3526,49 @@ public class MIExpressionsTest extends BaseTestCase {
|
||||||
getChildren(arrayDoubleSmallChildExprDMC, 3, 2, new String[] { "array_double_small[3][3]", "array_double_small[3][4]" });
|
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]" });
|
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 {
|
||||||
|
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 *");
|
||||||
|
getChildrenCount(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 *");
|
||||||
|
getChildrenCount(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 *");
|
||||||
|
getChildrenCount(exprDmc, 2);
|
||||||
|
// The children are also the same as before
|
||||||
|
getChildren(exprDmc, expectedValues);
|
||||||
|
}
|
||||||
|
|
||||||
private int getChildrenCount(final IExpressionDMContext parentDmc, final int expectedCount) throws Throwable {
|
|
||||||
|
protected int getChildrenCount(final IExpressionDMContext parentDmc, final int expectedCount) throws Throwable {
|
||||||
|
|
||||||
final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
|
final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
|
||||||
|
|
||||||
|
@ -3569,4 +3614,31 @@ public class MIExpressionsTest extends BaseTestCase {
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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.getExecutor().submit(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
fExpService.getExpressionData(
|
||||||
|
exprDmc,
|
||||||
|
new ImmediateDataRequestMonitor<IExpressionDMData>(rm) {
|
||||||
|
@Override
|
||||||
|
protected void handleCompleted() {
|
||||||
|
rm.done(getData().getTypeName());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
fSession.getExecutor().execute(query);
|
||||||
|
String type = query.get(500, TimeUnit.MILLISECONDS);
|
||||||
|
assertEquals(expectedType, type);
|
||||||
|
return type;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,10 +10,16 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.tests.dsf.gdb.tests.tests_7_5;
|
package org.eclipse.cdt.tests.dsf.gdb.tests.tests_7_5;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.dsf.debug.service.IExpressions.IExpressionDMContext;
|
||||||
|
import org.eclipse.cdt.dsf.debug.service.IRunControl.StepType;
|
||||||
|
import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
|
||||||
|
import org.eclipse.cdt.dsf.mi.service.command.events.MIStoppedEvent;
|
||||||
import org.eclipse.cdt.tests.dsf.gdb.framework.BackgroundRunner;
|
import org.eclipse.cdt.tests.dsf.gdb.framework.BackgroundRunner;
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.framework.SyncUtil;
|
||||||
import org.eclipse.cdt.tests.dsf.gdb.tests.ITestConstants;
|
import org.eclipse.cdt.tests.dsf.gdb.tests.ITestConstants;
|
||||||
import org.eclipse.cdt.tests.dsf.gdb.tests.tests_7_4.MIExpressionsTest_7_4;
|
import org.eclipse.cdt.tests.dsf.gdb.tests.tests_7_4.MIExpressionsTest_7_4;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
@RunWith(BackgroundRunner.class)
|
@RunWith(BackgroundRunner.class)
|
||||||
|
@ -21,5 +27,55 @@ public class MIExpressionsTest_7_5 extends MIExpressionsTest_7_4 {
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
public static void beforeClassMethod_7_5() {
|
public static void beforeClassMethod_7_5() {
|
||||||
setGdbProgramNamesLaunchAttributes(ITestConstants.SUFFIX_GDB_7_5);
|
setGdbProgramNamesLaunchAttributes(ITestConstants.SUFFIX_GDB_7_5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This test verifies that there is proper RTTI support starting with GDB 7.5.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@Test
|
||||||
|
public void testRTTI() throws Throwable {
|
||||||
|
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 *");
|
||||||
|
getChildrenCount(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
|
||||||
|
getExpressionType(exprDmc, "Derived *");
|
||||||
|
getChildrenCount(exprDmc, 5);
|
||||||
|
// get all children
|
||||||
|
expectedValues = new String[5];
|
||||||
|
expectedValues[0] = "VirtualBase";
|
||||||
|
expectedValues[1] = "c";
|
||||||
|
expectedValues[2] = "ptr";
|
||||||
|
expectedValues[3] = "d";
|
||||||
|
expectedValues[4] = "e";
|
||||||
|
getChildren(exprDmc, expectedValues);
|
||||||
|
|
||||||
|
// Make the type of our expression change
|
||||||
|
SyncUtil.step(1, StepType.STEP_OVER);
|
||||||
|
// Now, the expression should be type OtherDerived
|
||||||
|
getExpressionType(exprDmc, "OtherDerived *");
|
||||||
|
getChildrenCount(exprDmc, 4);
|
||||||
|
// get all children
|
||||||
|
expectedValues = new String[4];
|
||||||
|
expectedValues[0] = "VirtualBase";
|
||||||
|
expectedValues[1] = "d";
|
||||||
|
expectedValues[2] = "c";
|
||||||
|
expectedValues[3] = "f";
|
||||||
|
getChildren(exprDmc, expectedValues);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue