GP-0: Fix tests

This commit is contained in:
Dan 2022-10-20 13:26:17 -04:00
parent c8ac656430
commit 3aa9d21f10
5 changed files with 48 additions and 36 deletions

View file

@ -469,6 +469,7 @@ public class DebuggerEmulationServicePlugin extends Plugin implements DebuggerEm
if (chosen == null) {
// Must be special or otherwise not discovered. Could happen.
Msg.warn(this, "An undiscovered emulator factory was set via the API: " + factory);
return;
}
chosen.setSelected(true);
}

View file

@ -279,7 +279,7 @@ public abstract class AbstractGhidraHeadedDebuggerGUITest
}
protected static Set<String> getMenuElementsText() {
MenuElement[] sel = MenuSelectionManager.defaultManager().getSelectedPath();
MenuElement[] sel = runSwing(() -> MenuSelectionManager.defaultManager().getSelectedPath());
if (sel == null || sel.length == 0) {
return Set.of();
}
@ -300,7 +300,7 @@ public abstract class AbstractGhidraHeadedDebuggerGUITest
}
protected static MenuElement getSubMenuElementByText(String text) {
MenuElement[] sel = MenuSelectionManager.defaultManager().getSelectedPath();
MenuElement[] sel = runSwing(() -> MenuSelectionManager.defaultManager().getSelectedPath());
if (sel == null || sel.length == 0) {
throw new NoSuchElementException("No menu is active");
}

View file

@ -17,6 +17,7 @@ package ghidra.app.plugin.core.debug.gui.pcode;
import static org.junit.Assert.*;
import java.lang.invoke.MethodHandles;
import java.util.List;
import org.junit.Before;
@ -28,12 +29,12 @@ import ghidra.app.plugin.assembler.Assemblers;
import ghidra.app.plugin.core.debug.gui.AbstractGhidraHeadedDebuggerGUITest;
import ghidra.app.plugin.core.debug.gui.listing.DebuggerListingPlugin;
import ghidra.app.plugin.core.debug.gui.pcode.DebuggerPcodeStepperProvider.PcodeRowHtmlFormatter;
import ghidra.app.plugin.core.debug.service.emulation.DebuggerPcodeMachine;
import ghidra.app.plugin.core.debug.service.emulation.*;
import ghidra.app.plugin.core.debug.service.emulation.data.PcodeDebuggerAccess;
import ghidra.app.plugin.core.debug.service.tracemgr.DebuggerTraceManagerServicePlugin;
import ghidra.app.plugin.processors.sleigh.SleighLanguage;
import ghidra.app.services.DebuggerEmulationService;
import ghidra.app.services.DebuggerTraceManagerService;
import ghidra.pcode.emu.PcodeThread;
import ghidra.pcode.exec.*;
import ghidra.pcode.exec.PcodeExecutorStatePiece.Reason;
import ghidra.pcode.exec.trace.TraceSleighUtils;
@ -57,8 +58,7 @@ public class DebuggerPcodeStepperProviderTest extends AbstractGhidraHeadedDebugg
private Address start;
private TraceThread thread;
private Instruction imm1234;
private Instruction imm2045;
private Instruction imm123;
@Before
public void setUpPcodeStepperProviderTest() throws Exception {
@ -87,12 +87,10 @@ public class DebuggerPcodeStepperProviderTest extends AbstractGhidraHeadedDebugg
Assembler asm = Assemblers.getAssembler(tb.trace.getFixedProgramView(0));
iit = asm.assemble(start,
"imm r0, #0x3d2",
"imm r1, #911"); // 10 bits unsigned
"imm r0, #0x123");
}
imm1234 = iit.next();
imm2045 = iit.next();
imm123 = iit.next();
}
protected void assertEmpty() {
@ -137,40 +135,39 @@ public class DebuggerPcodeStepperProviderTest extends AbstractGhidraHeadedDebugg
public void testCustomUseropDisplay() throws Exception {
populateTrace();
emuService.setEmulatorFactory(new BytesDebuggerPcodeEmulatorFactory() {
@Override
public DebuggerPcodeMachine<?> create(PcodeDebuggerAccess access) {
BytesDebuggerPcodeEmulator emu = new BytesDebuggerPcodeEmulator(access) {
@Override
protected PcodeUseropLibrary<byte[]> createUseropLibrary() {
return new AnnotatedPcodeUseropLibrary<byte[]>() {
@Override
protected MethodHandles.Lookup getMethodLookup() {
return MethodHandles.lookup();
}
@PcodeUserop
public void stepper_test_userop() {
}
};
}
};
emu.inject(imm123.getAddress(), "stepper_test_userop();");
return emu;
}
});
// Just one p-code step to load injection (decode step)
TraceSchedule schedule1 = TraceSchedule.parse("0:.t0-1");
traceManager.openTrace(tb.trace);
traceManager.activateThread(thread);
traceManager.activateTime(schedule1);
waitForPass(() -> assertEquals(schedule1, pcodeProvider.current.getTime()));
// P-code step to decode already done. One for each op. One to retire.
TraceSchedule schedule2 =
schedule1.steppedPcodeForward(thread, imm1234.getPcode().length + 1);
traceManager.activateTime(schedule2);
waitForPass(() -> assertEquals(schedule2, pcodeProvider.current.getTime()));
DebuggerPcodeMachine<?> emu =
waitForValue(() -> emuService.getCachedEmulator(tb.trace, schedule2));
assertNotNull(emu);
PcodeThread<?> et = emu.getThread(thread.getPath(), false);
waitForPass(() -> assertNull(et.getFrame()));
/**
* NB. at the moment, there is no API to customize the service's emulator. In the meantime,
* the vanilla PcodeThread does inject a custom library for breakpoints, so we'll use that
* as our "custom userop" test case. It might also be nice if the emulator service placed
* breakpoints, no?
*/
emu.addBreakpoint(imm2045.getAddress(), "1:1");
// Just one p-code step to decode
TraceSchedule schedule3 = schedule2.steppedPcodeForward(thread, 1);
traceManager.activateTime(schedule3);
waitForPass(() -> assertEquals(schedule3, pcodeProvider.current.getTime()));
waitForPass(() -> assertTrue(pcodeProvider.pcodeTableModel.getModelData()
.stream()
.anyMatch(r -> r.getCode().contains("emu_swi"))));
.anyMatch(r -> r.getCode().contains("stepper_test_userop"))));
}
protected List<PcodeRow> format(String sleigh) {