Merge remote-tracking branch 'origin/GP-0_Dan_fixTests-2025-07-24-1' into patch

This commit is contained in:
Ryan Kurtz 2025-07-24 12:13:04 -04:00
commit 62946ffde9
4 changed files with 66 additions and 25 deletions

View file

@ -26,6 +26,7 @@ import ghidra.debug.api.target.TargetPublicationListener;
import ghidra.debug.api.tracemgr.DebuggerCoordinates; import ghidra.debug.api.tracemgr.DebuggerCoordinates;
import ghidra.debug.api.tracermi.*; import ghidra.debug.api.tracermi.*;
import ghidra.util.Msg; import ghidra.util.Msg;
import ghidra.util.Swing;
public class TraceRmiServiceNode extends AbstractTraceRmiManagerNode public class TraceRmiServiceNode extends AbstractTraceRmiManagerNode
implements TraceRmiServiceListener, TargetPublicationListener { implements TraceRmiServiceListener, TargetPublicationListener {
@ -107,46 +108,60 @@ public class TraceRmiServiceNode extends AbstractTraceRmiManagerNode
@Override @Override
public void serverStarted(SocketAddress address) { public void serverStarted(SocketAddress address) {
serverNode.fireNodeChanged(); Swing.runIfSwingOrRunLater(() -> {
provider.contextChanged(); serverNode.fireNodeChanged();
provider.contextChanged();
});
} }
@Override @Override
public void serverStopped() { public void serverStopped() {
serverNode.fireNodeChanged(); Swing.runIfSwingOrRunLater(() -> {
provider.contextChanged(); serverNode.fireNodeChanged();
provider.contextChanged();
});
} }
@Override @Override
public void connected(TraceRmiConnection connection, ConnectMode mode, public void connected(TraceRmiConnection connection, ConnectMode mode,
TraceRmiAcceptor acceptor) { TraceRmiAcceptor acceptor) {
addConnectionNode(connection); Swing.runIfSwingOrRunLater(() -> {
removeAcceptorNode(acceptor); addConnectionNode(connection);
provider.contextChanged(); removeAcceptorNode(acceptor);
provider.contextChanged();
});
} }
@Override @Override
public void disconnected(TraceRmiConnection connection) { public void disconnected(TraceRmiConnection connection) {
removeConnectionNode(connection); Swing.runIfSwingOrRunLater(() -> {
provider.contextChanged(); removeConnectionNode(connection);
provider.contextChanged();
});
} }
@Override @Override
public void waitingAccept(TraceRmiAcceptor acceptor) { public void waitingAccept(TraceRmiAcceptor acceptor) {
addAcceptorNode(acceptor); Swing.runIfSwingOrRunLater(() -> {
provider.contextChanged(); addAcceptorNode(acceptor);
provider.contextChanged();
});
} }
@Override @Override
public void acceptCancelled(TraceRmiAcceptor acceptor) { public void acceptCancelled(TraceRmiAcceptor acceptor) {
removeAcceptorNode(acceptor); Swing.runIfSwingOrRunLater(() -> {
provider.contextChanged(); removeAcceptorNode(acceptor);
provider.contextChanged();
});
} }
@Override @Override
public void acceptFailed(TraceRmiAcceptor acceptor, Exception e) { public void acceptFailed(TraceRmiAcceptor acceptor, Exception e) {
removeAcceptorNode(acceptor); Swing.runIfSwingOrRunLater(() -> {
provider.contextChanged(); removeAcceptorNode(acceptor);
provider.contextChanged();
});
} }
@Override @Override
@ -167,7 +182,7 @@ public class TraceRmiServiceNode extends AbstractTraceRmiManagerNode
synchronized (targetNodes) { synchronized (targetNodes) {
targetNodes.put(target, tNode); targetNodes.put(target, tNode);
} }
provider.contextChanged(); Swing.runIfSwingOrRunLater(() -> provider.contextChanged());
} }
protected static <K> void fireNodeChanged(Map<K, ? extends AbstractTraceRmiManagerNode> map, protected static <K> void fireNodeChanged(Map<K, ? extends AbstractTraceRmiManagerNode> map,
@ -207,8 +222,10 @@ public class TraceRmiServiceNode extends AbstractTraceRmiManagerNode
if (node == null) { if (node == null) {
return; return;
} }
node.getConnectionNode().targetWithdrawn(target); Swing.runIfSwingOrRunLater(() -> {
provider.contextChanged(); node.getConnectionNode().targetWithdrawn(target);
provider.contextChanged();
});
} }
public void coordinates(DebuggerCoordinates coordinates) { public void coordinates(DebuggerCoordinates coordinates) {

View file

@ -45,6 +45,7 @@ import ghidra.debug.api.tracermi.TraceRmiConnection;
import ghidra.trace.model.target.schema.SchemaContext; import ghidra.trace.model.target.schema.SchemaContext;
import ghidra.trace.model.target.schema.TraceObjectSchema.SchemaName; import ghidra.trace.model.target.schema.TraceObjectSchema.SchemaName;
import ghidra.trace.model.target.schema.XmlSchemaContext; import ghidra.trace.model.target.schema.XmlSchemaContext;
import ghidra.util.Swing;
import ghidra.util.exception.CancelledException; import ghidra.util.exception.CancelledException;
public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedDebuggerTest { public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedDebuggerTest {
@ -76,7 +77,9 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD
helper.dismissWithArguments(Map.ofEntries( helper.dismissWithArguments(Map.ofEntries(
helper.entry("address", "localhost"), helper.entry("address", "localhost"),
helper.entry("port", 0))); helper.entry("port", 0)));
waitForPass(() -> Unique.assertOne(traceRmiService.getAllAcceptors())); TraceRmiAcceptor acceptor =
waitForPass(() -> Unique.assertOne(traceRmiService.getAllAcceptors()));
acceptor.cancel();
} }
@Test @Test
@ -129,6 +132,7 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD
public void testActionCloseOnAcceptor() throws Exception { public void testActionCloseOnAcceptor() throws Exception {
TraceRmiAcceptor acceptor = TraceRmiAcceptor acceptor =
traceRmiService.acceptOne(new InetSocketAddress("localhost", 0)); traceRmiService.acceptOne(new InetSocketAddress("localhost", 0));
waitForSwing();
TraceRmiAcceptorNode node = TraceRmiAcceptorNode node =
TraceRmiConnectionTreeHelper.getAcceptorNodeMap(provider.rootNode).get(acceptor); TraceRmiConnectionTreeHelper.getAcceptorNodeMap(provider.rootNode).get(acceptor);
assertNotNull(node); assertNotNull(node);
@ -149,6 +153,7 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD
@Test @Test
public void testActionCloseOnConnection() throws Exception { public void testActionCloseOnConnection() throws Exception {
try (Cx cx = Cx.connect(traceRmiService, "Test client")) { try (Cx cx = Cx.connect(traceRmiService, "Test client")) {
waitForSwing();
TraceRmiConnectionNode node = TraceRmiConnectionNode node =
TraceRmiConnectionTreeHelper.getConnectionNodeMap(provider.rootNode) TraceRmiConnectionTreeHelper.getConnectionNodeMap(provider.rootNode)
.get(cx.connection); .get(cx.connection);
@ -169,6 +174,8 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD
TraceRmiAcceptor acceptor = TraceRmiAcceptor acceptor =
traceRmiService.acceptOne(new InetSocketAddress("localhost", 0)); traceRmiService.acceptOne(new InetSocketAddress("localhost", 0));
try (Cx cx = Cx.connect(traceRmiService, "Test client")) { try (Cx cx = Cx.connect(traceRmiService, "Test client")) {
waitForSwing();
performEnabledAction(provider, provider.actionCloseAll, true); performEnabledAction(provider, provider.actionCloseAll, true);
waitForPass(() -> assertFalse(traceRmiService.isServerStarted())); waitForPass(() -> assertFalse(traceRmiService.isServerStarted()));
@ -209,6 +216,7 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD
public void testAcceptHasNode() throws Exception { public void testAcceptHasNode() throws Exception {
TraceRmiAcceptor acceptor = TraceRmiAcceptor acceptor =
traceRmiService.acceptOne(new InetSocketAddress("localhost", 0)); traceRmiService.acceptOne(new InetSocketAddress("localhost", 0));
waitForSwing();
TraceRmiAcceptorNode node = TraceRmiAcceptorNode node =
TraceRmiConnectionTreeHelper.getAcceptorNodeMap(provider.rootNode).get(acceptor); TraceRmiConnectionTreeHelper.getAcceptorNodeMap(provider.rootNode).get(acceptor);
assertNotNull(node); assertNotNull(node);
@ -219,11 +227,13 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD
public void testAcceptThenCancelNoNode() throws Exception { public void testAcceptThenCancelNoNode() throws Exception {
TraceRmiAcceptor acceptor = TraceRmiAcceptor acceptor =
traceRmiService.acceptOne(new InetSocketAddress("localhost", 0)); traceRmiService.acceptOne(new InetSocketAddress("localhost", 0));
waitForSwing();
assertNotNull( assertNotNull(
TraceRmiConnectionTreeHelper.getAcceptorNodeMap(provider.rootNode).get(acceptor)); TraceRmiConnectionTreeHelper.getAcceptorNodeMap(provider.rootNode).get(acceptor));
acceptor.cancel(); acceptor.cancel();
waitForPass(() -> traceRmiService.getAllAcceptors().isEmpty()); waitForPass(() -> traceRmiService.getAllAcceptors().isEmpty());
waitForSwing();
assertNull( assertNull(
TraceRmiConnectionTreeHelper.getAcceptorNodeMap(provider.rootNode).get(acceptor)); TraceRmiConnectionTreeHelper.getAcceptorNodeMap(provider.rootNode).get(acceptor));
} }
@ -310,6 +320,7 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD
public void testAcceptThenSuccessNodes() throws Exception { public void testAcceptThenSuccessNodes() throws Exception {
TraceRmiAcceptor acceptor = TraceRmiAcceptor acceptor =
traceRmiService.acceptOne(new InetSocketAddress("localhost", 0)); traceRmiService.acceptOne(new InetSocketAddress("localhost", 0));
waitForSwing();
assertNotNull( assertNotNull(
TraceRmiConnectionTreeHelper.getAcceptorNodeMap(provider.rootNode).get(acceptor)); TraceRmiConnectionTreeHelper.getAcceptorNodeMap(provider.rootNode).get(acceptor));
@ -320,6 +331,7 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD
.get(acceptor))); .get(acceptor)));
waitForPass(() -> assertEquals(cx.connection, waitForPass(() -> assertEquals(cx.connection,
Unique.assertOne(traceRmiService.getAllConnections()))); Unique.assertOne(traceRmiService.getAllConnections())));
waitForSwing();
TraceRmiConnectionNode node = TraceRmiConnectionNode node =
TraceRmiConnectionTreeHelper.getConnectionNodeMap(provider.rootNode) TraceRmiConnectionTreeHelper.getConnectionNodeMap(provider.rootNode)
@ -335,6 +347,7 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD
traceRmiService.startServer(); traceRmiService.startServer();
try (Cx cx = Cx.toServer(traceRmiService, "Test client")) { try (Cx cx = Cx.toServer(traceRmiService, "Test client")) {
waitForPass(() -> traceRmiService.getAllAcceptors().isEmpty()); waitForPass(() -> traceRmiService.getAllAcceptors().isEmpty());
waitForSwing();
TraceRmiConnectionNode node = waitForValue( TraceRmiConnectionNode node = waitForValue(
() -> TraceRmiConnectionTreeHelper.getConnectionNodeMap(provider.rootNode) () -> TraceRmiConnectionTreeHelper.getConnectionNodeMap(provider.rootNode)
@ -349,6 +362,7 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD
try (Cx cx = Cx.connect(traceRmiService, "Test client")) { try (Cx cx = Cx.connect(traceRmiService, "Test client")) {
waitForPass(() -> assertEquals(cx.connection, waitForPass(() -> assertEquals(cx.connection,
Unique.assertOne(traceRmiService.getAllConnections()))); Unique.assertOne(traceRmiService.getAllConnections())));
waitForSwing();
TraceRmiConnectionNode node = TraceRmiConnectionNode node =
TraceRmiConnectionTreeHelper.getConnectionNodeMap(provider.rootNode) TraceRmiConnectionTreeHelper.getConnectionNodeMap(provider.rootNode)
@ -364,6 +378,7 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD
TraceRmiAcceptor acceptor = TraceRmiAcceptor acceptor =
traceRmiService.acceptOne(new InetSocketAddress("localhost", 0)); traceRmiService.acceptOne(new InetSocketAddress("localhost", 0));
try (Cx cx = Cx.complete(acceptor, "Test client")) { try (Cx cx = Cx.complete(acceptor, "Test client")) {
waitForSwing();
assertNotNull(TraceRmiConnectionTreeHelper.getConnectionNodeMap(provider.rootNode) assertNotNull(TraceRmiConnectionTreeHelper.getConnectionNodeMap(provider.rootNode)
.get(cx.connection)); .get(cx.connection));
@ -380,6 +395,7 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD
TraceRmiAcceptor acceptor = TraceRmiAcceptor acceptor =
traceRmiService.acceptOne(new InetSocketAddress("localhost", 0)); traceRmiService.acceptOne(new InetSocketAddress("localhost", 0));
try (Cx cx = Cx.complete(acceptor, "Test client")) { try (Cx cx = Cx.complete(acceptor, "Test client")) {
waitForSwing();
assertNotNull(TraceRmiConnectionTreeHelper.getConnectionNodeMap(provider.rootNode) assertNotNull(TraceRmiConnectionTreeHelper.getConnectionNodeMap(provider.rootNode)
.get(cx.connection)); .get(cx.connection));
@ -403,12 +419,13 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD
} }
cx.client.activate(1, ""); cx.client.activate(1, "");
Target target = waitForValue(() -> traceManager.getCurrent().getTarget()); Target target = waitForValue(() -> traceManager.getCurrent().getTarget());
waitForSwing();
TraceRmiTargetNode node = TraceRmiTargetNode node =
TraceRmiConnectionTreeHelper.getTargetNodeMap(provider.rootNode).get(target); TraceRmiConnectionTreeHelper.getTargetNodeMap(provider.rootNode).get(target);
assertEquals("bash (snap=1)", node.getDisplayText()); assertEquals("bash (snap=1)", node.getDisplayText());
provider.tree.setSelectedNode(node); Swing.runNow(() -> provider.tree.setSelectedNode(node));
// Tree uses a task queue for selection requests // Tree uses a task queue for selection requests
waitForPass( waitForPass(
() -> assertEquals(node, Unique.assertOne(provider.tree.getSelectedNodes()))); () -> assertEquals(node, Unique.assertOne(provider.tree.getSelectedNodes())));

View file

@ -27,8 +27,15 @@ import ghidra.framework.plugintool.util.PluginStatus;
import ghidra.trace.model.Trace; import ghidra.trace.model.Trace;
import ghidra.util.datastruct.ListenerSet; import ghidra.util.datastruct.ListenerSet;
@PluginInfo(shortDescription = "Debugger targets manager service", description = "Maintains a collection of published targets and notifies listeners of changes.", category = PluginCategoryNames.DEBUGGER, packageName = DebuggerPluginPackage.NAME, status = PluginStatus.RELEASED, servicesProvided = { @PluginInfo(
DebuggerTargetService.class, }) shortDescription = "Debugger targets manager service",
description = "Maintains a collection of published targets and notifies listeners of changes.",
category = PluginCategoryNames.DEBUGGER,
packageName = DebuggerPluginPackage.NAME,
status = PluginStatus.RELEASED,
servicesProvided = {
DebuggerTargetService.class,
})
public class DebuggerTargetServicePlugin extends Plugin implements DebuggerTargetService { public class DebuggerTargetServicePlugin extends Plugin implements DebuggerTargetService {
public DebuggerTargetServicePlugin(PluginTool tool) { public DebuggerTargetServicePlugin(PluginTool tool) {

View file

@ -44,7 +44,7 @@ public class InvocationDialogHelper<P, D extends AbstractDebuggerParameterDialog
} }
public void dismissWithArguments(Map<String, ValStr<?>> args) { public void dismissWithArguments(Map<String, ValStr<?>> args) {
dialog.setMemorizedArguments(args); runSwing(() -> dialog.setMemorizedArguments(args));
invoke(); invoke();
} }