blob: b1a59e9c4b3f26b0e4efc76eb2fccfca36ce6ea4 [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.ArrayList;
import java.util.Random;
import org.eclipse.cdt.debug.edc.internal.services.dsf.Memory;
import org.eclipse.cdt.debug.edc.internal.services.dsf.RunControl.ExecutionDMC;
import org.eclipse.cdt.debug.edc.launch.EDCLaunch;
import org.eclipse.cdt.debug.edc.services.IEDCMemory;
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.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.debug.model.DsfMemoryBlockRetrieval;
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.cdt.utils.Addr32;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.debug.core.model.MemoryByte;
import org.junit.Test;
public class MemoryView extends BaseLaunchTest {
@Test
public void testMemoryView() throws Exception {
TestUtils.showDebugPerspective();
final EDCLaunch launch = createLaunch();
assertNotNull(launch);
final Addr32 addr32 = new Addr32(0x405400);
final DsfSession session = waitForSession(launch);
assertNotNull(session);
final DsfMemoryBlockRetrieval memoryBlock = launch.getMemoryBlockRetrieval();
assertNotNull(memoryBlock);
final ExecutionDMC executionDMC = waitForExecutionDMC(session);
assertNotNull(executionDMC);
DsfServicesTracker servicesTracker = getDsfServicesTracker(session);
final Memory mem = servicesTracker.getService(Memory.class);
// Write memory, read memory back and compare
final byte[] data = new byte[1000];
new Random().nextBytes(data);
// Use a Query to synchronize the downstream calls
Query<MemoryByte[]> query = new Query<MemoryByte[]>() {
@Override
protected void execute(final DataRequestMonitor<MemoryByte[]> drm) {
mem.setMemory(executionDMC, addr32, 0, 1, 1000, data,
new RequestMonitor(memoryBlock.getExecutor(), drm));
drm.done();
}
};
memoryBlock.getExecutor().execute(query);
waitForMemoryValues(addr32, executionDMC, mem, data);
}
private void waitForMemoryValues(final Addr32 addr32, final ExecutionDMC executionDMC, final IEDCMemory mem,
final byte[] data) throws Exception {
TestUtils.wait(new Condition() {
public boolean isConditionValid() {
ArrayList<MemoryByte> buf = new ArrayList<MemoryByte>();
IStatus memGetStatus = mem.getMemory(executionDMC, addr32, buf, data.length, 1);
if (memGetStatus.isOK()) {
for (int i = 0; (i < buf.size()) && (i < data.length); i++) {
// check each byte
if (!buf.get(i).isReadable())
return false;
if (data[i] != buf.get(i).getValue())
return false;
}
} else
return false;
return true;
}
});
}
}