Skip to content

Commit 12352ab

Browse files
committed
tests for the application registry filter added
1 parent c984d89 commit 12352ab

File tree

6 files changed

+286
-60
lines changed

6 files changed

+286
-60
lines changed

micro-application-register/src/main/java/com/aol/micro/server/application/registry/RegisterEntry.java

+19-9
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import lombok.AccessLevel;
1313
import lombok.Builder;
1414
import lombok.Getter;
15+
import lombok.ToString;
1516
import lombok.experimental.FieldDefaults;
1617
import lombok.experimental.Wither;
1718

@@ -22,6 +23,7 @@
2223
@Getter
2324
@Wither
2425
@Builder
26+
@ToString
2527
public class RegisterEntry {
2628

2729
private static SimpleDateFormat f = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z");
@@ -39,7 +41,7 @@ public class RegisterEntry {
3941
@Wither
4042
private final String target;
4143
private final String formattedDate;
42-
private final Map<String, String> manifest = ManifestLoader.instance.getManifest();
44+
private final Map<String, String> manifest = new HashMap<>();
4345
@Wither
4446
private final Health health;
4547
@Wither
@@ -53,7 +55,7 @@ public RegisterEntry() {
5355

5456
public RegisterEntry(int port, String hostname, String module, String context, Date time, String uuid,
5557
String target, int externalPort) {
56-
this(port, hostname, module, context, time, UUID.randomUUID().toString(), target, null, Health.OK, null, externalPort);
58+
this(port, hostname, module, context, time, uuid, target, null, Health.OK, null, externalPort);
5759
}
5860

5961
public RegisterEntry(int port, String hostname, String module, String context, Date time, String target,
@@ -80,20 +82,28 @@ private RegisterEntry(int port, String hostname, String module, String context,
8082
else
8183
this.formattedDate = null;
8284

85+
this.manifest.putAll(ManifestLoader.instance.getManifest());
86+
8387
}
8488

8589
public boolean matches(RegisterEntry re) {
90+
//Only the fields which make sense to query is added for now.
8691
return (re.port == -1 || re.port == port) &&
8792
(Objects.isNull(re.hostname) || Objects.nonNull(hostname) && hostname.startsWith(re.hostname)) &&
8893
(Objects.isNull(re.module) || Objects.nonNull(module) && module.startsWith(re.module)) &&
8994
(Objects.isNull(re.context) || Objects.nonNull(context) && context.startsWith(re.context)) &&
9095
(Objects.isNull(re.health) || re.health.equals(health)) &&
91-
(re.externalPort == -1 || re.externalPort != externalPort) &&
92-
(Objects.isNull(re.manifest) || (
93-
(!re.manifest.containsKey("Implementation-revision")) || re.manifest.get("Implementation-revision").equals(manifest.get("Implementation-revision")) &&
94-
(!re.manifest.containsKey("Implementation-Timestamp")) || re.manifest.get("Implementation-Timestamp").equals(manifest.get("Implementation-Timestamp")) &&
95-
(!re.manifest.containsKey("Implementation-Version")) || re.manifest.get("Implementation-Version").equals(manifest.get("Implementation-Version"))
96-
));
96+
(re.externalPort == -1 || re.externalPort == externalPort) &&
97+
(Objects.isNull(re.manifest) || re.manifest.isEmpty() || matchManifest(re.manifest));
98+
}
99+
100+
private boolean matchManifest(Map<String, String> manifest) {
101+
return match(manifest, this.manifest, "Implementation-revision") &&
102+
match(manifest, this.manifest, "Implementation-Timestamp") &&
103+
match(manifest, this.manifest, "Implementation-Version");
97104
}
98105

99-
}
106+
private boolean match(Map<String, String> map1, Map<String, String> map2, String key) {
107+
return !map1.containsKey(key) || (map2.containsKey(key) && map2.get(key).startsWith(map1.get(key)));
108+
}
109+
}

micro-application-register/src/main/java/com/aol/micro/server/application/registry/ServiceRegistryResource.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import javax.ws.rs.container.AsyncResponse;
88
import javax.ws.rs.container.Suspended;
99
import javax.ws.rs.core.Context;
10+
import javax.ws.rs.core.Response;
11+
import javax.ws.rs.core.Response.Status;
1012
import javax.ws.rs.core.UriInfo;
1113

1214
import cyclops.stream.ReactiveSeq;
@@ -19,6 +21,8 @@
1921
import com.aol.micro.server.auto.discovery.Rest;
2022
import com.aol.micro.server.utility.HashMapBuilder;
2123

24+
import static javax.ws.rs.core.Response.Status.*;
25+
2226

2327
@Rest
2428
@Path("/service-registry")
@@ -49,7 +53,7 @@ public void list(@Context UriInfo uriInfo, @Suspended AsyncResponse response) {
4953
response.resume(finder.find(UriInfoParser.toRegisterEntry(uriInfo)));
5054
}catch(Exception e){
5155
logger.error(e.getMessage(),e);
52-
response.resume(Arrays.asList("failed due to error"));
56+
response.resume(Arrays.asList("Bad Request: " + e.getMessage()));
5357
}
5458
}));
5559
}
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
package com.aol.micro.server.application.registry;
22

