Skip to content

Commit da6dc8f

Browse files
committed
WIP
1 parent fd70a3c commit da6dc8f

File tree

2 files changed

+191
-1
lines changed

2 files changed

+191
-1
lines changed

services/src/main/java/io/scalecube/services/registry/ServiceRegistryImpl.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.List;
1919
import java.util.Map;
2020
import java.util.concurrent.CopyOnWriteArrayList;
21+
import java.util.stream.Stream;
2122
import org.jctools.maps.NonBlockingHashMap;
2223
import reactor.core.scheduler.Scheduler;
2324

@@ -51,7 +52,10 @@ public List<ServiceEndpoint> listServiceEndpoints() {
5152

5253
@Override
5354
public List<ServiceReference> listServiceReferences() {
54-
return serviceReferencesByQualifier.values().stream().flatMap(Collection::stream).toList();
55+
return Stream.concat(
56+
serviceReferencesByQualifier.values().stream().flatMap(Collection::stream),
57+
serviceReferencesByPattern.values().stream().flatMap(Collection::stream))
58+
.toList();
5559
}
5660

5761
@Override
Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
package io.scalecube.services.registry;
2+
3+
import static org.junit.jupiter.api.Assertions.*;
4+
import static org.mockito.Mockito.mock;
5+
6+
import io.scalecube.services.Address;
7+
import io.scalecube.services.ServiceEndpoint;
8+
import io.scalecube.services.ServiceInfo;
9+
import io.scalecube.services.ServiceMethodDefinition;
10+
import io.scalecube.services.ServiceRegistration;
11+
import io.scalecube.services.annotations.Service;
12+
import io.scalecube.services.annotations.ServiceMethod;
13+
import io.scalecube.services.api.ServiceMessage;
14+
import io.scalecube.services.exceptions.ServiceProviderErrorMapper;
15+
import io.scalecube.services.transport.api.ServiceMessageDataDecoder;
16+
import java.util.HashMap;
17+
import java.util.List;
18+
import java.util.Set;
19+
import org.junit.jupiter.api.Test;
20+
import reactor.core.publisher.Mono;
21+
22+
class ServiceRegistryImplTest {
23+
24+
private final ServiceRegistryImpl serviceRegistry = new ServiceRegistryImpl(null);
25+
private final ServiceProviderErrorMapper errorMapper = mock(ServiceProviderErrorMapper.class);
26+
private final ServiceMessageDataDecoder dataDecoder = mock(ServiceMessageDataDecoder.class);
27+
28+
@Test
29+
void testRegisterService() {
30+
serviceRegistry.registerService(
31+
ServiceInfo.fromServiceInstance(new HelloOneImpl())
32+
.errorMapper(errorMapper)
33+
.dataDecoder(dataDecoder)
34+
.build());
35+
serviceRegistry.registerService(
36+
ServiceInfo.fromServiceInstance(new HelloTwoImpl())
37+
.errorMapper(errorMapper)
38+
.dataDecoder(dataDecoder)
39+
.build());
40+
assertEquals(2, serviceRegistry.listServices().size());
41+
}
42+
43+
@Test
44+
void testRegisterServiceRepeatedlyNotAllowed() {
45+
final var helloOne =
46+
ServiceInfo.fromServiceInstance(new HelloOneImpl())
47+
.errorMapper(errorMapper)
48+
.dataDecoder(dataDecoder)
49+
.build();
50+
final var helloTwo =
51+
ServiceInfo.fromServiceInstance(new HelloTwoImpl())
52+
.errorMapper(errorMapper)
53+
.dataDecoder(dataDecoder)
54+
.build();
55+
serviceRegistry.registerService(helloOne);
56+
serviceRegistry.registerService(helloTwo);
57+
assertEquals(2, serviceRegistry.listServices().size());
58+
assertThrows(IllegalStateException.class, () -> serviceRegistry.registerService(helloOne));
59+
assertThrows(IllegalStateException.class, () -> serviceRegistry.registerService(helloTwo));
60+
}
61+
62+
@Test
63+
void testRegisterThenUnregisterServiceEndpoint() {
64+
final var n = 10;
65+
for (int i = 0; i < n; i++) {
66+
serviceRegistry.registerService(
67+
ServiceEndpoint.builder()
68+
.id("endpoint" + i)
69+
.address(Address.create("endpoint" + i, 4848))
70+
.contentTypes(Set.of("json"))
71+
.serviceRegistrations(
72+
List.of(
73+
new ServiceRegistration(
74+
"greeting",
75+
new HashMap<>(),
76+
List.of(
77+
new ServiceMethodDefinition("hello"),
78+
new ServiceMethodDefinition("hello/:pathVar")))))
79+
.build());
80+
}
81+
82+
assertEquals(n, serviceRegistry.listServiceEndpoints().size());
83+
assertEquals(n << 1, serviceRegistry.listServiceReferences().size());
84+
85+
for (int i = 0; i < n; i++) {
86+
assertNotNull(serviceRegistry.unregisterService("endpoint" + i));
87+
}
88+
89+
assertEquals(0, serviceRegistry.listServiceEndpoints().size());
90+
assertEquals(0, serviceRegistry.listServiceReferences().size());
91+
}
92+
93+
@Test
94+
void testGetInvoker() {
95+
serviceRegistry.registerService(
96+
ServiceInfo.fromServiceInstance(new HelloOneImpl())
97+
.errorMapper(errorMapper)
98+
.dataDecoder(dataDecoder)
99+
.build());
100+
serviceRegistry.registerService(
101+
ServiceInfo.fromServiceInstance(new HelloTwoImpl())
102+
.errorMapper(errorMapper)
103+
.dataDecoder(dataDecoder)
104+
.build());
105+
assertNotNull(serviceRegistry.getInvoker("greeting/hello"));
106+
assertNotNull(serviceRegistry.getInvoker("greeting/hello/12345"));
107+
assertNotNull(serviceRegistry.getInvoker("greeting/hello/67890"));
108+
assertNull(serviceRegistry.getInvoker("greeting/hola/that/not/exist"));
109+
}
110+
111+
@Test
112+
void testLookupService() {
113+
final var n = 10;
114+
for (int i = 0; i < n; i++) {
115+
serviceRegistry.registerService(
116+
ServiceEndpoint.builder()
117+
.id("endpoint" + i)
118+
.address(Address.create("endpoint" + i, 4848))
119+
.contentTypes(Set.of("application/json"))
120+
.serviceRegistrations(
121+
List.of(
122+
new ServiceRegistration(
123+
"greeting",
124+
new HashMap<>(),
125+
List.of(
126+
new ServiceMethodDefinition("hello"),
127+
new ServiceMethodDefinition("hello/:pathVar")))))
128+
.build());
129+
}
130+
assertEquals(
131+
n,
132+
serviceRegistry
133+
.lookupService(ServiceMessage.builder().qualifier("greeting/hello").build())
134+
.size());
135+
assertEquals(
136+
n,
137+
serviceRegistry
138+
.lookupService(ServiceMessage.builder().qualifier("greeting/hello/12345").build())
139+
.size());
140+
assertEquals(
141+
n,
142+
serviceRegistry
143+
.lookupService(ServiceMessage.builder().qualifier("greeting/hello/67890").build())
144+
.size());
145+
assertEquals(
146+
0,
147+
serviceRegistry
148+
.lookupService(
149+
ServiceMessage.builder().qualifier("greeting/hola/that/not/exist").build())
150+
.size());
151+
}
152+
153+
@Service(HelloOne.NAMESPACE)
154+
interface HelloOne {
155+
156+
String NAMESPACE = "greeting";
157+
158+
@ServiceMethod
159+
Mono<String> hello();
160+
}
161+
162+
@Service(HelloTwo.NAMESPACE)
163+
interface HelloTwo {
164+
165+
String NAMESPACE = "greeting";
166+
167+
@ServiceMethod("hello/:pathVar")
168+
Mono<String> helloPathVar();
169+
}
170+
171+
static class HelloOneImpl implements HelloOne {
172+
173+
@Override
174+
public Mono<String> hello() {
175+
return Mono.just("" + System.currentTimeMillis());
176+
}
177+
}
178+
179+
static class HelloTwoImpl implements HelloTwo {
180+
181+
@Override
182+
public Mono<String> helloPathVar() {
183+
return Mono.just("" + System.currentTimeMillis());
184+
}
185+
}
186+
}

0 commit comments

Comments
 (0)