GP-0: Fixing DebuggerTraceManagerService tests

This commit is contained in:
Dan 2021-04-07 14:55:39 -04:00
parent 56559fe62a
commit 34e67ea909
9 changed files with 42 additions and 60 deletions

View file

@ -236,8 +236,8 @@ public class DefaultTraceRecorder implements TraceRecorder {
@Override
public TraceStackFrame getTraceStackFrame(TargetStackFrame frame) {
// THIS IS UNUSED
return null;
// Not the most efficient, but only used in testing.
return getTraceStackFrameForSuccessor(frame);
}
@Override

View file

@ -984,10 +984,10 @@ public class DebuggerTraceManagerServicePlugin extends Plugin
return thread;
}
}
if (!Objects.equals(prev.getTrace(), resolved.getTrace())) {
return recorder.getTarget();
}
return null;
//if (!Objects.equals(prev.getTrace(), resolved.getTrace())) {
return recorder.getTarget();
//}
//return null;
}
@Override

View file

@ -33,6 +33,7 @@ import ghidra.dbg.model.TestTargetStackFrameHasRegisterBank;
import ghidra.framework.model.DomainFile;
import ghidra.trace.database.thread.DBTraceThread;
import ghidra.trace.model.Trace;
import ghidra.trace.model.thread.TraceThread;
import ghidra.util.SystemUtilities;
import ghidra.util.database.UndoableTransaction;
@ -307,30 +308,30 @@ public class DebuggerTraceManagerServiceTest extends AbstractGhidraHeadedDebugge
traceManager.activateTrace(trace);
waitForSwing();
assertEquals(0, recorder.getSnap());
assertEquals(0, traceManager.getCurrentSnap());
long initSnap = recorder.getSnap();
assertEquals(initSnap, traceManager.getCurrentSnap());
recorder.forceSnapshot();
waitForSwing();
assertEquals(1, recorder.getSnap());
assertEquals(1, traceManager.getCurrentSnap());
assertEquals(initSnap + 1, recorder.getSnap());
assertEquals(initSnap + 1, traceManager.getCurrentSnap());
traceManager.setAutoActivatePresent(false);
recorder.forceSnapshot();
waitForSwing();
assertEquals(2, recorder.getSnap());
assertEquals(1, traceManager.getCurrentSnap());
assertEquals(initSnap + 2, recorder.getSnap());
assertEquals(initSnap + 1, traceManager.getCurrentSnap());
traceManager.setAutoActivatePresent(true);
recorder.forceSnapshot();
waitForSwing();
assertEquals(3, recorder.getSnap());
assertEquals(3, traceManager.getCurrentSnap());
assertEquals(initSnap + 3, recorder.getSnap());
assertEquals(initSnap + 3, traceManager.getCurrentSnap());
}
@Test
@ -344,6 +345,8 @@ public class DebuggerTraceManagerServiceTest extends AbstractGhidraHeadedDebugge
new TestDebuggerTargetTraceMapper(mb.testProcess1));
Trace trace = recorder.getTrace();
waitForValue(() -> modelService.getTarget(trace));
traceManager.openTrace(trace);
waitForSwing();
@ -356,16 +359,22 @@ public class DebuggerTraceManagerServiceTest extends AbstractGhidraHeadedDebugge
assertNull(traceManager.getCurrentThread());
assertEquals(mb.testProcess1, mb.testModel.session.getFocus());
traceManager.activateThread(recorder.getTraceThread(mb.testThread1));
TraceThread thread = waitForValue(() -> recorder.getTraceThread(mb.testThread1));
traceManager.activateThread(thread);
waitForSwing();
assertEquals(mb.testThread1, mb.testModel.session.getFocus());
TestTargetStack stack = mb.testThread1.addStack();
// Note, push simply moves the data, the new frame still has the higher index
TestTargetStackFrameHasRegisterBank frame0 = stack.pushFrameHasBank();
TestTargetStackFrameHasRegisterBank frame1 = stack.pushFrameHasBank();
TestTargetStackFrameHasRegisterBank frame0 = stack.pushFrameHasBank(mb.addr(0x00400000));
TestTargetStackFrameHasRegisterBank frame1 = stack.pushFrameHasBank(mb.addr(0x00400100));
waitForDomainObject(trace);
// Eww. I'm starting to think this could be cheating, considering focus sync at launch
waitForValue(() -> recorder.getTraceStackFrame(frame0));
waitForValue(() -> recorder.getTraceStackFrame(frame1));
waitForValue(() -> recorder.getTargetStackFrame(thread, 0));
waitForValue(() -> recorder.getTargetStackFrame(thread, 1));
// Starting with 0 results in no change in coordinates, so ignored
traceManager.activateFrame(1);
@ -418,8 +427,8 @@ public class DebuggerTraceManagerServiceTest extends AbstractGhidraHeadedDebugge
TestTargetStack stack = mb.testThread1.addStack();
// Note, push simply moves the data, the new frame still has the higher index
TestTargetStackFrameHasRegisterBank frame0 = stack.pushFrameHasBank();
TestTargetStackFrameHasRegisterBank frame1 = stack.pushFrameHasBank();
TestTargetStackFrameHasRegisterBank frame0 = stack.pushFrameHasBank(mb.addr(0x00400000));
TestTargetStackFrameHasRegisterBank frame1 = stack.pushFrameHasBank(mb.addr(0x00400100));
waitForDomainObject(trace);
// Starting with 0 results in no change in coordinates, so ignored

