@Test // Mappings are not write-behind cached
	public void testAbortAddMapping() throws Throwable {
		createTarget1();
		Trace trace = getTrace(target1);
		traceManager.openTrace(trace);

		createProgramFromTrace(trace);
		intoProject(program);
		programManager.openProgram(program);

		addProgramTextBlock(program);
		MR text = addTargetTextRegion(target1);
		addTargetSoftwareBreakpoint(target1, text);
		waitOn(mappingService.changesSettled());
		waitOn(breakpointService.changesSettled());

		assertLogicalBreakpointForLoneSoftwareBreakpoint(trace, 1);
		/**
		 * NB. The target could still be mid transaction. If we open this transaction too soon, then
		 * the breakpoint gets aborted as well.
		 */
		waitForLock(trace);
		waitForDomainObject(trace);
		changeListener.assertAgreesWithService();

		try (Transaction tx = trace.openTransaction("Will abort")) {
			addTextMapping(target1, text, program);
			waitOn(mappingService.changesSettled());
			waitOn(breakpointService.changesSettled());

			// Sanity
			assertLogicalBreakpointForMappedSoftwareBreakpoint(trace);

			tx.abort();
		}
		waitForDomainObject(trace);
		waitOn(mappingService.changesSettled());
		waitOn(breakpointService.changesSettled());

		// NB. The bookmark is left over, so total increases
		assertLogicalBreakpointForLoneSoftwareBreakpoint(trace, 2);
	}
NB. Relying on terminate to auto-close is causing some timing issue I don't yet
understand. So, I close it in the test code.
Ghidra/Test/DebuggerIntegrationTest/src/test/java/ghidra/app/plugin/core/debug/service/breakpoint/AbstractDebuggerLogicalBreakpointServiceTest.java