@Override
	protected void handleSetBreakpointInvocation(Set<TraceBreakpointKind> expectedKinds,
			long dynOffset) throws Throwable {
		Lifespan zeroOn = Lifespan.nowOn(0);
		if (TraceBreakpointKindSet.READ.equals(expectedKinds)) {
			Map<String, Object> args = rmiMethodSetReadBreak.expect();
			addBreakpointAndLoc(tb.trace.getObjectManager(), zeroOn, tb.range(dynOffset),
				TraceBreakpointKindSet.READ);
			rmiMethodSetReadBreak.result(null);
			assertEquals(Map.ofEntries(
				Map.entry("process", tb.obj("Processes[1]")),
				Map.entry("range", tb.range(dynOffset))), args);
		}
		else if (TraceBreakpointKindSet.WRITE.equals(expectedKinds)) {
			Map<String, Object> args = rmiMethodSetWriteBreak.expect();
			addBreakpointAndLoc(tb.trace.getObjectManager(), zeroOn, tb.range(dynOffset),
				TraceBreakpointKindSet.WRITE);
			rmiMethodSetWriteBreak.result(null);
			assertEquals(Map.ofEntries(
				Map.entry("process", tb.obj("Processes[1]")),
				Map.entry("range", tb.range(dynOffset))), args);
		}
		else if (TraceBreakpointKindSet.ACCESS.equals(expectedKinds)) {
			Map<String, Object> args = rmiMethodSetAccessBreak.expect();
			addBreakpointAndLoc(tb.trace.getObjectManager(), zeroOn, tb.range(dynOffset),
				TraceBreakpointKindSet.ACCESS);
			rmiMethodSetAccessBreak.result(null);
			assertEquals(Map.ofEntries(
				Map.entry("process", tb.obj("Processes[1]")),
				Map.entry("range", tb.range(dynOffset))), args);
		}
		else if (TraceBreakpointKindSet.SW_EXECUTE.equals(expectedKinds)) {
			Map<String, Object> args = rmiMethodSetSwBreak.expect();
			addBreakpointAndLoc(tb.trace.getObjectManager(), zeroOn, tb.range(dynOffset),
				TraceBreakpointKindSet.SW_EXECUTE);
			rmiMethodSetSwBreak.result(null);
			assertEquals(Map.ofEntries(
				Map.entry("process", tb.obj("Processes[1]")),
				Map.entry("address", tb.addr(dynOffset))), args);
		}
		else if (TraceBreakpointKindSet.HW_EXECUTE.equals(expectedKinds)) {
			Map<String, Object> args = rmiMethodSetHwBreak.expect();
			addBreakpointAndLoc(tb.trace.getObjectManager(), zeroOn, tb.range(dynOffset),
				TraceBreakpointKindSet.HW_EXECUTE);
			rmiMethodSetHwBreak.result(null);
			assertEquals(Map.ofEntries(
				Map.entry("process", tb.obj("Processes[1]")),
				Map.entry("address", tb.addr(dynOffset))), args);
		}
		else {
			throw new AssertionError("Unhandled invocation for kinds: " + expectedKinds);
		}
	}
TODO: Various schema scenarios?:
<ul>
<li>per-session BreakpointContainer</li>
<li>per-process BreakpointContainer</li>
<li>spec-is-location</li>
<li>spec-has-locations</li>
<li>togglable locs</li>
<li>non-togglable locs</li>
<ul>
Ghidra/Test/DebuggerIntegrationTest/src/test/java/ghidra/app/plugin/core/debug/gui/breakpoint/DebuggerRmiBreakpointMarkerPluginTest.java