blob: cf2d2cf02d0447bdc7614a6135f6b72ae62b73e1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2010 Nokia and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Nokia - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.edc.debugger.tests;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import junit.framework.Assert;
import org.eclipse.cdt.debug.edc.services.Registers;
import org.eclipse.cdt.debug.edc.services.Registers.RegisterDMC;
import org.eclipse.cdt.debug.edc.tests.TestUtils;
import org.eclipse.cdt.debug.edc.tests.TestUtils.Condition;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.Query;
import org.eclipse.cdt.dsf.datamodel.CompositeDMContext;
import org.eclipse.cdt.dsf.datamodel.IDMContext;
import org.eclipse.cdt.dsf.debug.service.IFormattedValues;
import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMContext;
import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMData;
import org.eclipse.cdt.dsf.debug.service.IFormattedValues.IFormattedDataDMContext;
import org.eclipse.cdt.dsf.debug.service.IRegisters.IBitFieldDMContext;
import org.eclipse.cdt.dsf.debug.service.IRegisters.IBitFieldDMData;
import org.eclipse.cdt.dsf.debug.service.IRegisters.IMnemonic;
import org.eclipse.cdt.dsf.debug.service.IRegisters.IRegisterDMContext;
import org.eclipse.cdt.dsf.debug.service.IRegisters.IRegisterDMData;
import org.eclipse.cdt.dsf.debug.service.IRegisters.IRegisterGroupDMContext;
import org.eclipse.cdt.dsf.debug.service.IRegisters.IRegisterGroupDMData;
import org.eclipse.core.runtime.CoreException;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class RegisterView {
static class RegisterViewLaunch extends BaseLaunchTest {
@Override
protected boolean getStopAtMain() {
return true;
}
}
static RegisterViewLaunch testLaunch;
static Registers regService;
static IRegisterDMContext[] regDMCs;
static IRegisterGroupDMContext regGroupDMC;
@BeforeClass
public static void launch() throws Exception {
testLaunch = new RegisterViewLaunch();
testLaunch.basicLaunch();
regService = TestUtils.getService(testLaunch.session, Registers.class);
regGroupDMC = waitForRegisterGroup(regService);
String regGroupString = regGroupDMC.toString();
Assert.assertTrue("RegisterGroup toString()", regGroupString.startsWith("DMContext [id="));
Assert.assertTrue("RegisterGroup toString()", regGroupString.endsWith("].group[Basic]"));
regDMCs = waitForRegisterDMCs(regGroupDMC, regService);
String regDMCString = regDMCs[0].toString();
Assert.assertTrue("RegisterDMC[0] toString()", regDMCString.startsWith("DMContext [id="));
Assert.assertTrue("RegisterDMC[0] toString()", regDMCString.endsWith("].group[Basic].register[EAX]"));
}
@AfterClass
public static void shutdown() {
TestUtils.shutdownDebugSession(testLaunch.launch, testLaunch.session);
testLaunch = null;
}
@Test
public void testRegisterView() throws Exception {
testRegisterWrites(regService, regDMCs);
}
@Test
public void coverageInternalFindBitFieldNotSupported() throws Exception {
Query<IBitFieldDMContext> query = new Query<IBitFieldDMContext>() {
@Override
protected void execute(final DataRequestMonitor<IBitFieldDMContext> drm) {
regService.findBitField(testLaunch.threadDMC, "", drm);
}
};
testLaunch.session.getExecutor().execute(query);
try {
IBitFieldDMContext unexpectedResult = query.get(1, TimeUnit.SECONDS);
Assert.assertNull("Not expecting filled IBitFieldDMContext", unexpectedResult);
} catch (ExecutionException e) {
Assert.assertTrue(e.getCause() instanceof CoreException);
Assert.assertEquals("findBitField not supported", e.getCause().getMessage());
}
}
@Test
public void coverageInternalFindRegisterNotSupported() throws Exception {
Query<IRegisterDMContext> query = new Query<IRegisterDMContext>() {
@Override
protected void execute(final DataRequestMonitor<IRegisterDMContext> drm) {
regService.findRegister(testLaunch.threadDMC, "", drm);
}
};
testLaunch.session.getExecutor().execute(query);
try {
IRegisterDMContext unexpectedResult = query.get(1, TimeUnit.SECONDS);
Assert.assertNull("Not expecting filled IRegisterDMContext", unexpectedResult);
} catch (ExecutionException e) {
Assert.assertTrue(e.getCause() instanceof CoreException);
Assert.assertEquals("findRegister not supported", e.getCause().getMessage());
}
}
@Test
public void coverageInternalFindRegisterGroupNotSupported() throws Exception {
Query<IRegisterGroupDMContext> query = new Query<IRegisterGroupDMContext>() {
@Override
protected void execute(final DataRequestMonitor<IRegisterGroupDMContext> drm) {
regService.findRegisterGroup(testLaunch.threadDMC, "", drm);
}
};
testLaunch.session.getExecutor().execute(query);
try {
IRegisterGroupDMContext unexpectedResult = query.get(1, TimeUnit.SECONDS);
Assert.assertNull("Not expecting filled IRegisterGroupDMContext", unexpectedResult);
} catch (ExecutionException e) {
Assert.assertTrue(e.getCause() instanceof CoreException);
Assert.assertEquals("findRegisterGroup not supported", e.getCause().getMessage());
}
}
@Test
public void testInternalGetAvailableFormats() throws Exception {
Query<String[]> query = new Query<String[]>() {
@Override
protected void execute(final DataRequestMonitor<String[]> drm) {
regService.getAvailableFormats((IFormattedDataDMContext)null, drm);
}
};
testLaunch.session.getExecutor().execute(query);
String[] expectedResult = query.get(1, TimeUnit.SECONDS);
Assert.assertTrue(query.isDone());
Assert.assertNotNull("Registers.getAvailableFormats() result", expectedResult);
Assert.assertEquals("Registers.getAvailableFormats() result size", 5, expectedResult.length);
String[] comparisonFormats
= new String[]
{ IFormattedValues.HEX_FORMAT,
IFormattedValues.DECIMAL_FORMAT,
IFormattedValues.OCTAL_FORMAT,
IFormattedValues.BINARY_FORMAT,
IFormattedValues.NATURAL_FORMAT };
for (int i=0; i<comparisonFormats.length; ++i) {
Assert.assertEquals("Registers.getAvailableFormats()[" + i + "] contents",
comparisonFormats[i], expectedResult[i]);
}
}
@Test
public void coverageInternalGetBitFieldsNotSupported() throws Exception {
Query<IBitFieldDMContext[]> query = new Query<IBitFieldDMContext[]>() {
@Override
protected void execute(final DataRequestMonitor<IBitFieldDMContext[]> drm) {
regService.getBitFields(testLaunch.threadDMC, drm);
}
};
testLaunch.session.getExecutor().execute(query);
try {
IBitFieldDMContext[] unexpectedResult = query.get(1, TimeUnit.SECONDS);
Assert.assertNull("Not expecting filled IBitFieldDMContext[]", unexpectedResult);
} catch (ExecutionException e) {
Assert.assertTrue(e.getCause() instanceof CoreException);
Assert.assertEquals("BitField not supported", e.getCause().getMessage());
}
}
@Test
public void coverageInternalGetBitFieldDataNotSupported() throws Exception {
Query<IBitFieldDMData> query = new Query<IBitFieldDMData>() {
@Override
protected void execute(final DataRequestMonitor<IBitFieldDMData> drm) {
regService.getBitFieldData((IBitFieldDMContext)null, drm);
}
};
testLaunch.session.getExecutor().execute(query);
try {
IBitFieldDMData unexpectedResult = query.get(1, TimeUnit.SECONDS);
Assert.assertNull("Not expecting filled IBitFieldDMData", unexpectedResult);
} catch (ExecutionException e) {
Assert.assertTrue(e.getCause() instanceof CoreException);
Assert.assertEquals("Bit fields not yet supported", e.getCause().getMessage());
}
}
@Test
public void testInternalGetFormattedExpressionValue() throws Exception {
final FormattedValueDMContext formattedValueDMC
= regService.getFormattedValueContext(regDMCs[0], IFormattedValues.NATURAL_FORMAT);
Query<FormattedValueDMData> query = new Query<FormattedValueDMData>() {
@Override
protected void execute(final DataRequestMonitor<FormattedValueDMData> drm) {
regService.getModelData(formattedValueDMC, drm);
}
};
testLaunch.session.getExecutor().execute(query);
FormattedValueDMData formatValueDMData = query.get(1, TimeUnit.SECONDS);
Assert.assertTrue(query.isDone());
Assert.assertNotNull(formatValueDMData);
}
@Test
public void testInternalGetRegisterData() throws Exception {
Query<IRegisterDMData> query = new Query<IRegisterDMData>() {
@Override
protected void execute(final DataRequestMonitor<IRegisterDMData> drm) {
regService.getModelData(regDMCs[0], drm);
}
};
testLaunch.session.getExecutor().execute(query);
IRegisterDMData regDMData = query.get(1, TimeUnit.SECONDS);
Assert.assertTrue(query.isDone());
Assert.assertNotNull(regDMData);
Assert.assertNull("RegisterData.getDescription()", regDMData.getDescription());
Assert.assertEquals("RegisterData.getName()", "EAX", regDMData.getName());
Assert.assertFalse("RegisterData.hasSideEffects()", regDMData.hasSideEffects());
Assert.assertFalse("RegisterData.isFloat()", regDMData.isFloat());
Assert.assertTrue("RegisterData.isReadable()", regDMData.isReadable());
Assert.assertFalse("RegisterData.isReadOnce()", regDMData.isReadOnce());
Assert.assertFalse("RegisterData.isVolatile()", regDMData.isVolatile());
Assert.assertTrue("RegisterData.isWriteable()", regDMData.isWriteable());
Assert.assertFalse("RegisterData.isWriteOnce()", regDMData.isWriteOnce());
}
@Test
public void testInternalGetRegisterGroupData() throws Exception {
Query<IRegisterGroupDMData> query = new Query<IRegisterGroupDMData>() {
@Override
protected void execute(final DataRequestMonitor<IRegisterGroupDMData> drm) {
regService.getModelData(regGroupDMC, drm);
}
};
testLaunch.session.getExecutor().execute(query);
IRegisterGroupDMData regGroupData = query.get(1, TimeUnit.SECONDS);
Assert.assertTrue(query.isDone());
Assert.assertNotNull(regGroupData);
Assert.assertEquals("RegisterGroupData.getDescription()",
"Basic Program Execution Registers of x86", regGroupData.getDescription());
Assert.assertEquals("RegisterGroupData.getName()", "Basic", regGroupData.getName());
}
@Test
public void coverageInternalWriteBitFieldStringEmptyImplementation() throws Exception {
Query<Boolean> query = new Query<Boolean>() {
@Override
protected void execute(final DataRequestMonitor<Boolean> drm) {
regService.writeBitField((IBitFieldDMContext)null, (String)"bitFieldValue", (String)"formatID", drm);
}
};
testLaunch.session.getExecutor().execute(query);
query.get(1, TimeUnit.SECONDS);
Assert.assertTrue(query.isDone());
}
@Test
public void coverageInternalWriteBitFieldIMnemonicEmptyImplementation() throws Exception {
Query<Boolean> query = new Query<Boolean>() {
@Override
protected void execute(final DataRequestMonitor<Boolean> drm) {
regService.writeBitField((IBitFieldDMContext)null, (IMnemonic)null, drm);
}
};
testLaunch.session.getExecutor().execute(query);
query.get(1, TimeUnit.SECONDS);
Assert.assertTrue(query.isDone());
}
private void testRegisterWrites(final Registers regService, final IRegisterDMContext[] regDMCs)
throws Exception {
for (IRegisterDMContext regContext : regDMCs) {
final RegisterDMC regDMC = (RegisterDMC) regContext;
regService.writeRegister(regDMC, "0000000d", "NATURAL.Format");
Assert.assertEquals("d", regService.getRegisterValueAsHexString(regDMC));
}
}
private static IRegisterDMContext[] waitForRegisterDMCs(final IRegisterGroupDMContext regGroupDMC,
final Registers regService) throws Exception {
final IRegisterDMContext contextsHolder[][] = { null };
TestUtils.wait(new Condition() {
public boolean isConditionValid() {
CompositeDMContext compositeDMC
= new CompositeDMContext(new IDMContext[] { testLaunch.threadDMC, regGroupDMC });
regService.getRegisters(compositeDMC,
new DataRequestMonitor<IRegisterDMContext[]>(regService.getExecutor(), null) {
@Override
protected void handleSuccess() {
contextsHolder[0] = getData();
}
});
if (contextsHolder[0] != null)
return true;
return false;
}
});
return contextsHolder[0];
}
private static IRegisterGroupDMContext waitForRegisterGroup(final Registers regService) throws Exception {
Query<IRegisterGroupDMContext[]> query = new Query<IRegisterGroupDMContext[]>() {
@Override
protected void execute(final DataRequestMonitor<IRegisterGroupDMContext[]> drm) {
regService.getRegisterGroups(testLaunch.threadDMC, drm);
}
};
testLaunch.session.getExecutor().execute(query);
IRegisterGroupDMContext[] expectedResult = query.get(2, TimeUnit.SECONDS);
Assert.assertTrue(query.isDone());
Assert.assertTrue("", 0 < expectedResult.length);
return expectedResult[0];
}
}