Merge remote-tracking branch 'origin/GP-0_Dan_fixTests-2026-07-02-1'

This commit is contained in:
Ryan Kurtz
2026-07-02 13:21:46 -04:00
12 changed files with 137 additions and 81 deletions

View File

@@ -762,17 +762,15 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin
*/
for (Set<LogicalBreakpointInternal> set : List.copyOf(logicalByAddress.values())) {
for (LogicalBreakpointInternal lb : Set.copyOf(set)) {
Bookmark pb = lb.getProgramBookmark();
if (pb == null) {
continue;
}
if (pb != program.getBookmarkManager().getBookmark(pb.getId())) {
forgetProgramBreakpoint(r, pb, false);
continue;
}
if (!lb.getProgramLocation().getByteAddress().equals(pb.getAddress())) {
forgetProgramBreakpoint(r, pb, false);
continue;
for (Bookmark pb : lb.getProgramBookmarksValidOrNot()) {
if (pb != program.getBookmarkManager().getBookmark(pb.getId())) {
forgetProgramBreakpoint(r, pb, false);
continue;
}
if (!lb.getProgramLocation().getByteAddress().equals(pb.getAddress())) {
forgetProgramBreakpoint(r, pb, false);
continue;
}
}
}
}

View File

@@ -15,6 +15,8 @@
*/
package ghidra.app.plugin.core.debug.service.breakpoint;
import java.util.List;
import ghidra.debug.api.breakpoint.LogicalBreakpoint;
import ghidra.debug.api.target.Target;
import ghidra.program.model.address.Address;
@@ -24,6 +26,17 @@ import ghidra.trace.model.Trace;
import ghidra.trace.model.breakpoint.TraceBreakpointLocation;
public interface LogicalBreakpointInternal extends LogicalBreakpoint {
/**
* Get any or both of the enabled and disabled program bookmarks for this breakpoint, even if
* they are no longer valid.
* <p>
* This is needed to clean up logical breakpoints when the bookmark becomes invalid
*
* @return the bookmarks
*/
List<Bookmark> getProgramBookmarksValidOrNot();
/**
* Set the expected address for trace breakpoints in the given trace
*

View File

@@ -75,6 +75,11 @@ public class LoneLogicalBreakpoint implements LogicalBreakpointInternal {
return null;
}
@Override
public List<Bookmark> getProgramBookmarksValidOrNot() {
return List.of();
}
@Override
public String getName() {
return "";

View File

@@ -269,6 +269,11 @@ public class MappedLogicalBreakpoint implements LogicalBreakpointInternal {
return progBreak.getBookmark();
}
@Override
public List<Bookmark> getProgramBookmarksValidOrNot() {
return progBreak.getBookmarksValidOrNot();
}
@Override
public String getName() {
return progBreak.getName();

View File

@@ -428,6 +428,19 @@ public class ProgramBreakpoint {
return null;
}
public List<Bookmark> getBookmarksValidOrNot() {
Bookmark eBookmark = this.eBookmark;
Bookmark dBookmark = this.dBookmark;
List<Bookmark> result = new ArrayList<>();
if (eBookmark != null) {
result.add(eBookmark);
}
if (dBookmark != null) {
result.add(dBookmark);
}
return result;
}
protected String getComment() {
Bookmark bookmark = getBookmark();
return bookmark == null ? computeComment() : bookmark.getComment();

View File

@@ -151,11 +151,12 @@ public enum DebuggerEmulationIntegration {
}
@Override
public AddressSetView readUninitialized(PcodeTraceDataAccess acc, PcodeThread<?> thread,
PcodeExecutorStatePiece<byte[], byte[]> piece, AddressSetView set) {
public AddressSetView readUninitialized(Writer writer, PcodeTraceDataAccess acc,
PcodeThread<?> thread, PcodeExecutorStatePiece<byte[], byte[]> piece,
AddressSetView set) {
AddressSetView unknown = set.subtract(acc.intersectViewKnown(set, false));
if (unknown.isEmpty()) {
return super.readUninitialized(acc, thread, piece, set);
return super.readUninitialized(writer, acc, thread, piece, set);
}
if (acc instanceof PcodeDebuggerRegistersAccess regsAcc) {
if (regsAcc.isLive()) {
@@ -165,13 +166,13 @@ public enum DebuggerEmulationIntegration {
* Pass `set` to super, because even if regsAcc has just read from target into
* trace, we have yet to read from trace into state piece.
*/
return super.readUninitialized(acc, thread, piece, set);
return super.readUninitialized(writer, acc, thread, piece, set);
}
if (acc instanceof PcodeDebuggerMemoryAccess memAcc) {
if (memAcc.isLive() && waitTimeout(memAcc.readFromTargetMemory(unknown))) {
unknown = set.subtract(memAcc.intersectViewKnown(set, false));
if (unknown.isEmpty()) {
return super.readUninitialized(acc, thread, piece, set);
return super.readUninitialized(writer, acc, thread, piece, set);
}
}
unknown = unknown.subtract(memAcc.intersectViewKnown(unknown, true));
@@ -183,13 +184,14 @@ public enum DebuggerEmulationIntegration {
*/
AddressSetView readFromStatic = unknown.subtract(remains);
AddressSetView toReadFromTraceToPiece = set.subtract(readFromStatic);
return super.readUninitialized(memAcc, thread, piece, toReadFromTraceToPiece);
return super.readUninitialized(writer, memAcc, thread, piece,
toReadFromTraceToPiece);
}
throw new AssertionError();
}
@Override
public boolean dataWritten(PcodeTraceDataAccess acc, AddressSet written,
public boolean dataWritten(Writer writer, PcodeTraceDataAccess acc, AddressSet written,
PcodeThread<?> thread, PcodeExecutorStatePiece<byte[], byte[]> piece,
Address address, int length, byte[] value) {
if (!mode.isWriteTarget()) {

View File

@@ -519,10 +519,11 @@ public class DebuggerEmulationServicePlugin extends Plugin implements DebuggerEm
private boolean emulateFunctionEnabled(ProgramLocationActionContext ctx) {
Program program = ctx.getProgram();
if (program == null || program instanceof TraceProgramView) {
Address address = ctx.getAddress();
if (program == null || program instanceof TraceProgramView || address == null) {
return false;
}
Function function = program.getFunctionManager().getFunctionContaining(ctx.getAddress());
Function function = program.getFunctionManager().getFunctionContaining(address);
if (function == null) {
return false;
}
@@ -531,10 +532,11 @@ public class DebuggerEmulationServicePlugin extends Plugin implements DebuggerEm
private void emulateFunctionActivated(ProgramLocationActionContext ctx) {
Program program = ctx.getProgram();
if (program == null) {
Address address = ctx.getAddress();
if (program == null || address == null) {
return;
}
Function function = program.getFunctionManager().getFunctionContaining(ctx.getAddress());
Function function = program.getFunctionManager().getFunctionContaining(address);
if (function == null) {
return;
}

View File

@@ -32,6 +32,7 @@ import docking.widgets.tree.GTree;
import docking.widgets.tree.GTreeNode;
import docking.widgets.tree.support.GTreeSelectionEvent.EventOrigin;
import generic.Unique;
import generic.test.rule.Repeated;
import ghidra.app.plugin.core.debug.gui.AbstractGhidraHeadedDebuggerTest;
import ghidra.app.plugin.core.debug.gui.model.ObjectTableModel.PrimitiveRow;
import ghidra.app.plugin.core.debug.gui.model.ObjectTableModel.ValueRow;
@@ -1076,7 +1077,7 @@ public class DebuggerModelProviderTest extends AbstractGhidraHeadedDebuggerTest
traceManager.activateSnap(1);
waitForSwing();
modelProvider.setPath(threadsPath);
runSwing(() -> modelProvider.setPath(threadsPath));
waitForTasks();
// Testing 1 then 0, because 0 is default

View File

@@ -225,6 +225,7 @@ public enum TraceEmulationIntegration {
/**
* An uninitialized portion of a state piece is being read (concrete addressing).
*
* @param writer the writer
* @param acc the trace access shim for the relevant state (shared or local)
* @param thread the thread, if applicable. This is null if either the state being accessed
* is the emulator's shared state, or if the state is bound to a plain
@@ -235,12 +236,13 @@ public enum TraceEmulationIntegration {
* @see PcodeEmulationCallbacks#readUninitialized(PcodeThread, PcodeExecutorStatePiece,
* AddressSetView, Reason)
*/
AddressSetView readUninitialized(PcodeTraceDataAccess acc, PcodeThread<?> thread,
PcodeExecutorStatePiece<A, T> piece, AddressSetView set);
AddressSetView readUninitialized(Writer writer, PcodeTraceDataAccess acc,
PcodeThread<?> thread, PcodeExecutorStatePiece<A, T> piece, AddressSetView set);
/**
* An uninitialized portion of a state piece is being read (abstract addressing).
*
* @param writer the writer
* @param acc the trace access shim for the relevant state (shared or local)
* @param thread the thread, if applicable. This is null if either the state being accessed
* is the emulator's shared state, or if the state is bound to a plain
@@ -254,15 +256,16 @@ public enum TraceEmulationIntegration {
* @see PcodeEmulationCallbacks#readUninitialized(PcodeThread, PcodeExecutorStatePiece,
* AddressSpace, Object, int, Reason)
*/
default int abstractReadUninit(PcodeTraceDataAccess acc, PcodeThread<?> thread,
PcodeExecutorStatePiece<A, T> piece, AddressSpace space, A offset, int length,
Reason reason) {
default int abstractReadUninit(Writer writer, PcodeTraceDataAccess acc,
PcodeThread<?> thread, PcodeExecutorStatePiece<A, T> piece, AddressSpace space,
A offset, int length, Reason reason) {
return 0;
}
/**
* Data was written (concrete addressing).
*
* @param writer the writer
* @param acc the trace access shim for the relevant state (shared or local)
* @param written the {@link Writer}'s current log of written addresses (mutable).
* Typically, this is not accessed but rather passed to delegate methods.
@@ -277,7 +280,7 @@ public enum TraceEmulationIntegration {
* @see PcodeEmulationCallbacks#dataWritten(PcodeThread, PcodeExecutorStatePiece, Address,
* int, Object)
*/
default boolean dataWritten(PcodeTraceDataAccess acc, AddressSet written,
default boolean dataWritten(Writer writer, PcodeTraceDataAccess acc, AddressSet written,
PcodeThread<?> thread, PcodeExecutorStatePiece<A, T> piece, Address address,
int length, T value) {
return false;
@@ -286,6 +289,7 @@ public enum TraceEmulationIntegration {
/**
* Data was written (abstract addressing).
*
* @param writer the writer
* @param acc the trace access shim for the relevant state (shared or local)
* @param written the {@link Writer}'s current log of written addresses (mutable).
* Typically, this is not accessed but rather passed to delegate methods.
@@ -300,7 +304,7 @@ public enum TraceEmulationIntegration {
* @see PcodeEmulationCallbacks#dataWritten(PcodeThread, PcodeExecutorStatePiece,
* AddressSpace, Object, int, Object)
*/
default void abstractWritten(PcodeTraceDataAccess acc, AddressSet written,
default void abstractWritten(Writer writer, PcodeTraceDataAccess acc, AddressSet written,
PcodeThread<?> thread, PcodeExecutorStatePiece<A, T> piece, AddressSpace space,
A offset, int length, T value) {
}
@@ -344,8 +348,9 @@ public enum TraceEmulationIntegration {
}
@Override
public AddressSetView readUninitialized(PcodeTraceDataAccess acc, PcodeThread<?> thread,
PcodeExecutorStatePiece<Void, Void> piece, AddressSetView set) {
public AddressSetView readUninitialized(Writer writer, PcodeTraceDataAccess acc,
PcodeThread<?> thread, PcodeExecutorStatePiece<Void, Void> piece,
AddressSetView set) {
return set;
}
@@ -376,8 +381,9 @@ public enum TraceEmulationIntegration {
}
@Override
public AddressSetView readUninitialized(PcodeTraceDataAccess acc, PcodeThread<?> thread,
PcodeExecutorStatePiece<byte[], byte[]> piece, AddressSetView set) {
public AddressSetView readUninitialized(Writer writer, PcodeTraceDataAccess acc,
PcodeThread<?> thread, PcodeExecutorStatePiece<byte[], byte[]> piece,
AddressSetView set) {
// NOTE: For simplicity, read without regard to gaps
// NOTE: We cannot write those gaps, though!!!
AddressSetView knownButUninit = acc.intersectViewKnown(set, true);
@@ -431,7 +437,7 @@ public enum TraceEmulationIntegration {
*/
public static class ImmediateBytesPieceHandler extends BytesPieceHandler {
@Override
public boolean dataWritten(PcodeTraceDataAccess acc, AddressSet written,
public boolean dataWritten(Writer writer, PcodeTraceDataAccess acc, AddressSet written,
PcodeThread<?> thread, PcodeExecutorStatePiece<byte[], byte[]> piece,
Address address, int length, byte[] value) {
if (address.isUniqueAddress()) {
@@ -515,8 +521,8 @@ public enum TraceEmulationIntegration {
T value);
@Override
public AddressSetView readUninitialized(PcodeTraceDataAccess acc, PcodeThread<?> thread,
PcodeExecutorStatePiece<A, T> piece, AddressSetView set) {
public AddressSetView readUninitialized(Writer writer, PcodeTraceDataAccess acc,
PcodeThread<?> thread, PcodeExecutorStatePiece<A, T> piece, AddressSetView set) {
PcodeTracePropertyAccess<P> property =
acc.getPropertyAccess(getPropertyName(), getPropertyType());
AddressSet remains = new AddressSet(set);
@@ -551,9 +557,9 @@ public enum TraceEmulationIntegration {
* all of the abstract states.
*/
@Override
public int abstractReadUninit(PcodeTraceDataAccess acc, PcodeThread<?> thread,
PcodeExecutorStatePiece<A, T> piece, AddressSpace space, A offset, int length,
Reason reason) {
public int abstractReadUninit(Writer writer, PcodeTraceDataAccess acc,
PcodeThread<?> thread, PcodeExecutorStatePiece<A, T> piece, AddressSpace space,
A offset, int length, Reason reason) {
throw new UnsupportedOperationException();
}
@@ -563,7 +569,7 @@ public enum TraceEmulationIntegration {
* This method handles serializing the concrete portion and associating the states to their
* respective addresses in the property. Handlers needing to serialize abstracts portions
* must both implement the means of tracking what has been written (see
* {@link #abstractWritten(PcodeTraceDataAccess, AddressSet, PcodeThread, PcodeExecutorStatePiece, AddressSpace, Object, int, Object)}),
* {@link #abstractWritten(Writer, PcodeTraceDataAccess, AddressSet, PcodeThread, PcodeExecutorStatePiece, AddressSpace, Object, int, Object)}),
* and the placement of that state information into the property. The latter is accomplished
* by overriding this method, taking care to invoke the super method for the concrete
* portion.
@@ -599,7 +605,7 @@ public enum TraceEmulationIntegration {
}
@Override
public void abstractWritten(PcodeTraceDataAccess acc, AddressSet written,
public void abstractWritten(Writer writer, PcodeTraceDataAccess acc, AddressSet written,
PcodeThread<?> thread, PcodeExecutorStatePiece<A, T> piece, AddressSpace space,
A offset, int length, T value) {
throw new UnsupportedOperationException();
@@ -738,19 +744,26 @@ public enum TraceEmulationIntegration {
protected PcodeTraceDataAccess getDataAccess(PcodeTraceAccess access, AddressSpace space,
PcodeThread<?> thread) {
return space.isRegisterSpace()
? access.getDataForLocalState(thread, 0)
: access.getDataForSharedState();
if (space.isRegisterSpace()) {
return access.getDataForLocalState(thread, 0);
}
if (space.isMemorySpace()) {
return access.getDataForSharedState();
}
return null; // e.g., unique, constant
}
@Override
public <B, U> void dataWritten(PcodeThread<Object> thread,
PcodeExecutorStatePiece<B, U> piece, Address address, int length, U value) {
PcodeTraceDataAccess acc = getDataAccess(access, address.getAddressSpace(), thread);
if (acc == null) {
return;
}
PieceInfo info =
pieces.computeIfAbsent(piece, p -> new PieceInfo(thread, new AddressSet()));
if (handlerFor(piece).dataWritten(acc, info.written, thread, piece, address, length,
value)) {
pieces.computeIfAbsent(piece, _ -> new PieceInfo(thread, new AddressSet()));
if (handlerFor(piece).dataWritten(this, acc, info.written, thread, piece, address,
length, value)) {
return;
}
if (length == 0) {
@@ -772,9 +785,12 @@ public enum TraceEmulationIntegration {
PcodeExecutorStatePiece<B, U> piece, AddressSpace space, B offset, int length,
U value) {
PcodeTraceDataAccess acc = getDataAccess(access, space, thread);
if (acc == null) {
return;
}
PieceInfo info =
pieces.computeIfAbsent(piece, p -> new PieceInfo(thread, new AddressSet()));
handlerFor(piece).abstractWritten(acc, info.written, thread, piece, space, offset,
pieces.computeIfAbsent(piece, _ -> new PieceInfo(thread, new AddressSet()));
handlerFor(piece).abstractWritten(this, acc, info.written, thread, piece, space, offset,
length, value);
}
@@ -783,8 +799,8 @@ public enum TraceEmulationIntegration {
PcodeExecutorStatePiece<B, U> piece, AddressSpace space, B offset, int length,
Reason reason) {
PcodeTraceDataAccess acc = getDataAccess(access, space, thread);
return handlerFor(piece).abstractReadUninit(acc, thread, piece, space, offset, length,
reason);
return handlerFor(piece).abstractReadUninit(this, acc, thread, piece, space, offset,
length, reason);
}
@Override
@@ -798,7 +814,7 @@ public enum TraceEmulationIntegration {
return set;
}
PcodeTraceDataAccess acc = getDataAccess(access, space, thread);
return handlerFor(piece).readUninitialized(acc, thread, piece, set);
return handlerFor(piece).readUninitialized(this, acc, thread, piece, set);
}
}
}

View File

@@ -25,8 +25,7 @@ import ghidra.pcode.exec.ConcretionError;
import ghidra.pcode.exec.PcodeArithmetic.Purpose;
import ghidra.pcode.exec.PcodeExecutorStatePiece;
import ghidra.pcode.exec.PcodeExecutorStatePiece.Reason;
import ghidra.pcode.exec.trace.TraceEmulationIntegration.AbstractPropertyBasedPieceHandler;
import ghidra.pcode.exec.trace.TraceEmulationIntegration.TraceWriter;
import ghidra.pcode.exec.trace.TraceEmulationIntegration.*;
import ghidra.pcode.exec.trace.data.*;
import ghidra.program.model.address.*;
import ghidra.symz3.model.SymValueZ3;
@@ -68,21 +67,23 @@ public class SymZ3PieceHandler
}
@Override
public void abstractWritten(PcodeTraceDataAccess acc, AddressSet written, PcodeThread<?> thread,
PcodeExecutorStatePiece<SymValueZ3, SymValueZ3> piece, AddressSpace space,
SymValueZ3 offset, int length, SymValueZ3 value) {
public void abstractWritten(Writer writer, PcodeTraceDataAccess acc, AddressSet written,
PcodeThread<?> thread, PcodeExecutorStatePiece<SymValueZ3, SymValueZ3> piece,
AddressSpace space, SymValueZ3 offset, int length, SymValueZ3 value) {
try {
@SuppressWarnings("unchecked")
PcodeThread<Object> cast = (PcodeThread<Object>) thread;
Address address = piece.getAddressArithmetic().toAddress(offset, space, Purpose.STORE);
dataWritten(acc, written, thread, piece, address, length, value);
writer.dataWritten(cast, piece, address, length, value);
}
catch (ConcretionError e) {
abstractWritten.computeIfAbsent(thread, t -> new HashSet<>())
abstractWritten.computeIfAbsent(thread, _ -> new HashSet<>())
.add(new SymZ3Varnode(space, offset, length));
}
}
@Override
public int abstractReadUninit(PcodeTraceDataAccess acc, PcodeThread<?> thread,
public int abstractReadUninit(Writer writer, PcodeTraceDataAccess acc, PcodeThread<?> thread,
PcodeExecutorStatePiece<SymValueZ3, SymValueZ3> piece, AddressSpace space,
SymValueZ3 offset, int length, Reason reason) {
String string = acc.getPropertyAccess(NAME, String.class).get(Address.NO_ADDRESS);

View File

@@ -16,8 +16,8 @@
package agent.lldb.rmi;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.*;
import static org.junit.Assume.*;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeFalse;
import java.nio.file.Path;
import java.util.List;

View File

@@ -111,8 +111,8 @@ public class DebuggerCopyActionsPluginTest extends AbstractGhidraHeadedDebuggerI
performEnabledAction(copyActionsPlugin.actionCopyIntoCurrentProgram);
DebuggerCopyIntoProgramDialog dialog =
waitForDialogComponent(DebuggerCopyIntoProgramDialog.class);
dialog.setRelocate(false);
dialog.reset();
runSwing(() -> dialog.setRelocate(false));
runSwing(() -> dialog.reset());
RangeEntry entry = Unique.assertOne(dialog.tableModel.getModelData());
@@ -121,7 +121,7 @@ public class DebuggerCopyActionsPluginTest extends AbstractGhidraHeadedDebuggerI
assertEquals(".text", entry.getRegionName());
assertEquals(".text", entry.getBlockName());
assertTrue(entry.isCreate());
dialog.okCallback();
runSwing(() -> dialog.okCallback());
waitOn(dialog.lastTask);
waitForSwing();
@@ -175,8 +175,8 @@ public class DebuggerCopyActionsPluginTest extends AbstractGhidraHeadedDebuggerI
performEnabledAction(copyActionsPlugin.actionCopyIntoCurrentProgram);
DebuggerCopyIntoProgramDialog dialog =
waitForDialogComponent(DebuggerCopyIntoProgramDialog.class);
dialog.setRelocate(false);
dialog.reset();
runSwing(() -> dialog.setRelocate(false));
runSwing(() -> dialog.reset());
List<RangeEntry> entries = List.copyOf(dialog.tableModel.getModelData());
assertEquals(3, entries.size());
@@ -203,7 +203,7 @@ public class DebuggerCopyActionsPluginTest extends AbstractGhidraHeadedDebuggerI
assertEquals(".straddle", entry.getBlockName());
assertTrue(entry.isCreate());
dialog.okCallback();
runSwing(() -> dialog.okCallback());
waitOn(dialog.lastTask);
waitForSwing();
@@ -257,8 +257,8 @@ public class DebuggerCopyActionsPluginTest extends AbstractGhidraHeadedDebuggerI
performEnabledAction(copyActionsPlugin.actionCopyIntoCurrentProgram);
DebuggerCopyIntoProgramDialog dialog =
waitForDialogComponent(DebuggerCopyIntoProgramDialog.class);
dialog.setRelocate(true);
dialog.reset();
runSwing(() -> dialog.setRelocate(true));
runSwing(() -> dialog.reset());
RangeEntry entry = Unique.assertOne(dialog.tableModel.getModelData());
@@ -267,7 +267,7 @@ public class DebuggerCopyActionsPluginTest extends AbstractGhidraHeadedDebuggerI
assertEquals(".text", entry.getRegionName());
assertEquals(".text *", entry.getBlockName());
assertFalse(entry.isCreate());
dialog.okCallback();
runSwing(() -> dialog.okCallback());
waitOn(dialog.lastTask);
waitForSwing();
@@ -320,9 +320,9 @@ public class DebuggerCopyActionsPluginTest extends AbstractGhidraHeadedDebuggerI
performEnabledAction(copyActionsPlugin.actionCopyIntoCurrentProgram);
DebuggerCopyIntoProgramDialog dialog =
waitForDialogComponent(DebuggerCopyIntoProgramDialog.class);
dialog.setRelocate(true);
dialog.setUseOverlays(true);
dialog.reset();
runSwing(() -> dialog.setRelocate(true));
runSwing(() -> dialog.setUseOverlays(true));
runSwing(() -> dialog.reset());
RangeEntry entry = Unique.assertOne(dialog.tableModel.getModelData());
@@ -331,7 +331,7 @@ public class DebuggerCopyActionsPluginTest extends AbstractGhidraHeadedDebuggerI
assertEquals(".text", entry.getRegionName());
assertEquals(".text_2", entry.getBlockName());
assertTrue(entry.isCreate());
dialog.okCallback();
runSwing(() -> dialog.okCallback());
waitOn(dialog.lastTask);
waitForSwing();
@@ -361,7 +361,7 @@ public class DebuggerCopyActionsPluginTest extends AbstractGhidraHeadedDebuggerI
performEnabledAction(copyActionsPlugin.actionCopyIntoNewProgram);
DebuggerCopyIntoProgramDialog dialog =
waitForDialogComponent(DebuggerCopyIntoProgramDialog.class);
dialog.setDestination(DebuggerCopyIntoProgramDialog.TEMP_PROGRAM);
runSwing(() -> dialog.setDestination(DebuggerCopyIntoProgramDialog.TEMP_PROGRAM));
RangeEntry entry = Unique.assertOne(dialog.tableModel.getModelData());
@@ -371,7 +371,7 @@ public class DebuggerCopyActionsPluginTest extends AbstractGhidraHeadedDebuggerI
assertEquals(".text", entry.getBlockName());
assertTrue(entry.isCreate());
entry.setBlockName(".my_text");
dialog.okCallback();
runSwing(() -> dialog.okCallback());
waitOn(dialog.lastTask);
waitForSwing();
@@ -409,7 +409,7 @@ public class DebuggerCopyActionsPluginTest extends AbstractGhidraHeadedDebuggerI
waitForDialogComponent(DebuggerCopyIntoProgramDialog.class);
assertFalse(dialog.cbCapture.isEnabled());
assertFalse(dialog.cbCapture.isSelected());
dialog.setDestination(DebuggerCopyIntoProgramDialog.TEMP_PROGRAM);
runSwing(() -> dialog.setDestination(DebuggerCopyIntoProgramDialog.TEMP_PROGRAM));
assertEquals(2, dialog.tableModel.getRowCount());
RangeEntry entry;
@@ -428,7 +428,7 @@ public class DebuggerCopyActionsPluginTest extends AbstractGhidraHeadedDebuggerI
assertEquals(".data", entry.getBlockName());
assertTrue(entry.isCreate());
dialog.okCallback();
runSwing(() -> dialog.okCallback());
waitOn(dialog.lastTask);
waitForSwing();
@@ -468,7 +468,7 @@ public class DebuggerCopyActionsPluginTest extends AbstractGhidraHeadedDebuggerI
waitForDialogComponent(DebuggerCopyIntoProgramDialog.class);
assertTrue(dialog.cbCapture.isEnabled());
assertTrue(dialog.cbCapture.isSelected());
dialog.setDestination(DebuggerCopyIntoProgramDialog.TEMP_PROGRAM);
runSwing(() -> dialog.setDestination(DebuggerCopyIntoProgramDialog.TEMP_PROGRAM));
RangeEntry entry = Unique.assertOne(dialog.tableModel.getModelData());