CB-307 Increment 1: PrimaryRegistry + config + wiring
- PrimaryRegistry: thread-safe single-slot registry with pin support - Primary config record (last positional, like Broker) - Wire capture in BridgeMcp (bridge_send and bridge_spawn handlers) - Construct PrimaryRegistry in Bridged.main - Tests: PrimaryRegistryTest + BridgedConfigTest primary config cases
This commit is contained in:
@@ -125,4 +125,39 @@ class BridgedConfigTest {
|
||||
assertNotNull(cfg.broker());
|
||||
assertFalse(cfg.broker().isConfigured(), "an empty uri must not enable AMQP");
|
||||
}
|
||||
|
||||
@Test
|
||||
void absentPrimaryBlockLeavesPrimaryNull(@TempDir Path dir) throws Exception {
|
||||
Path f = dir.resolve("no-primary.yaml");
|
||||
Files.writeString(f, "bind:\n port: 8080\n");
|
||||
|
||||
BridgedConfig cfg = BridgedConfig.load(f);
|
||||
assertNull(cfg.primary(), "no primary: block → null → connection-derived identity");
|
||||
}
|
||||
|
||||
@Test
|
||||
void primaryBlockWithTerminalPinsIdentity(@TempDir Path dir) throws Exception {
|
||||
Path f = dir.resolve("primary-pinned.yaml");
|
||||
Files.writeString(f, """
|
||||
bind:
|
||||
port: 8080
|
||||
primary:
|
||||
terminal: term_fixed
|
||||
""");
|
||||
|
||||
BridgedConfig cfg = BridgedConfig.load(f);
|
||||
assertNotNull(cfg.primary());
|
||||
assertEquals("term_fixed", cfg.primary().terminal());
|
||||
}
|
||||
|
||||
@Test
|
||||
void primaryBlockWithBlankTerminalDefaultsToDerived(@TempDir Path dir) throws Exception {
|
||||
Path f = dir.resolve("primary-blank.yaml");
|
||||
Files.writeString(f, "bind:\n port: 8080\nprimary:\n terminal: \"\"\n");
|
||||
|
||||
BridgedConfig cfg = BridgedConfig.load(f);
|
||||
assertNotNull(cfg.primary());
|
||||
assertTrue(cfg.primary().terminal() == null || cfg.primary().terminal().isBlank(),
|
||||
"a blank terminal in yaml should be treated as absent — null or empty are equivalent");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,108 @@
|
||||
package dev.ltms.bridged.mcp;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link PrimaryRegistry}: pin vs record, isKnown transitions,
|
||||
* null/blank guard.
|
||||
*/
|
||||
class PrimaryRegistryTest {
|
||||
|
||||
@Test
|
||||
void unpinnedInitiallyUnknown() {
|
||||
var reg = new PrimaryRegistry(null);
|
||||
assertFalse(reg.isKnown());
|
||||
assertTrue(reg.primaryTerminal().isEmpty());
|
||||
}
|
||||
|
||||
@Test
|
||||
void unpinnedAcceptsBlankAsAbsent() {
|
||||
var reg = new PrimaryRegistry("");
|
||||
assertFalse(reg.isKnown());
|
||||
assertTrue(reg.primaryTerminal().isEmpty());
|
||||
}
|
||||
|
||||
@Test
|
||||
void pinnedFromConstruction() {
|
||||
var reg = new PrimaryRegistry("term_fixed");
|
||||
assertTrue(reg.isKnown());
|
||||
assertEquals("term_fixed", reg.primaryTerminal().orElseThrow());
|
||||
}
|
||||
|
||||
@Test
|
||||
void recordWhenUnpinnedSetsTheTerminal() {
|
||||
var reg = new PrimaryRegistry(null);
|
||||
reg.record("term_abc");
|
||||
assertTrue(reg.isKnown());
|
||||
assertEquals("term_abc", reg.primaryTerminal().orElseThrow());
|
||||
}
|
||||
|
||||
@Test
|
||||
void recordWithNullDoesNothingWhenUnpinned() {
|
||||
var reg = new PrimaryRegistry(null);
|
||||
reg.record(null);
|
||||
assertFalse(reg.isKnown());
|
||||
}
|
||||
|
||||
@Test
|
||||
void recordWithBlankDoesNothingWhenUnpinned() {
|
||||
var reg = new PrimaryRegistry(null);
|
||||
reg.record(" ");
|
||||
assertFalse(reg.isKnown());
|
||||
}
|
||||
|
||||
@Test
|
||||
void recordOverwritesWhenUnpinned() {
|
||||
var reg = new PrimaryRegistry(null);
|
||||
reg.record("term_first");
|
||||
assertEquals("term_first", reg.primaryTerminal().orElseThrow());
|
||||
reg.record("term_second");
|
||||
assertEquals("term_second", reg.primaryTerminal().orElseThrow());
|
||||
}
|
||||
|
||||
@Test
|
||||
void recordIsIgnoredWhenPinned() {
|
||||
var reg = new PrimaryRegistry("term_pinned");
|
||||
reg.record("term_other");
|
||||
assertEquals("term_pinned", reg.primaryTerminal().orElseThrow(), "pinned value must survive record");
|
||||
}
|
||||
|
||||
@Test
|
||||
void nullRecordIsIgnoredWhenPinned() {
|
||||
var reg = new PrimaryRegistry("term_pinned");
|
||||
reg.record(null);
|
||||
assertTrue(reg.isKnown());
|
||||
assertEquals("term_pinned", reg.primaryTerminal().orElseThrow());
|
||||
}
|
||||
|
||||
@Test
|
||||
void blankRecordIsIgnoredWhenPinned() {
|
||||
var reg = new PrimaryRegistry("term_pinned");
|
||||
reg.record(" ");
|
||||
assertTrue(reg.isKnown());
|
||||
assertEquals("term_pinned", reg.primaryTerminal().orElseThrow());
|
||||
}
|
||||
|
||||
@Test
|
||||
void isKnownFalseAfterConstructionWithNull() {
|
||||
var reg = new PrimaryRegistry(null);
|
||||
assertFalse(reg.isKnown());
|
||||
}
|
||||
|
||||
@Test
|
||||
void isKnownAfterRecord() {
|
||||
var reg = new PrimaryRegistry(null);
|
||||
reg.record("term_x");
|
||||
assertTrue(reg.isKnown());
|
||||
}
|
||||
|
||||
@Test
|
||||
void primaryTerminalRoundTrip() {
|
||||
var reg = new PrimaryRegistry(null);
|
||||
assertTrue(reg.primaryTerminal().isEmpty());
|
||||
reg.record("term_found");
|
||||
assertEquals("term_found", reg.primaryTerminal().get());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user