GP-0: Fix timing and null thread issues in tests

This commit is contained in:
Dan
2023-01-24 10:22:30 -05:00
parent e5a8f26347
commit 60c5da018d
3 changed files with 13 additions and 6 deletions

View File

@@ -427,7 +427,8 @@ public class ObjectBasedTraceRecorder implements TraceRecorder {
@Override @Override
public Set<TargetRegisterBank> getTargetRegisterBanks(TraceThread thread, int frameLevel) { public Set<TargetRegisterBank> getTargetRegisterBanks(TraceThread thread, int frameLevel) {
return Set.of(objectRecorder.getTargetFrameInterface(thread, frameLevel, TargetRegisterBank.class)); return Set.of(
objectRecorder.getTargetFrameInterface(thread, frameLevel, TargetRegisterBank.class));
} }
@Override @Override
@@ -504,7 +505,7 @@ public class ObjectBasedTraceRecorder implements TraceRecorder {
protected TargetRegisterContainer getTargetRegisterContainer(TraceThread thread, protected TargetRegisterContainer getTargetRegisterContainer(TraceThread thread,
int frameLevel) { int frameLevel) {
if (!(thread instanceof TraceObjectThread tot)) { if (!(thread instanceof TraceObjectThread tot)) {
throw new AssertionError(); throw new AssertionError("thread = " + thread);
} }
TraceObject objThread = tot.getObject(); TraceObject objThread = tot.getObject();
TraceObject regContainer = objThread.queryRegisterContainer(frameLevel); TraceObject regContainer = objThread.queryRegisterContainer(frameLevel);

View File

@@ -527,7 +527,8 @@ public interface TraceRecorder {
return writeMemory(address, data); return writeMemory(address, data);
} }
if (address.isRegisterAddress()) { if (address.isRegisterAddress()) {
return writeRegister(platform, thread, frameLevel, address, data); return writeRegister(platform, Objects.requireNonNull(thread), frameLevel, address,
data);
} }
throw new IllegalArgumentException("Address is not in a recognized space: " + address); throw new IllegalArgumentException("Address is not in a recognized space: " + address);
} }
@@ -599,6 +600,9 @@ public interface TraceRecorder {
if (address.isMemoryAddress()) { if (address.isMemoryAddress()) {
return isMemoryOnTarget(address); return isMemoryOnTarget(address);
} }
if (thread == null) { // register-space addresses require a thread
return false;
}
Register register = platform.getLanguage().getRegister(address, size); Register register = platform.getLanguage().getRegister(address, size);
if (register == null) { if (register == null) {
throw new IllegalArgumentException("Cannot identify the (single) register: " + address); throw new IllegalArgumentException("Cannot identify the (single) register: " + address);

View File

@@ -432,13 +432,13 @@ public class DebuggerStateEditingServiceTest extends AbstractGhidraHeadedDebugge
(TargetRegisterBank) mb.testThread1.getCachedAttribute("RegisterBank"); (TargetRegisterBank) mb.testThread1.getCachedAttribute("RegisterBank");
traceManager.openTrace(tb.trace); traceManager.openTrace(tb.trace);
activateTrace(); activateTrace();
TraceThread thread = recorder.getTraceThread(mb.testThread1); TraceThread thread = waitForValue(() -> recorder.getTraceThread(mb.testThread1));
traceManager.activateThread(thread); traceManager.activateThread(thread);
waitForSwing(); waitForSwing();
editingService.setCurrentMode(recorder.getTrace(), StateEditingMode.RW_TARGET); editingService.setCurrentMode(recorder.getTrace(), StateEditingMode.RW_TARGET);
StateEditor editor = createStateEditor(); StateEditor editor = createStateEditor();
assertTrue(editor.isRegisterEditable(r0)); waitForPass(() -> assertTrue(editor.isRegisterEditable(r0)));
waitOn(editor.setRegister(rv1234)); waitOn(editor.setRegister(rv1234));
waitForPass(() -> { waitForPass(() -> {
TraceMemorySpace regs = TraceMemorySpace regs =
@@ -447,7 +447,7 @@ public class DebuggerStateEditingServiceTest extends AbstractGhidraHeadedDebugge
RegisterValue value = regs.getValue(getPlatform(), traceManager.getCurrentSnap(), r0); RegisterValue value = regs.getValue(getPlatform(), traceManager.getCurrentSnap(), r0);
assertEquals(rv1234, value); assertEquals(rv1234, value);
}); });
assertTrue(editor.isRegisterEditable(r0h)); waitForPass(() -> assertTrue(editor.isRegisterEditable(r0h)));
waitOn(editor.setRegister(rvHigh1234)); waitOn(editor.setRegister(rvHigh1234));
assertArrayEquals(mb.arr(0, 0, 4, 0xd2, 0, 0, 4, 0xd2), waitOn(bank.readRegister("r0"))); assertArrayEquals(mb.arr(0, 0, 4, 0xd2, 0, 0, 4, 0xd2), waitOn(bank.readRegister("r0")));
@@ -478,6 +478,7 @@ public class DebuggerStateEditingServiceTest extends AbstractGhidraHeadedDebugge
public void testWriteTargetMemoryNotAliveErr() throws Throwable { public void testWriteTargetMemoryNotAliveErr() throws Throwable {
createAndOpenTrace(); createAndOpenTrace();
activateTrace(); activateTrace();
waitForSwing();
editingService.setCurrentMode(tb.trace, StateEditingMode.RW_TARGET); editingService.setCurrentMode(tb.trace, StateEditingMode.RW_TARGET);
waitForSwing(); waitForSwing();
@@ -492,6 +493,7 @@ public class DebuggerStateEditingServiceTest extends AbstractGhidraHeadedDebugge
public void testWriteTargetRegisterNotAliveErr() throws Throwable { public void testWriteTargetRegisterNotAliveErr() throws Throwable {
createAndOpenTrace(); createAndOpenTrace();
activateTrace(); activateTrace();
waitForSwing();
editingService.setCurrentMode(tb.trace, StateEditingMode.RW_TARGET); editingService.setCurrentMode(tb.trace, StateEditingMode.RW_TARGET);
waitForSwing(); waitForSwing();