3+
import cyclops.stream.ReactiveSeq;
4+
5+
import javax.ws.rs.core.MultivaluedMap;
36
import javax.ws.rs.core.UriInfo;
7+
import java.util.Arrays;
8+
import java.util.Map;
9+
import java.util.Objects;
410
import java.util.Optional;
511

612
public class UriInfoParser {
@@ -9,9 +15,49 @@ public static Optional<RegisterEntry> toRegisterEntry(UriInfo uriInfo) {
915
if (uriInfo.getQueryParameters().isEmpty()) {
1016
return Optional.empty();
1117
} else {
12-
RegisterEntry re = new RegisterEntry();
13-
// TODO: add the population logic
18+
MultivaluedMap<String, String> parameters = uriInfo.getQueryParameters();
19+
RegisterEntry re = RegisterEntry.builder()
20+
.context(parameters.getFirst("context"))
21+
.hostname(parameters.getFirst("hostname"))
22+
.port(toInt(parameters.getFirst("port")))
23+
.target(parameters.getFirst("target"))
24+
.externalPort(toInt(parameters.getFirst("externalPort")))
25+
.module(parameters.getFirst("module"))
26+
.health(toHealth(parameters.getFirst("health")))
27+
.build();
28+
29+
Map<String, String> manifest = ReactiveSeq.fromIterable(parameters.entrySet())
30+
.filter(e -> e.getKey().startsWith("manifest."))
31+
.toMap(e -> e.getKey().replace("manifest.", ""), e -> parameters.getFirst(e.getKey()));
32+
33+
re.getManifest().clear();
34+
re.getManifest().putAll(manifest);
35+
1436
return Optional.of(re);
1537
}
1638
}
39+
40+
private static Health toHealth(String health) {
41+
if (Objects.nonNull(health)) {
42+
try {
43+
return Health.valueOf(health);
44+
} catch (Exception e) {
45+
throw new IllegalArgumentException("'" + health + "' is not valid, valid values are " +
46+
Arrays.asList(Health.values()));
47+
}
48+
}
49+
return null;
50+
}
51+
52+
private static int toInt(String port) {
53+
if (Objects.isNull(port))
54+
return -1;
55+
56+
try {
57+
return Integer.valueOf(port);
58+
} catch (Exception e) {
59+
throw new IllegalArgumentException("'" + port + "' is not a valid number.");
60+
}
61+
}
62+
1763
}
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
package app.registry.com.aol.micro.server;
22

3+
import static java.util.stream.Collectors.joining;
34
import static org.hamcrest.CoreMatchers.containsString;
45
import static org.hamcrest.CoreMatchers.is;
56
import static org.hamcrest.CoreMatchers.not;
67
import static org.junit.Assert.assertThat;
78

89
import java.text.SimpleDateFormat;
910
import java.util.Date;
11+
import java.util.List;
1012
import java.util.concurrent.ExecutionException;
13+
import java.util.stream.Stream;
1114

