@After
	public void tearDownBreakpointServiceTest() throws Throwable {
		Msg.debug(this, "Tearing down");
		try {
			waitForProgram(program);

			assertServiceAgreesWithOpenProgramsAndTraces();
			changeListener.assertAgreesWithService();
			if (target1 != null && isTargetValid(target1)) {
				waitForLock(getTrace(target1));
				terminateTarget(target1);
			}
			if (target3 != null && isTargetValid(target3)) {
				waitForLock(getTrace(target3));
				terminateTarget(target3);
			}
		}
		catch (Throwable t) {
			Msg.error(this, "Failed during tear down: " + t);
			throw t;
		}
	}
Tracks the current set of logical breakpoints.

<p>
Its assertions require perfection in the sequence of events: 1) No double-adds. 2) No
double-removes. 3) No extraneous updates. At the end of each test, the current set of
breakpoints in this listener should be verified against those reported by the service.
Ghidra/Test/DebuggerIntegrationTest/src/test/java/ghidra/app/plugin/core/debug/service/breakpoint/AbstractDebuggerLogicalBreakpointServiceTest.java