protected void runTestRmiTargetStepAction(Supplier<DockingAction> actionSupplier,
			Supplier<TestRemoteMethod> methodSupplier) throws Throwable {
		setUpRmiTarget(); // method is created here, so we accept a supplier
		TraceObject thread1 = tb.obj("Processes[1].Threads[1]");
		traceManager.activateObject(thread1);
		waitForSwing();

		DockingAction action = actionSupplier.get();
		assertInTool(action);
		performEnabledAction(null, action, true);

		TestRemoteMethod method = methodSupplier.get();
		// NB. Provide a result before asserting
		Map<String, Object> args = method.expect();
		// No state change, or brief state change
		method.result(null);
		assertEquals(Map.ofEntries(
			Map.entry("thread", thread1)),
			args);
		waitForTasks();
		waitForDomainObject(tb.trace);

		assertTrue(action.isEnabled());
	}
Tests for target control and state editing

<p>
In these and other control service integration tests, we use {@link ControlMode#RW_EMULATOR} as a
stand-in for any mode. We also use {@link ControlMode#RO_TARGET} just to verify the mode is
heeded. Other modes may be tested if bugs crop up in various combinations.
Ghidra/Test/DebuggerIntegrationTest/src/test/java/ghidra/app/plugin/core/debug/gui/control/DebuggerControlPluginTest.java