@Test
	public void testTraceBreakpointPopupMenus() throws Throwable {
		T t = addMappedBreakpointOpenAndWait();
		Trace trace = getTrace(t);
		LogicalBreakpoint lb = Unique.assertOne(breakpointService.getAllBreakpoints());
		traceManager.activateTrace(trace);
		waitForSwing();
		waitForPass(
			() -> assertEquals(State.ENABLED, lb.computeStateForTrace(trace)));

		waitForPass(noExc(() -> {
			clickListing(listingPlugin.getListingPanel(), addr(trace, 0x55550123),
				MouseEvent.BUTTON3);
			assertMenu(POPUP_ACTIONS, Set.of(
				AbstractSetBreakpointAction.NAME, AbstractToggleBreakpointAction.NAME,
				AbstractDisableBreakpointAction.NAME, AbstractClearBreakpointAction.NAME));
		}));
		escapePopupMenu();

		waitForPass(() -> {
			lb.disableForProgram(); // Adds "enable", which will only affect bookmark
			waitForDomainObject(program);
			assertEquals(State.INCONSISTENT_ENABLED, lb.computeStateForTrace(trace));
		});

		waitForPass(noExc(() -> {
			clickListing(listingPlugin.getListingPanel(), addr(trace, 0x55550123),
				MouseEvent.BUTTON3);
			assertMenu(POPUP_ACTIONS, Set.of(
				AbstractSetBreakpointAction.NAME, AbstractToggleBreakpointAction.NAME,
				AbstractEnableBreakpointAction.NAME, AbstractDisableBreakpointAction.NAME,
				AbstractClearBreakpointAction.NAME));
		}));
		escapePopupMenu();

		CompletableFuture<Void> dis = lb.disableForTrace(trace);
		handleToggleBreakpointInvocation(Unique.assertOne(lb.getTraceBreakpoints(trace)), false);
		waitOn(dis);
		waitT(t);
		waitForPass(
			() -> assertEquals(State.DISABLED, lb.computeStateForTrace(trace)));

		waitForPass(noExc(() -> {
			clickListing(listingPlugin.getListingPanel(), addr(trace, 0x55550123),
				MouseEvent.BUTTON3);
			assertMenu(POPUP_ACTIONS, Set.of(
				AbstractSetBreakpointAction.NAME, AbstractToggleBreakpointAction.NAME,
				AbstractEnableBreakpointAction.NAME, AbstractClearBreakpointAction.NAME));
		}));
		escapePopupMenu();

		waitForPass(() -> {
			lb.enableForProgram(); // This time, adds "disable", which will only affect bookmark
			waitForDomainObject(program);
			assertEquals(State.INCONSISTENT_DISABLED, lb.computeStateForTrace(trace));
		});

		waitForPass(noExc(() -> {
			clickListing(listingPlugin.getListingPanel(), addr(trace, 0x55550123),
				MouseEvent.BUTTON3);
			assertMenu(POPUP_ACTIONS, Set.of(
				AbstractSetBreakpointAction.NAME, AbstractToggleBreakpointAction.NAME,
				AbstractEnableBreakpointAction.NAME, AbstractDisableBreakpointAction.NAME,
				AbstractClearBreakpointAction.NAME));
		}));
		escapePopupMenu();

		// TODO: Should mixed trace enablement be considered?
		// TODO: Margin, too?
	}
HACK: since service doesn't let me get markers for an address, change each that I care about
to have a distinct background color
Ghidra/Test/DebuggerIntegrationTest/src/test/java/ghidra/app/plugin/core/debug/gui/breakpoint/AbstractDebuggerBreakpointMarkerPluginTest.java