/******************************************************************************* | |
* Copyright (c) 2011 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. June, 2011 | |
*******************************************************************************/ | |
package org.eclipse.cdt.debug.edc.debugger.tests; | |
import java.math.BigInteger; | |
import org.eclipse.cdt.core.IAddress; | |
import org.eclipse.cdt.debug.edc.internal.formatter.FormatExtensionManager; | |
import org.eclipse.cdt.debug.edc.symbols.IInvalidVariableLocation; | |
import org.eclipse.cdt.debug.edc.symbols.IRegisterOffsetVariableLocation; | |
import org.eclipse.cdt.debug.edc.symbols.IRegisterVariableLocation; | |
import org.eclipse.cdt.debug.edc.symbols.IValueVariableLocation; | |
import org.eclipse.cdt.debug.edc.symbols.IVariableLocation; | |
import org.eclipse.cdt.debug.edc.symbols.VariableLocationFactory; | |
import org.eclipse.core.runtime.CoreException; | |
import org.junit.After; | |
import org.junit.Assert; | |
import org.junit.Before; | |
import org.junit.Test; | |
/** | |
* Test various VariableLocations. | |
*/ | |
public class VariableLocationTest extends SimpleDebuggerTest { | |
boolean formatterSetting; | |
@Before | |
public void turnOnFormatter() { | |
formatterSetting = FormatExtensionManager.instance().isEnabled(); | |
FormatExtensionManager.instance().setEnabled(true); | |
} | |
@After | |
public void restoreFormatter() { | |
FormatExtensionManager.instance().setEnabled(formatterSetting); | |
} | |
/* | |
* Control should stop at a location in the snapshot launch. | |
*/ | |
@Test | |
public void testRegisterVariableLocation() throws Exception { | |
// create an artificial RegisterVariableLocation. | |
IRegisterVariableLocation loc = VariableLocationFactory.createRegisterVariableLocation(getEdcServiceTracker(), frame, 0); | |
IAddress addr = loc.getAddress(); | |
Assert.assertNull(addr); // no addr for register location | |
String str = loc.getRegisterName(); | |
Assert.assertEquals("EAX", str); | |
// This is the register value of "EAX" | |
BigInteger val = loc.readValue(4); | |
Assert.assertEquals(0x425e3333, val.intValue()); | |
/* Hmm, this is asynchronous write. */ | |
loc.writeValue(4, BigInteger.valueOf(0x10)); | |
Thread.sleep(1000); | |
val = loc.readValue(4); | |
Assert.assertEquals(0x10, val.intValue()); | |
IVariableLocation loc2 = loc.addOffset(0x10); | |
Assert.assertTrue(loc2 instanceof IRegisterOffsetVariableLocation); | |
IRegisterOffsetVariableLocation rovLoc = (IRegisterOffsetVariableLocation)loc2; | |
addr = rovLoc.getAddress(); | |
Assert.assertNull(addr); | |
val = rovLoc.readValue(4); | |
Assert.assertEquals(0x20, val.intValue()); | |
Assert.assertEquals("0x20", rovLoc.getLocationName()); | |
Assert.assertEquals("EAX + 16", rovLoc.toString()); | |
Assert.assertEquals(0x10, rovLoc.getOffset()); | |
// Add more "offset" | |
// | |
loc2 = rovLoc.addOffset(0x10); | |
Assert.assertTrue(loc2 instanceof IRegisterOffsetVariableLocation); | |
rovLoc = (IRegisterOffsetVariableLocation)loc2; | |
Assert.assertEquals(0x30, rovLoc.readValue(4).intValue()); | |
Assert.assertEquals("EAX + 32", rovLoc.toString()); | |
} | |
@Test | |
public void testValueVariableLocation() { | |
// create an artificial RegisterVariableLocation. | |
IValueVariableLocation loc = VariableLocationFactory.createValueVariableLocation(BigInteger.valueOf(0x1000)); | |
String str = loc.toString(); | |
Assert.assertEquals("0x1000", str); | |
BigInteger val; | |
try { | |
val = loc.readValue(4); | |
} catch (CoreException e) { | |
Assert.fail("readValue() failed."); | |
return; | |
} | |
Assert.assertEquals(0x1000, val.intValue()); | |
IAddress addr = loc.getAddress(); | |
Assert.assertNull(addr); // no addr | |
Assert.assertNull(loc.getServicesTracker()); | |
Assert.assertEquals("", loc.getLocationName()); | |
Assert.assertNull(loc.getContext()); | |
/* this just throws exception. */ | |
try { | |
loc.writeValue(4, BigInteger.valueOf(0x10)); | |
Assert.fail("writeValue fails to throw exception."); | |
} catch (CoreException e) { | |
} | |
// Now addOffset to create a new location. | |
// | |
IVariableLocation loc2 = loc.addOffset(0x10); | |
Assert.assertTrue(loc2 instanceof IValueVariableLocation); | |
IValueVariableLocation vvLoc = (IValueVariableLocation)loc2; | |
addr = vvLoc.getAddress(); | |
Assert.assertNull(addr); | |
try { | |
val = vvLoc.readValue(4); | |
} catch (CoreException e) { | |
Assert.fail("readValue() failed."); | |
return; | |
} | |
Assert.assertEquals(0x1010, val.intValue()); | |
} | |
@Test | |
public void testInvalidVariableLocation() { | |
String msg = "testTrash"; | |
// create an artificial RegisterVariableLocation. | |
IInvalidVariableLocation loc = VariableLocationFactory.createInvalidVariableLocation(msg); | |
String str = loc.toString(); | |
Assert.assertTrue(str.contains(msg)); | |
Assert.assertEquals(msg, loc.getMessage()); | |
try { | |
loc.readValue(4); | |
Assert.fail("readValue() should fail but didn't."); | |
} catch (CoreException e) { | |
Assert.assertTrue(e.getMessage().contains(msg)); | |
} | |
Assert.assertEquals("", loc.getLocationName()); | |
Assert.assertNull(loc.getAddress()); // no addr | |
Assert.assertNull(loc.getContext()); | |
Assert.assertNull(loc.getServicesTracker()); | |
/* this just throws exception. */ | |
try { | |
loc.writeValue(4, BigInteger.valueOf(0x10)); | |
Assert.fail("writeValue() should fail but didn't."); | |
} catch (CoreException e) { | |
} | |
loc.setMessage("msg2"); | |
loc.getMessage().equals("msg2"); | |
// Now addOffset to create a new location. | |
// | |
IVariableLocation loc2 = loc.addOffset(0x10); | |
Assert.assertEquals(loc, loc2); | |
} | |
@Override | |
public String getAlbumName() { | |
return "ExpressionsBasic.dsa"; | |
} | |
} |