Skip to content

Commit 8f6c15c

Browse files
committed
refactor: add tests
1 parent 6b83860 commit 8f6c15c

File tree

4 files changed

+548
-56
lines changed

4 files changed

+548
-56
lines changed

mcp-core/src/test/java/io/modelcontextprotocol/spec/InMemoryMcpEventStoreTest.java

Lines changed: 77 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,129 +1,150 @@
11
package io.modelcontextprotocol.spec;
22

3-
import org.junit.jupiter.api.Test;
4-
import reactor.test.StepVerifier;
5-
63
import java.time.Duration;
74
import java.util.Map;
85
import java.util.concurrent.atomic.AtomicLong;
96

7+
import org.junit.jupiter.api.Test;
8+
import reactor.test.StepVerifier;
9+
1010
import static org.junit.jupiter.api.Assertions.assertEquals;
11-
import static org.junit.jupiter.api.Assertions.assertNotNull;
1211
import static org.junit.jupiter.api.Assertions.assertTrue;
1312

1413
class InMemoryMcpEventStoreTest {
1514

1615
@Test
17-
void storeEventStoresEventAndReturnsGeneratedId() {
18-
InMemoryMcpEventStore eventStore = new InMemoryMcpEventStore(null, null);
16+
void storeEventStoresEventAndReplaysEventsAfterMessageId() {
17+
InMemoryMcpEventStore eventStore = new InMemoryMcpEventStore(null, Duration.ofSeconds(30));
1918
String streamId = "test-stream";
19+
MessageId firstMessageId = MessageId.of(streamId, "req-1");
2020
McpSchema.JSONRPCMessage message = new McpSchema.JSONRPCRequest("2.0", "tools/list", "req-1",
2121
Map.of("limit", 1));
2222

23-
String eventId = eventStore.storeEvent(streamId, message).block();
24-
25-
assertNotNull(eventId);
26-
assertTrue(eventId.startsWith(streamId + "_"));
23+
eventStore.storeEvent(firstMessageId, message).block();
2724

25+
MessageId secondMessageId = MessageId.of(streamId, "req-2");
2826
McpSchema.JSONRPCRequest nextMessage = new McpSchema.JSONRPCRequest("2.0", "tools/list", "req-2", null);
29-
eventStore.storeEvent(streamId, nextMessage).block();
27+
eventStore.storeEvent(secondMessageId, nextMessage).block();
3028

31-
StepVerifier.create(eventStore.replayEventsAfter(eventId)).assertNext(storedEvent -> {
32-
assertEquals(streamId, storedEvent.streamId());
33-
assertEquals(nextMessage, storedEvent.event());
29+
StepVerifier.create(eventStore.replayEventsAfter(firstMessageId)).assertNext(storedEvent -> {
30+
assertEquals(streamId, storedEvent.messageId().transportId());
31+
assertEquals(secondMessageId, storedEvent.messageId());
32+
assertEquals(nextMessage, storedEvent.message());
3433
assertTrue(storedEvent.timestamp() > 0);
3534
}).verifyComplete();
3635
}
3736

37+
@Test
38+
void replayEventsAfterReplaysOnlyEventsFromSameStream() {
39+
InMemoryMcpEventStore eventStore = new InMemoryMcpEventStore(null, Duration.ofSeconds(30));
40+
41+
MessageId streamAFirst = MessageId.of("stream-a", "1");
42+
MessageId streamBFirst = MessageId.of("stream-b", "1");
43+
MessageId streamASecond = MessageId.of("stream-a", "2");
44+
45+
eventStore.storeEvent(streamAFirst, new McpSchema.JSONRPCNotification("2.0", "a/first", null)).block();
46+
eventStore.storeEvent(streamBFirst, new McpSchema.JSONRPCNotification("2.0", "b/first", null)).block();
47+
eventStore.storeEvent(streamASecond, new McpSchema.JSONRPCNotification("2.0", "a/second", null)).block();
48+
49+
StepVerifier.create(eventStore.replayEventsAfter(streamAFirst))
50+
.assertNext(event -> assertEquals(streamASecond, event.messageId()))
51+
.verifyComplete();
52+
}
53+
54+
@Test
55+
void replayEventsAfterUnknownMessageIdReturnsEmpty() {
56+
InMemoryMcpEventStore eventStore = new InMemoryMcpEventStore(null, Duration.ofSeconds(30));
57+
58+
eventStore.storeEvent(MessageId.of("stream-a", "1"), new McpSchema.JSONRPCNotification("2.0", "a/first", null))
59+
.block();
60+
61+
StepVerifier.create(eventStore.replayEventsAfter(MessageId.of("stream-a", "does-not-exist"))).verifyComplete();
62+
}
63+
3864
@Test
3965
void storeEventEvictsExpiredEventsWhenTtlIsConfigured() {
4066
AtomicLong now = new AtomicLong(1_000);
4167
InMemoryMcpEventStore eventStore = new InMemoryMcpEventStore(null, Duration.ofMillis(10), now::get);
4268
String streamId = "ttl-stream";
69+
MessageId firstMessageId = MessageId.of(streamId, "req-1");
70+
MessageId secondMessageId = MessageId.of(streamId, "req-2");
71+
MessageId thirdMessageId = MessageId.of(streamId, "req-3");
4372

44-
String firstEventId = eventStore
45-
.storeEvent(streamId, new McpSchema.JSONRPCRequest("2.0", "resources/list", "req-1", null))
73+
eventStore.storeEvent(firstMessageId, new McpSchema.JSONRPCRequest("2.0", "resources/list", "req-1", null))
4674
.block();
4775

4876
now.addAndGet(30);
4977

50-
String secondEventId = eventStore
51-
.storeEvent(streamId, new McpSchema.JSONRPCRequest("2.0", "resources/list", "req-2", null))
78+
eventStore.storeEvent(secondMessageId, new McpSchema.JSONRPCRequest("2.0", "resources/list", "req-2", null))
5279
.block();
5380

5481
now.addAndGet(5);
5582

56-
String thirdEventId = eventStore
57-
.storeEvent(streamId, new McpSchema.JSONRPCRequest("2.0", "resources/list", "req-2", null))
83+
eventStore.storeEvent(thirdMessageId, new McpSchema.JSONRPCRequest("2.0", "resources/list", "req-3", null))
5884
.block();
5985

60-
StepVerifier.create(eventStore.replayEventsAfter(firstEventId)).verifyComplete();
61-
StepVerifier.create(eventStore.replayEventsAfter(secondEventId)).assertNext(event -> {
62-
System.out.println(event);
63-
assertEquals(thirdEventId, event.eventId());
64-
}).verifyComplete();
86+
StepVerifier.create(eventStore.replayEventsAfter(firstMessageId)).verifyComplete();
87+
StepVerifier.create(eventStore.replayEventsAfter(secondMessageId))
88+
.assertNext(event -> assertEquals(thirdMessageId, event.messageId()))
89+
.verifyComplete();
6590
}
6691

6792
@Test
6893
void storeEventRespectsMaxEventsPerStream() {
69-
InMemoryMcpEventStore eventStore = new InMemoryMcpEventStore(2, null);
94+
InMemoryMcpEventStore eventStore = new InMemoryMcpEventStore(2, Duration.ofSeconds(30));
7095
String streamId = "max-stream";
96+
MessageId firstMessageId = MessageId.of(streamId, "req-1");
97+
MessageId secondMessageId = MessageId.of(streamId, "req-2");
98+
MessageId thirdMessageId = MessageId.of(streamId, "req-3");
7199

72-
String firstEventId = eventStore
73-
.storeEvent(streamId, new McpSchema.JSONRPCRequest("2.0", "tools/list", "req-1", null))
74-
.block();
75-
String secondEventId = eventStore
76-
.storeEvent(streamId, new McpSchema.JSONRPCRequest("2.0", "tools/list", "req-2", null))
77-
.block();
78-
String thirdEventId = eventStore
79-
.storeEvent(streamId, new McpSchema.JSONRPCRequest("2.0", "tools/list", "req-3", null))
100+
eventStore.storeEvent(firstMessageId, new McpSchema.JSONRPCRequest("2.0", "tools/list", "req-1", null)).block();
101+
eventStore.storeEvent(secondMessageId, new McpSchema.JSONRPCRequest("2.0", "tools/list", "req-2", null))
80102
.block();
103+
eventStore.storeEvent(thirdMessageId, new McpSchema.JSONRPCRequest("2.0", "tools/list", "req-3", null)).block();
81104

82-
StepVerifier.create(eventStore.replayEventsAfter(firstEventId)).verifyComplete();
83-
StepVerifier.create(eventStore.replayEventsAfter(secondEventId))
84-
.assertNext(event -> assertEquals(thirdEventId, event.eventId()))
105+
StepVerifier.create(eventStore.replayEventsAfter(firstMessageId)).verifyComplete();
106+
StepVerifier.create(eventStore.replayEventsAfter(secondMessageId))
107+
.assertNext(event -> assertEquals(thirdMessageId, event.messageId()))
85108
.verifyComplete();
86109
}
87110

88111
@Test
89-
void storeEventDoesNotEvictByTtlWhenTtlIsNull() {
112+
void storeEventDoesNotEvictWithinTtlWindow() {
90113
AtomicLong now = new AtomicLong(2_000);
91-
InMemoryMcpEventStore eventStore = new InMemoryMcpEventStore(null, null, now::get);
114+
InMemoryMcpEventStore eventStore = new InMemoryMcpEventStore(null, Duration.ofMillis(50), now::get);
92115
String streamId = "ttl-null-stream";
116+
MessageId firstMessageId = MessageId.of(streamId, "req-1");
117+
MessageId secondMessageId = MessageId.of(streamId, "req-2");
93118

94-
String firstEventId = eventStore
95-
.storeEvent(streamId, new McpSchema.JSONRPCRequest("2.0", "resources/list", "req-1", null))
119+
eventStore.storeEvent(firstMessageId, new McpSchema.JSONRPCRequest("2.0", "resources/list", "req-1", null))
96120
.block();
97121

98122
now.addAndGet(30);
99123

100-
String secondEventId = eventStore
101-
.storeEvent(streamId, new McpSchema.JSONRPCRequest("2.0", "resources/list", "req-2", null))
124+
eventStore.storeEvent(secondMessageId, new McpSchema.JSONRPCRequest("2.0", "resources/list", "req-2", null))
102125
.block();
103126

104-
StepVerifier.create(eventStore.replayEventsAfter(firstEventId))
105-
.assertNext(event -> assertEquals(secondEventId, event.eventId()))
127+
StepVerifier.create(eventStore.replayEventsAfter(firstMessageId))
128+
.assertNext(event -> assertEquals(secondMessageId, event.messageId()))
106129
.verifyComplete();
107130
}
108131

109132
@Test
110133
void storeEventDoesNotEvictByMaxWhenMaxEventsPerStreamIsNull() {
111134
InMemoryMcpEventStore eventStore = new InMemoryMcpEventStore(null, Duration.ofSeconds(10));
112135
String streamId = "max-null-stream";
136+
MessageId firstMessageId = MessageId.of(streamId, "req-1");
137+
MessageId secondMessageId = MessageId.of(streamId, "req-2");
138+
MessageId thirdMessageId = MessageId.of(streamId, "req-3");
113139

114-
String firstEventId = eventStore
115-
.storeEvent(streamId, new McpSchema.JSONRPCRequest("2.0", "tools/list", "req-1", null))
116-
.block();
117-
String secondEventId = eventStore
118-
.storeEvent(streamId, new McpSchema.JSONRPCRequest("2.0", "tools/list", "req-2", null))
119-
.block();
120-
String thirdEventId = eventStore
121-
.storeEvent(streamId, new McpSchema.JSONRPCRequest("2.0", "tools/list", "req-3", null))
140+
eventStore.storeEvent(firstMessageId, new McpSchema.JSONRPCRequest("2.0", "tools/list", "req-1", null)).block();
141+
eventStore.storeEvent(secondMessageId, new McpSchema.JSONRPCRequest("2.0", "tools/list", "req-2", null))
122142
.block();
143+
eventStore.storeEvent(thirdMessageId, new McpSchema.JSONRPCRequest("2.0", "tools/list", "req-3", null)).block();
123144

124-
StepVerifier.create(eventStore.replayEventsAfter(firstEventId))
125-
.assertNext(event -> assertEquals(secondEventId, event.eventId()))
126-
.assertNext(event -> assertEquals(thirdEventId, event.eventId()))
145+
StepVerifier.create(eventStore.replayEventsAfter(firstMessageId))
146+
.assertNext(event -> assertEquals(secondMessageId, event.messageId()))
147+
.assertNext(event -> assertEquals(thirdMessageId, event.messageId()))
127148
.verifyComplete();
128149
}
129150

0 commit comments

Comments
 (0)