Skip to content

Commit b3b3f46

Browse files
committed
test: add SessionHub unit tests
1 parent 7343b20 commit b3b3f46

1 file changed

Lines changed: 196 additions & 0 deletions

File tree

Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
package dev.objz.commandbridge.velocity.net.session;
2+
3+
import dev.objz.commandbridge.logging.Log;
4+
import dev.objz.commandbridge.net.Endpoint;
5+
import dev.objz.commandbridge.net.proto.Envelope;
6+
import dev.objz.commandbridge.scripting.model.enums.Location;
7+
import dev.objz.commandbridge.security.AuthStatus;
8+
import org.junit.jupiter.api.BeforeAll;
9+
import org.junit.jupiter.api.BeforeEach;
10+
import org.junit.jupiter.api.Test;
11+
12+
import java.util.concurrent.CompletableFuture;
13+
import java.util.concurrent.atomic.AtomicInteger;
14+
15+
import static org.junit.jupiter.api.Assertions.assertEquals;
16+
import static org.junit.jupiter.api.Assertions.assertFalse;
17+
import static org.junit.jupiter.api.Assertions.assertNotNull;
18+
import static org.junit.jupiter.api.Assertions.assertNull;
19+
import static org.junit.jupiter.api.Assertions.assertTrue;
20+
21+
class SessionHubTest {
22+
23+
private static final class TestEndpoint implements Endpoint {
24+
private final boolean open;
25+
26+
TestEndpoint() {
27+
this(true);
28+
}
29+
30+
TestEndpoint(boolean open) {
31+
this.open = open;
32+
}
33+
34+
@Override
35+
public CompletableFuture<Void> send(Envelope env) {
36+
return CompletableFuture.completedFuture(null);
37+
}
38+
39+
@Override
40+
public boolean isOpen() {
41+
return open;
42+
}
43+
}
44+
45+
private SessionHub hub;
46+
47+
@BeforeAll
48+
static void installLog() {
49+
try {
50+
Log.install(java.util.logging.Logger.getLogger("SessionHubTest"));
51+
} catch (IllegalStateException e) {
52+
// Log already installed, ignore
53+
}
54+
}
55+
56+
@BeforeEach
57+
void setUp() {
58+
hub = new SessionHub();
59+
}
60+
61+
@Test
62+
void addCreatesSession() {
63+
Endpoint ep = new TestEndpoint();
64+
ClientSession result = hub.add("s1", ep);
65+
66+
assertNotNull(result);
67+
assertEquals("s1", result.id());
68+
}
69+
70+
@Test
71+
void getByIdReturnsSession() {
72+
Endpoint ep = new TestEndpoint();
73+
hub.add("s1", ep);
74+
75+
assertTrue(hub.get("s1").isPresent());
76+
}
77+
78+
@Test
79+
void getByIdReturnsEmptyForUnknown() {
80+
assertFalse(hub.get("unknown").isPresent());
81+
}
82+
83+
@Test
84+
void getByEndpointReturnsSession() {
85+
Endpoint ep = new TestEndpoint();
86+
hub.add("s1", ep);
87+
88+
ClientSession result = hub.get(ep);
89+
assertNotNull(result);
90+
}
91+
92+
@Test
93+
void addDuplicateIdReplacesOld() {
94+
Endpoint ep1 = new TestEndpoint();
95+
Endpoint ep2 = new TestEndpoint();
96+
97+
hub.add("s1", ep1);
98+
hub.add("s1", ep2);
99+
100+
assertNull(hub.get(ep1));
101+
}
102+
103+
@Test
104+
void removeByIdCleansUpEndpoint() {
105+
Endpoint ep = new TestEndpoint();
106+
hub.add("s1", ep);
107+
108+
hub.remove("s1");
109+
110+
assertNull(hub.get(ep));
111+
}
112+
113+
@Test
114+
void removeByEndpointCleansUpId() {
115+
Endpoint ep = new TestEndpoint();
116+
hub.add("s1", ep);
117+
118+
hub.remove(ep);
119+
120+
assertFalse(hub.get("s1").isPresent());
121+
}
122+
123+
@Test
124+
void removeFiresListener() {
125+
AtomicInteger count = new AtomicInteger(0);
126+
hub.onRemove(session -> count.incrementAndGet());
127+
128+
Endpoint ep = new TestEndpoint();
129+
hub.add("s1", ep);
130+
hub.remove("s1");
131+
132+
assertEquals(1, count.get());
133+
}
134+
135+
@Test
136+
void clearRemovesAll() {
137+
Endpoint ep1 = new TestEndpoint();
138+
Endpoint ep2 = new TestEndpoint();
139+
140+
hub.add("s1", ep1);
141+
hub.add("s2", ep2);
142+
143+
hub.clear();
144+
145+
assertEquals(0, hub.size());
146+
}
147+
148+
@Test
149+
void sizeReturnsCount() {
150+
Endpoint ep1 = new TestEndpoint();
151+
Endpoint ep2 = new TestEndpoint();
152+
Endpoint ep3 = new TestEndpoint();
153+
154+
hub.add("s1", ep1);
155+
hub.add("s2", ep2);
156+
hub.add("s3", ep3);
157+
158+
assertEquals(3, hub.size());
159+
}
160+
161+
@Test
162+
void findSessionRequiresAuthOk() {
163+
Endpoint ep = new TestEndpoint();
164+
ClientSession session = hub.add("s1", ep);
165+
// status defaults to AUTH_FAIL
166+
167+
assertFalse(hub.findSession("s1", Location.BACKEND).isPresent());
168+
}
169+
170+
@Test
171+
void findSessionRequiresOpenEndpoint() {
172+
Endpoint ep = new TestEndpoint(false);
173+
ClientSession session = hub.add("s1", ep);
174+
session.status(AuthStatus.AUTH_OK);
175+
176+
assertFalse(hub.findSession("s1", Location.BACKEND).isPresent());
177+
}
178+
179+
@Test
180+
void findSessionRequiresMatchingLocation() {
181+
Endpoint ep = new TestEndpoint();
182+
ClientSession session = hub.add("s1", ep);
183+
session.status(AuthStatus.AUTH_OK);
184+
session.location(Location.BACKEND);
185+
186+
assertFalse(hub.findSession("s1", Location.VELOCITY).isPresent());
187+
}
188+
189+
@Test
190+
void addWithNullIdGeneratesUUID() {
191+
Endpoint ep = new TestEndpoint();
192+
ClientSession result = hub.add(null, ep);
193+
194+
assertTrue(result.id().startsWith("unknown-"));
195+
}
196+
}

0 commit comments

Comments
 (0)