@Test
	public void testPlaceDisableStepThenEnableTraceOnly() throws Throwable {
		createTarget1();
		Trace trace = getTrace(target1);
		traceManager.openTrace(trace);

		MR text = addTargetTextRegion(target1);

		addTargetSoftwareBreakpoint(target1, text);
		waitOn(breakpointService.changesSettled());

		assertLogicalBreakpointForLoneSoftwareBreakpoint(trace, 1);

		LogicalBreakpoint lb = Unique.assertOne(breakpointService.getAllBreakpoints());

		CompletableFuture<Void> disable = lb.disable();
		handleToggleBreakpointInvocation(target1, Unique.assertOne(lb.getTraceBreakpoints(trace)),
			false);
		waitOn(disable);
		waitForDomainObject(trace);
		waitOn(breakpointService.changesSettled());

		assertEquals(State.INCONSISTENT_DISABLED, lb.computeState());

		// Simulate a step, which should also cause snap advance in target
		long oldSnap = getSnap(target1);
		simulateTargetStep(target1);
		waitForPass(() -> {
			assertEquals(oldSnap + 1, getSnap(target1));
			assertEquals(State.INCONSISTENT_DISABLED, lb.computeState());
		});

		CompletableFuture<Void> enable = lb.enable();
		handleToggleBreakpointInvocation(target1, Unique.assertOne(lb.getTraceBreakpoints(trace)),
			true);
		waitOn(enable);
		waitForDomainObject(trace);
		waitOn(breakpointService.changesSettled());

		assertEquals(State.INCONSISTENT_ENABLED, lb.computeState());
	}
NB. The target could still be mid transaction. If we open this transaction too soon, then
the breakpoint gets aborted as well.
Ghidra/Test/DebuggerIntegrationTest/src/test/java/ghidra/app/plugin/core/debug/service/breakpoint/AbstractDebuggerLogicalBreakpointServiceTest.java