15+
import com.aol.micro.server.rest.client.RestClient;
16+
import com.fasterxml.jackson.core.type.TypeReference;
1217
import org.junit.After;
1318
import org.junit.Before;
1419
import org.junit.Test;
@@ -25,17 +30,15 @@
2530
public class RegistryAppRunner {
2631

2732
RestAgent rest = new RestAgent();
28-
private final AsyncRestClient restAsync = new AsyncRestClient(
29-
100, 2000);
33+
private final AsyncRestClient restAsync = new AsyncRestClient(100, 2000);
3034
MicroserverApp server;
3135

36+
String baseUrl = "http://localhost:8080/registry-app/service-registry";
37+
3238
@Before
3339
public void startServer() {
34-
35-
server = new MicroserverApp(
36-
() -> "registry-app");
40+
server = new MicroserverApp(() -> "registry-app");
3741
server.start();
38-
3942
}
4043

4144
@After
@@ -46,58 +49,115 @@ public void stopServer() {
4649
@Test
4750
public void runAppAndBasicTest() throws InterruptedException, ExecutionException {
4851

49-
SimpleDateFormat f = new SimpleDateFormat(
50-
"EEE");
52+
SimpleDateFormat f = new SimpleDateFormat("EEE");
5153
String date = f.format(new Date());
5254
Thread.sleep(1000);
5355

54-
assertThat(rest.post("http://localhost:8080/registry-app/service-registry/schedule"),
55-
is("{\"status\":\"success\"}"));
56+
assertThat(rest.post(baseUrl + "/schedule"), is("{\"status\":\"success\"}"));
5657
Thread.sleep(1000);
57-
assertThat(rest.getJson("http://localhost:8080/registry-app/service-registry/list"),
58-
containsString("[{\"port\":8080,"));
59-
assertThat(rest.getJson("http://localhost:8080/registry-app/service-registry/list"),
60-
containsString("externalPort\":8080"));
6158

62-
sendPing(new RegisterEntry(
63-
8081, "use-ip", "hello", "world", new Date(), "my-target", 8082));
59+
String listResponse = rest.getJson(baseUrl + "/list");
60+
61+
assertThat(listResponse, containsString("[{\"port\":8080,"));
62+
assertThat(listResponse, containsString("externalPort\":8080"));
63+
64+
sendPing("1", 8081, "use-ip", "hello", "world", "my-target", 8082);
6465
Thread.sleep(1000);
65-
System.out.println(rest.getJson("http://localhost:8080/registry-app/service-registry/list"));
66-
assertThat(rest.getJson("http://localhost:8080/registry-app/service-registry/list"),
67-
containsString("{\"port\":8081,"));
68-
69-
assertThat(rest.getJson("http://localhost:8080/registry-app/service-registry/list"),
70-
containsString("\"target\":\"my-target\""));
71-
assertThat(rest.getJson("http://localhost:8080/registry-app/service-registry/list"),
72-
containsString("\"target\":\"configured-target\""));
73-
assertThat(rest.getJson("http://localhost:8080/registry-app/service-registry/list"),
74-
not(containsString("\"hostname\":\"test-host\"")));
75-
assertThat(rest.getJson("http://localhost:8080/registry-app/service-registry/list"),
76-
containsString("\"formattedDate\""));
77-
assertThat(rest.getJson("http://localhost:8080/registry-app/service-registry/list"),
78-
containsString("\"manifest\""));
79-
assertThat(rest.getJson("http://localhost:8080/registry-app/service-registry/list"),
80-
containsString("Manifest-Version"));
81-
82-
assertThat(rest.getJson("http://localhost:8080/registry-app/service-registry/list"), containsString(date));
66+
67+
listResponse = rest.getJson(baseUrl + "/list");;
68+
69+
assertThat(listResponse, containsString("{\"port\":8081,"));
70+
assertThat(listResponse, containsString("\"target\":\"my-target\""));
71+
assertThat(listResponse, containsString("\"target\":\"configured-target\""));
72+
assertThat(listResponse, not(containsString("\"hostname\":\"test-host\"")));
73+
assertThat(listResponse, containsString("\"formattedDate\""));
74+
assertThat(listResponse, containsString("\"manifest\""));
75+
assertThat(listResponse, containsString("Manifest-Version"));
76+
assertThat(listResponse, containsString(date));
8377

8478
}
8579

86-
private void sendPing(RegisterEntry entry) {
80+
@Test
81+
public void filterTest() throws Exception {
82+
Thread.sleep(1000);
8783

88-
try {
84+
List<RegisterEntry> entries = list();
85+
assertThat(entries.size(), is(1));
8986

90-
restAsync.post("http://localhost:8080/registry-app/service-registry/register",
91-
JacksonUtil.serializeToJson(entry))
92-
.join();
93-
} catch (Exception e) {
87+
sendPing("121", 8080, "host1", "module1", "context1", "target1", 9080);
88+
sendPing("122", 8080, "host2", "module1", "context1", "target1", 9080);
89+
sendPing("131", 6080, "host3", "module2", "context2", "target2", 7080);
90+
sendPing("132", 6080, "host4", "module2", "context2", "target2", 7080);
91+
92+
entries = list();
93+
assertThat(entries.size(), is(5));
94+
95+
entries = list("port=8080");
96+
assertThat(entries.size(), is(3));
97+
98+
entries = list("port=8080", "externalPort=9080");
99+
System.out.println(entries);
100+
assertThat(entries.size(), is(2));
94101

95-
}
102+
entries = list("port=8080", "externalPort=9080", "module=module", "context=context1");
103+
assertThat(entries.size(), is(2));
104+
105+
entries = list("port=8080", "externalPort=9080", "module=module", "context=context1", "hostname=host1");
106+
assertThat(entries.size(), is(1));
107+
108+
entries = list("port=8080", "externalPort=9080", "module=module1", "context=context2");
109+
assertThat(entries.size(), is(0));
110+
111+
entries = list("manifest.Implementation-Version=version");
112+
assertThat(entries.size(), is(4));
113+
114+
entries = list("manifest.Implementation-Version=version1");
115+
assertThat(entries.size(), is(4));
116+
117+
entries = list("manifest.Implementation-Version=version121");
118+
assertThat(entries.size(), is(1));
119+
120+
entries = list("manifest.Implementation-revision=rev12");
121+
assertThat(entries.size(), is(2));
122+
123+
entries = list("manifest.Implementation-Timestamp=2017_13");
124+
assertThat(entries.size(), is(2));
125+
126+
entries = list("health=OK");
127+
assertThat(entries.size(), is(5));
128+
129+
List<String> list = JacksonUtil.convertFromJson(rest.getJson(baseUrl + "/list?port=OK"), new TypeReference<List<String>>() {});
130+
assertThat(list.size(), is(1));
131+
assertThat(list.get(0), is("Bad Request: 'OK' is not a valid number."));
132+
133+
list = JacksonUtil.convertFromJson(rest.getJson(baseUrl + "/list?health=Suspended"), new TypeReference<List<String>>() {});
134+
assertThat(list.size(), is(1));
135+
assertThat(list.get(0), is("Bad Request: 'Suspended' is not valid, valid values are [OK, ERROR]"));
96136
}
97137

98-
public static void main(String[] args) {
99-
RegistryAppRunner appRunner = new RegistryAppRunner();
100-
appRunner.startServer();
138+
private List<RegisterEntry> list(String... parameters) {
139+
String url = baseUrl + "/list?" + Stream.of(parameters).collect(joining("&"));
140+
return JacksonUtil.convertFromJson(rest.getJson(url), new TypeReference<List<RegisterEntry>>() {});
101141
}
102142

143+
private void sendPing(String uuid, int port, String hostName, String module, String context, String target, int externalPort) {
144+
try {
145+
RegisterEntry re = RegisterEntry.builder()
146+
.port(port)
147+
.hostname(hostName)
148+
.module(module)
149+
.context(context)
150+
.time(new Date())
151+
.uuid(uuid)
152+
.target(target)
153+
.externalPort(externalPort)
154+
.build();
155+
re.getManifest().put("Implementation-revision", "rev" + uuid);
156+
re.getManifest().put("Implementation-Version", "version" + uuid);
157+
re.getManifest().put("Implementation-Timestamp", "2017_" + uuid);
158+
restAsync.post("http://localhost:8080/registry-app/service-registry/register",
159+
JacksonUtil.serializeToJson(re))
160+
.get();
161+
} catch (Exception e) {}
162+
}
103163
}

0 commit comments

Comments
 (0)