View file

@ -15,8 +15,6 @@
*/
package ghidra.dbg.util;
import java.util.Collection;
import ghidra.util.Msg;
public enum ValueUtils {
@ -44,19 +42,4 @@ public enum ValueUtils {
}
return cls.cast(val);
}
public static boolean expectBoolean(Object val, Object logObj, String attributeName,
boolean fallback, boolean required) {
Boolean exp = expectType(val, Boolean.class, logObj, attributeName, null, required);
if (exp == null) {
return fallback;
}
return exp;
}
@SuppressWarnings("unchecked")
public static <T extends Collection<E>, E> Class<T> colOf(Class<? super T> colType,
Class<E> elemType) {
return (Class<T>) colType;
}
}

View file

@ -92,7 +92,7 @@ public class TestDebuggerModelBuilder {
* Create register banks which are the top frame of stacks attributed to the threads.
*/
public void createTestThreadStacksAndFramesAreRegisterBanks() {
applyThreadRegisterBankConvention(t -> t.addStack().pushFrameIsBank());
applyThreadRegisterBankConvention(t -> t.addStack().pushFrameIsBank(addr(0x00400000)));
}
/**
@ -100,6 +100,7 @@ public class TestDebuggerModelBuilder {
* threads.
*/
public void createTestThreadStacksAndFramesHaveRegisterBanks() {
applyThreadRegisterBankConvention(t -> t.addStack().pushFrameHasBank().getBank());
applyThreadRegisterBankConvention(
t -> t.addStack().pushFrameHasBank(addr(0x00400000)).getBank());
}
}

View file

@ -19,6 +19,7 @@ import java.util.ArrayList;
import java.util.List;
import ghidra.dbg.target.TargetStack;
import ghidra.program.model.address.Address;
public class TestTargetStack extends DefaultTestTargetObject<TestTargetStackFrame, TestTargetThread>
implements TargetStack {
@ -42,8 +43,8 @@ public class TestTargetStack extends DefaultTestTargetObject<TestTargetStackFram
*
* @return the "new" highest-indexed frame, into which old data was pushed
*/
public TestTargetStackFrameHasRegisterBank pushFrameHasBank() {
return pushFrame(new TestTargetStackFrameHasRegisterBank(this, elements.size()));
public TestTargetStackFrameHasRegisterBank pushFrameHasBank(Address pc) {
return pushFrame(new TestTargetStackFrameHasRegisterBank(this, elements.size(), pc));
}
/**
@ -51,7 +52,7 @@ public class TestTargetStack extends DefaultTestTargetObject<TestTargetStackFram
*
* @return the "new" highest-indexed frame, into which old data was pushed
*/
public TestTargetStackFrameIsRegisterBank pushFrameIsBank() {
return pushFrame(new TestTargetStackFrameIsRegisterBank(this, elements.size()));
public TestTargetStackFrameIsRegisterBank pushFrameIsBank(Address pc) {
return pushFrame(new TestTargetStackFrameIsRegisterBank(this, elements.size(), pc));
}
}

View file

@ -27,12 +27,13 @@ public class TestTargetStackFrameHasRegisterBank
protected final TestTargetRegisterBankInFrame bank;
protected Address pc;
public TestTargetStackFrameHasRegisterBank(TestTargetStack parent, int level) {
public TestTargetStackFrameHasRegisterBank(TestTargetStack parent, int level, Address pc) {
super(parent, PathUtils.makeKey(PathUtils.makeIndex(level)), "Frame");
bank = new TestTargetRegisterBankInFrame(this);
changeAttributes(List.of(), Map.of(
bank.getName(), bank //
bank.getName(), bank, //
PC_ATTRIBUTE_NAME, this.pc = pc //
), "Initialized");
}

View file

@ -27,9 +27,10 @@ public class TestTargetStackFrameIsRegisterBank
protected Address pc;
public TestTargetStackFrameIsRegisterBank(TestTargetStack parent, int level) {
public TestTargetStackFrameIsRegisterBank(TestTargetStack parent, int level, Address pc) {
super(parent, PathUtils.makeKey(PathUtils.makeIndex(level)), "Frame",
parent.getParent().getParent().getParent().regs);
setPC(pc);
}
@Override
@ -49,7 +50,7 @@ public class TestTargetStackFrameIsRegisterBank
public void setPC(Address address) {
changeAttributes(List.of(), Map.of(
PC_ATTRIBUTE_NAME, address //
PC_ATTRIBUTE_NAME, pc = address //
), "PC Updated");
}

View file

@ -281,20 +281,6 @@
<attribute schema="OBJECT" />
</schema>
<schema name="Stack" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="VOID" />
<attribute name="_modified" schema="BOOL" hidden="yes" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_kind" schema="STRING" fixed="yes" hidden="yes" />
<attribute name="_update_mode" schema="UPDATE_MODE" hidden="yes" />
<attribute name="_short_display" schema="STRING" hidden="yes" />
<attribute name="_value" schema="ANY" hidden="yes" />
<attribute name="_type" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute name="Frames" schema="Frames" required="yes" />
<attribute schema="ANY" />
</schema>
<schema name="Frames" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<interface name="Stack" />
<element schema="StackFrame" />
<attribute name="_modified" schema="BOOL" hidden="yes" />
<attribute name="_display" schema="STRING" hidden="yes" />