Skip to content

Commit 194c30c

Browse files
committed
PR feedback.
1 parent ff2376e commit 194c30c

6 files changed

Lines changed: 62 additions & 46 deletions

File tree

lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/DefaultFDv2Requestor.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,14 @@ public DefaultFDv2Requestor(HttpProperties httpProperties, URI baseUri, String r
5757
}
5858

5959
@Override
60-
public CompletableFuture<FDv2PollingResponse> Poll(Selector selector) {
61-
CompletableFuture<FDv2PollingResponse> future = new CompletableFuture<>();
60+
public CompletableFuture<FDv2PayloadResponse> Poll(Selector selector) {
61+
CompletableFuture<FDv2PayloadResponse> future = new CompletableFuture<>();
6262

6363
try {
6464
// Build the request URI with query parameters
6565
URI requestUri = pollingUri;
6666

67-
if (selector.getVersion() > 0) {
67+
if (!selector.isEmpty()) {
6868
requestUri = HttpHelpers.addQueryParam(requestUri, VERSION_QUERY_PARAM, String.valueOf(selector.getVersion()));
6969
}
7070

@@ -131,6 +131,8 @@ public void onResponse(@Nonnull Call call, @Nonnull Response response) {
131131
}
132132
}
133133

134+
// If the code makes it here, then the body should not be empty.
135+
// If it is, then it is a logic/implementation error.
134136
// Parse the response body
135137
if (response.body() == null) {
136138
future.completeExceptionally(new IOException("Response body is null"));
@@ -143,7 +145,7 @@ public void onResponse(@Nonnull Call call, @Nonnull Response response) {
143145
List<FDv2Event> events = FDv2Event.parseEventsArray(responseBody);
144146

145147
// Create and return the response
146-
FDv2PollingResponse pollingResponse = new FDv2PollingResponse(events, response.headers());
148+
FDv2PayloadResponse pollingResponse = new FDv2PayloadResponse(events, response.headers());
147149
future.complete(pollingResponse);
148150

149151
} catch (IOException | SerializationException e) {

lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/FDv2DataSource.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ private void runSynchronizers() {
169169
}
170170

171171
private void runInitializers() {
172+
boolean anyDataReceived = false;
172173
for (InitializerFactory factory : initializers) {
173174
try {
174175
Initializer initializer = factory.build();
@@ -179,8 +180,12 @@ private void runInitializers() {
179180
switch (res.getResultType()) {
180181
case CHANGE_SET:
181182
// TODO: Apply to the store.
182-
dataSourceUpdates.updateStatus(DataSourceStatusProvider.State.VALID, null);
183-
startFuture.complete(true);
183+
anyDataReceived = true;
184+
if(!res.getChangeSet().getSelector().isEmpty()) {
185+
dataSourceUpdates.updateStatus(DataSourceStatusProvider.State.VALID, null);
186+
startFuture.complete(true);
187+
return;
188+
}
184189
return;
185190
case STATUS:
186191
// TODO: Implement.
@@ -189,6 +194,12 @@ private void runInitializers() {
189194
} catch (ExecutionException | InterruptedException | CancellationException e) {
190195
// TODO: Log.
191196
}
197+
// We received data without a selector, and we have exhausted initializers, so we are going to
198+
// conside ourselves initialized.
199+
if(anyDataReceived) {
200+
dataSourceUpdates.updateStatus(DataSourceStatusProvider.State.VALID, null);
201+
startFuture.complete(true);
202+
}
192203
}
193204
}
194205

lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/FDv2Requestor.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,16 @@
1313
* Interface for making FDv2 polling requests.
1414
*/
1515
interface FDv2Requestor {
16-
public static class FDv2PollingResponse {
16+
/**
17+
* Response for a set of FDv2 events that result in a payload. Either a full payload or the events required
18+
* to get from one payload version to another.
19+
* This isn't intended for use for implementations which may require multiple executions to get an entire payload.
20+
*/
21+
public static class FDv2PayloadResponse {
1722
private final List<FDv2Event> events;
1823
private final Headers headers;
1924

20-
public FDv2PollingResponse(List<FDv2Event> events, Headers headers) {
25+
public FDv2PayloadResponse(List<FDv2Event> events, Headers headers) {
2126
this.events = events;
2227
this.headers = headers;
2328
}
@@ -30,7 +35,7 @@ public Headers getHeaders() {
3035
return headers;
3136
}
3237
}
33-
CompletableFuture<FDv2PollingResponse> Poll(Selector selector);
38+
CompletableFuture<FDv2PayloadResponse> Poll(Selector selector);
3439

3540
void close();
3641
}

lib/sdk/server/src/test/java/com/launchdarkly/sdk/server/DefaultFDv2RequestorTest.java

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
import org.junit.Test;
1313

14-
import java.lang.reflect.Method;
1514
import java.net.URI;
1615
import java.util.List;
1716
import java.util.concurrent.CompletableFuture;
@@ -98,10 +97,10 @@ public void successfulRequestWithEvents() throws Exception {
9897

9998
try (HttpServer server = HttpServer.start(resp)) {
10099
try (DefaultFDv2Requestor requestor = makeRequestor(server)) {
101-
CompletableFuture<FDv2Requestor.FDv2PollingResponse> future =
100+
CompletableFuture<FDv2Requestor.FDv2PayloadResponse> future =
102101
requestor.Poll(Selector.EMPTY);
103102

104-
FDv2Requestor.FDv2PollingResponse response = future.get(5, TimeUnit.SECONDS);
103+
FDv2Requestor.FDv2PayloadResponse response = future.get(5, TimeUnit.SECONDS);
105104

106105
assertNotNull(response);
107106
assertNotNull(response.getEvents());
@@ -124,10 +123,10 @@ public void emptyEventsArray() throws Exception {
124123

125124
try (HttpServer server = HttpServer.start(resp)) {
126125
try (DefaultFDv2Requestor requestor = makeRequestor(server)) {
127-
CompletableFuture<FDv2Requestor.FDv2PollingResponse> future =
126+
CompletableFuture<FDv2Requestor.FDv2PayloadResponse> future =
128127
requestor.Poll(Selector.EMPTY);
129128

130-
FDv2Requestor.FDv2PollingResponse response = future.get(5, TimeUnit.SECONDS);
129+
FDv2Requestor.FDv2PayloadResponse response = future.get(5, TimeUnit.SECONDS);
131130

132131
assertNotNull(response);
133132
assertNotNull(response.getEvents());
@@ -144,7 +143,7 @@ public void requestWithVersionQueryParameter() throws Exception {
144143
try (DefaultFDv2Requestor requestor = makeRequestor(server)) {
145144
Selector selector = Selector.make(42, null);
146145

147-
CompletableFuture<FDv2Requestor.FDv2PollingResponse> future =
146+
CompletableFuture<FDv2Requestor.FDv2PayloadResponse> future =
148147
requestor.Poll(selector);
149148

150149
future.get(5, TimeUnit.SECONDS);
@@ -164,7 +163,7 @@ public void requestWithStateQueryParameter() throws Exception {
164163
try (DefaultFDv2Requestor requestor = makeRequestor(server)) {
165164
Selector selector = Selector.make(0, "test-state");
166165

167-
CompletableFuture<FDv2Requestor.FDv2PollingResponse> future =
166+
CompletableFuture<FDv2Requestor.FDv2PayloadResponse> future =
168167
requestor.Poll(selector);
169168

170169
future.get(5, TimeUnit.SECONDS);
@@ -184,7 +183,7 @@ public void requestWithBothQueryParameters() throws Exception {
184183
try (DefaultFDv2Requestor requestor = makeRequestor(server)) {
185184
Selector selector = Selector.make(100, "my-state");
186185

187-
CompletableFuture<FDv2Requestor.FDv2PollingResponse> future =
186+
CompletableFuture<FDv2Requestor.FDv2PayloadResponse> future =
188187
requestor.Poll(selector);
189188

190189
future.get(5, TimeUnit.SECONDS);
@@ -209,10 +208,10 @@ public void etagCachingWith304NotModified() throws Exception {
209208
try (HttpServer server = HttpServer.start(sequence)) {
210209
try (DefaultFDv2Requestor requestor = makeRequestor(server)) {
211210
// First request should succeed and cache the ETag
212-
CompletableFuture<FDv2Requestor.FDv2PollingResponse> future1 =
211+
CompletableFuture<FDv2Requestor.FDv2PayloadResponse> future1 =
213212
requestor.Poll(Selector.EMPTY);
214213

215-
FDv2Requestor.FDv2PollingResponse response1 = future1.get(5, TimeUnit.SECONDS);
214+
FDv2Requestor.FDv2PayloadResponse response1 = future1.get(5, TimeUnit.SECONDS);
216215
assertNotNull(response1);
217216
assertEquals(3, response1.getEvents().size());
218217

@@ -221,10 +220,10 @@ public void etagCachingWith304NotModified() throws Exception {
221220
assertEquals(null, req1.getHeader("If-None-Match"));
222221

223222
// Second request should send If-None-Match and receive 304
224-
CompletableFuture<FDv2Requestor.FDv2PollingResponse> future2 =
223+
CompletableFuture<FDv2Requestor.FDv2PayloadResponse> future2 =
225224
requestor.Poll(Selector.EMPTY);
226225

227-
FDv2Requestor.FDv2PollingResponse response2 = future2.get(5, TimeUnit.SECONDS);
226+
FDv2Requestor.FDv2PayloadResponse response2 = future2.get(5, TimeUnit.SECONDS);
228227
assertEquals(null, response2);
229228

230229
RequestInfo req2 = server.getRecorder().requireRequest();
@@ -302,7 +301,7 @@ public void httpErrorCodeThrowsException() throws Exception {
302301

303302
try (HttpServer server = HttpServer.start(resp)) {
304303
try (DefaultFDv2Requestor requestor = makeRequestor(server)) {
305-
CompletableFuture<FDv2Requestor.FDv2PollingResponse> future =
304+
CompletableFuture<FDv2Requestor.FDv2PayloadResponse> future =
306305
requestor.Poll(Selector.EMPTY);
307306

308307
try {
@@ -322,7 +321,7 @@ public void http404ThrowsException() throws Exception {
322321

323322
try (HttpServer server = HttpServer.start(resp)) {
324323
try (DefaultFDv2Requestor requestor = makeRequestor(server)) {
325-
CompletableFuture<FDv2Requestor.FDv2PollingResponse> future =
324+
CompletableFuture<FDv2Requestor.FDv2PayloadResponse> future =
326325
requestor.Poll(Selector.EMPTY);
327326

328327
try {
@@ -342,7 +341,7 @@ public void invalidJsonThrowsException() throws Exception {
342341

343342
try (HttpServer server = HttpServer.start(resp)) {
344343
try (DefaultFDv2Requestor requestor = makeRequestor(server)) {
345-
CompletableFuture<FDv2Requestor.FDv2PollingResponse> future =
344+
CompletableFuture<FDv2Requestor.FDv2PayloadResponse> future =
346345
requestor.Poll(Selector.EMPTY);
347346

348347
try {
@@ -361,7 +360,7 @@ public void missingEventsPropertyThrowsException() throws Exception {
361360

362361
try (HttpServer server = HttpServer.start(resp)) {
363362
try (DefaultFDv2Requestor requestor = makeRequestor(server)) {
364-
CompletableFuture<FDv2Requestor.FDv2PollingResponse> future =
363+
CompletableFuture<FDv2Requestor.FDv2PayloadResponse> future =
365364
requestor.Poll(Selector.EMPTY);
366365

367366
try {
@@ -384,7 +383,7 @@ public void baseUriCanHaveContextPath() throws Exception {
384383
try (DefaultFDv2Requestor requestor = new DefaultFDv2Requestor(
385384
makeHttpConfig(LDConfig.DEFAULT), uri, REQUEST_PATH, testLogger)) {
386385

387-
CompletableFuture<FDv2Requestor.FDv2PollingResponse> future =
386+
CompletableFuture<FDv2Requestor.FDv2PayloadResponse> future =
388387
requestor.Poll(Selector.EMPTY);
389388

390389
future.get(5, TimeUnit.SECONDS);
@@ -434,10 +433,10 @@ public void responseHeadersAreIncluded() throws Exception {
434433

435434
try (HttpServer server = HttpServer.start(resp)) {
436435
try (DefaultFDv2Requestor requestor = makeRequestor(server)) {
437-
CompletableFuture<FDv2Requestor.FDv2PollingResponse> future =
436+
CompletableFuture<FDv2Requestor.FDv2PayloadResponse> future =
438437
requestor.Poll(Selector.EMPTY);
439438

440-
FDv2Requestor.FDv2PollingResponse response = future.get(5, TimeUnit.SECONDS);
439+
FDv2Requestor.FDv2PayloadResponse response = future.get(5, TimeUnit.SECONDS);
441440

442441
assertNotNull(response);
443442
assertNotNull(response.getHeaders());

lib/sdk/server/src/test/java/com/launchdarkly/sdk/server/PollingInitializerImplTest.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
import java.io.IOException;
1313
import java.util.concurrent.CompletableFuture;
14-
import java.util.concurrent.ExecutionException;
1514
import java.util.concurrent.TimeUnit;
1615

1716
import static org.junit.Assert.assertEquals;
@@ -43,7 +42,7 @@ private <T> CompletableFuture<T> failedFuture(Throwable ex) {
4342
return future;
4443
}
4544

46-
private FDv2Requestor.FDv2PollingResponse makeSuccessResponse() {
45+
private FDv2Requestor.FDv2PayloadResponse makeSuccessResponse() {
4746
String json = "{\n" +
4847
" \"events\": [\n" +
4948
" {\n" +
@@ -68,7 +67,7 @@ private FDv2Requestor.FDv2PollingResponse makeSuccessResponse() {
6867
"}";
6968

7069
try {
71-
return new FDv2Requestor.FDv2PollingResponse(
70+
return new FDv2Requestor.FDv2PayloadResponse(
7271
com.launchdarkly.sdk.internal.fdv2.payloads.FDv2Event.parseEventsArray(json),
7372
okhttp3.Headers.of()
7473
);
@@ -82,7 +81,7 @@ public void successfulInitialization() throws Exception {
8281
FDv2Requestor requestor = mockRequestor();
8382
SelectorSource selectorSource = mockSelectorSource();
8483

85-
FDv2Requestor.FDv2PollingResponse response = makeSuccessResponse();
84+
FDv2Requestor.FDv2PayloadResponse response = makeSuccessResponse();
8685
when(requestor.Poll(any(Selector.class)))
8786
.thenReturn(CompletableFuture.completedFuture(response));
8887

@@ -188,7 +187,7 @@ public void shutdownBeforePollCompletes() throws Exception {
188187
FDv2Requestor requestor = mockRequestor();
189188
SelectorSource selectorSource = mockSelectorSource();
190189

191-
CompletableFuture<FDv2Requestor.FDv2PollingResponse> delayedResponse = new CompletableFuture<>();
190+
CompletableFuture<FDv2Requestor.FDv2PayloadResponse> delayedResponse = new CompletableFuture<>();
192191
when(requestor.Poll(any(Selector.class))).thenReturn(delayedResponse);
193192

194193
PollingInitializerImpl initializer = new PollingInitializerImpl(requestor, testLogger, selectorSource);
@@ -214,7 +213,7 @@ public void shutdownAfterPollCompletes() throws Exception {
214213
FDv2Requestor requestor = mockRequestor();
215214
SelectorSource selectorSource = mockSelectorSource();
216215

217-
FDv2Requestor.FDv2PollingResponse response = makeSuccessResponse();
216+
FDv2Requestor.FDv2PayloadResponse response = makeSuccessResponse();
218217
when(requestor.Poll(any(Selector.class)))
219218
.thenReturn(CompletableFuture.completedFuture(response));
220219

@@ -249,7 +248,7 @@ public void errorEventInResponse() throws Exception {
249248
" ]\n" +
250249
"}";
251250

252-
FDv2Requestor.FDv2PollingResponse response = new FDv2Requestor.FDv2PollingResponse(
251+
FDv2Requestor.FDv2PayloadResponse response = new FDv2Requestor.FDv2PayloadResponse(
253252
com.launchdarkly.sdk.internal.fdv2.payloads.FDv2Event.parseEventsArray(errorJson),
254253
okhttp3.Headers.of()
255254
);
@@ -285,7 +284,7 @@ public void goodbyeEventInResponse() throws Exception {
285284
" ]\n" +
286285
"}";
287286

288-
FDv2Requestor.FDv2PollingResponse response = new FDv2Requestor.FDv2PollingResponse(
287+
FDv2Requestor.FDv2PayloadResponse response = new FDv2Requestor.FDv2PayloadResponse(
289288
com.launchdarkly.sdk.internal.fdv2.payloads.FDv2Event.parseEventsArray(goodbyeJson),
290289
okhttp3.Headers.of()
291290
);
@@ -312,7 +311,7 @@ public void emptyEventsArray() throws Exception {
312311

313312
String emptyJson = "{\"events\": []}";
314313

315-
FDv2Requestor.FDv2PollingResponse response = new FDv2Requestor.FDv2PollingResponse(
314+
FDv2Requestor.FDv2PayloadResponse response = new FDv2Requestor.FDv2PayloadResponse(
316315
com.launchdarkly.sdk.internal.fdv2.payloads.FDv2Event.parseEventsArray(emptyJson),
317316
okhttp3.Headers.of()
318317
);

0 commit comments

Comments
 (0)