Skip to content

Commit a35e414

Browse files
authored
set etag to be null if it's empty (dapr#414)
Signed-off-by: Arghya Sadhu <[email protected]>
1 parent 7f1ce0b commit a35e414

File tree

5 files changed

+75
-10
lines changed

5 files changed

+75
-10
lines changed

sdk-tests/src/test/java/io/dapr/it/state/AbstractStateClientIT.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,11 @@ public void getStateKeyNotFound() {
7474
Assert.assertNotNull(state);
7575
Assert.assertEquals("unknownKey", state.getKey());
7676
Assert.assertNull(state.getValue());
77-
// gRPC returns empty eTag while HTTP returns null.
78-
// TODO(artursouza): https://github.com/dapr/java-sdk/issues/405
79-
Assert.assertTrue(state.getEtag() == null || state.getEtag().isEmpty());
77+
Assert.assertNull(state.getEtag());
8078
}
8179

8280
@Test
83-
public void saveAndGetBulkStates() {
81+
public void saveAndGetBulkState() {
8482
final String stateKeyOne = UUID.randomUUID().toString();
8583
final String stateKeyTwo = UUID.randomUUID().toString();
8684
final String stateKeyThree = "NotFound";
@@ -114,8 +112,8 @@ public void saveAndGetBulkStates() {
114112

115113
assertEquals(stateKeyThree, result.stream().skip(2).findFirst().get().getKey());
116114
assertNull(result.stream().skip(2).findFirst().get().getValue());
117-
assertEquals("", result.stream().skip(2).findFirst().get().getEtag());
118-
assertNull("not found", result.stream().skip(2).findFirst().get().getError());
115+
assertNull(result.stream().skip(2).findFirst().get().getEtag());
116+
assertNull(result.stream().skip(2).findFirst().get().getError());
119117
}
120118

121119
@Test

sdk/src/main/java/io/dapr/client/DaprClientGrpc.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,9 @@ private <T> State<T> buildStateKeyValue(
320320
byte[] data = payload == null ? null : payload.toByteArray();
321321
T value = stateSerializer.deserialize(data, type);
322322
String etag = item.getEtag();
323+
if (etag.equals("")) {
324+
etag = null;
325+
}
323326
return new State<>(value, key, etag, item.getMetadataMap(), null);
324327
}
325328

@@ -332,6 +335,9 @@ private <T> State<T> buildStateKeyValue(
332335
byte[] data = payload == null ? null : payload.toByteArray();
333336
T value = stateSerializer.deserialize(data, type);
334337
String etag = response.getEtag();
338+
if (etag.equals("")) {
339+
etag = null;
340+
}
335341
return new State<>(value, requestedKey, etag, response.getMetadataMap(), stateOptions);
336342
}
337343

sdk/src/main/java/io/dapr/client/DaprClientHttp.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,9 @@ private <T> List<State<T>> buildStates(
542542
}
543543

544544
String etag = node.path("etag").asText();
545+
if (etag.equals("")) {
546+
etag = null;
547+
}
545548
// TODO(artursouza): JSON cannot differentiate if data returned is String or byte[], it is ambiguous.
546549
// This is not a high priority since GRPC is the default (and recommended) client implementation.
547550
byte[] data = node.path("data").toString().getBytes(Properties.STRING_CHARSET.get());

sdk/src/test/java/io/dapr/client/DaprClientGrpcTest.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1657,6 +1657,62 @@ public void getStateThenDelete() throws Exception {
16571657
assertTrue(callbackDelete.wasCalled);
16581658
}
16591659

1660+
@Test
1661+
public void getStateNullEtag() throws Exception {
1662+
String etag = null;
1663+
String key1 = "key1";
1664+
String expectedValue1 = "Expected state 1";
1665+
State<String> expectedState1 = buildStateKey(expectedValue1, key1, etag, new HashMap<>(), null);
1666+
Map<String, SettableFuture<DaprProtos.GetStateResponse>> futuresMap = new HashMap<>();
1667+
DaprProtos.GetStateResponse envelope = DaprProtos.GetStateResponse.newBuilder()
1668+
.setData(serialize(expectedValue1))
1669+
.build();
1670+
SettableFuture<DaprProtos.GetStateResponse> settableFuture = SettableFuture.create();
1671+
MockCallback<DaprProtos.GetStateResponse> callback = new MockCallback<>(envelope);
1672+
addCallback(settableFuture, callback, directExecutor());
1673+
settableFuture.set(envelope);
1674+
futuresMap.put(key1, settableFuture);
1675+
when(client.getState(argThat(new GetStateRequestKeyMatcher(key1)))).thenReturn(futuresMap.get(key1));
1676+
State<String> keyRequest1 = buildStateKey(null, key1, null, null);
1677+
Mono<State<String>> resultGet1 = adapter.getState(STATE_STORE_NAME, keyRequest1, String.class);
1678+
assertEquals(expectedState1, resultGet1.block());
1679+
}
1680+
1681+
@Test
1682+
public void getBulkStateNullEtag() throws Exception {
1683+
DaprProtos.GetBulkStateResponse responseEnvelope = DaprProtos.GetBulkStateResponse.newBuilder()
1684+
.addItems(DaprProtos.BulkStateItem.newBuilder()
1685+
.setData(serialize("hello world"))
1686+
.setKey("100")
1687+
.build())
1688+
.addItems(DaprProtos.BulkStateItem.newBuilder()
1689+
.setKey("200")
1690+
.setEtag("")
1691+
.setError("not found")
1692+
.build())
1693+
.build();
1694+
SettableFuture<DaprProtos.GetBulkStateResponse> settableFuture = SettableFuture.create();
1695+
MockCallback<DaprProtos.GetBulkStateResponse> callback = new MockCallback<>(responseEnvelope);
1696+
addCallback(settableFuture, callback, directExecutor());
1697+
when(client.getBulkState(any(DaprProtos.GetBulkStateRequest.class)))
1698+
.thenAnswer(c -> {
1699+
settableFuture.set(responseEnvelope);
1700+
return settableFuture;
1701+
});
1702+
List<State<String>> result = adapter.getBulkState(STATE_STORE_NAME, Arrays.asList("100", "200"), String.class).block();
1703+
assertTrue(callback.wasCalled);
1704+
1705+
assertEquals(2, result.size());
1706+
assertEquals("100", result.stream().findFirst().get().getKey());
1707+
assertEquals("hello world", result.stream().findFirst().get().getValue());
1708+
assertNull(result.stream().findFirst().get().getEtag());
1709+
assertNull(result.stream().findFirst().get().getError());
1710+
assertEquals("200", result.stream().skip(1).findFirst().get().getKey());
1711+
assertNull(result.stream().skip(1).findFirst().get().getValue());
1712+
assertNull(result.stream().skip(1).findFirst().get().getEtag());
1713+
assertEquals("not found", result.stream().skip(1).findFirst().get().getError());
1714+
}
1715+
16601716
@Test
16611717
public void getSecrets() {
16621718
String expectedKey = "attributeKey";

sdk/src/test/java/io/dapr/client/DaprClientHttpTest.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -640,8 +640,9 @@ public void getStatesEmptyEtag() {
640640
.respond("\"" + EXPECTED_RESULT + "\"");
641641
daprHttp = new DaprHttp(Properties.SIDECAR_IP.get(), 3000, okHttpClient);
642642
daprClientHttp = new DaprClientHttp(daprHttp);
643-
Mono<State<String>> monoEmptyEtag = daprClientHttp.getState(STATE_STORE_NAME, stateEmptyEtag, String.class);
644-
assertEquals(monoEmptyEtag.block().getKey(), "key");
643+
State<String> monoEmptyEtag = daprClientHttp.getState(STATE_STORE_NAME, stateEmptyEtag, String.class).block();
644+
assertEquals(monoEmptyEtag.getKey(), "key");
645+
assertNull(monoEmptyEtag.getEtag());
645646
}
646647

647648
@Test
@@ -667,8 +668,9 @@ public void getStatesNullEtag() {
667668
.respond("\"" + EXPECTED_RESULT + "\"");
668669
daprHttp = new DaprHttp(Properties.SIDECAR_IP.get(), 3000, okHttpClient);
669670
daprClientHttp = new DaprClientHttp(daprHttp);
670-
Mono<State<String>> monoNullEtag = daprClientHttp.getState(STATE_STORE_NAME, stateNullEtag, String.class);
671-
assertEquals(monoNullEtag.block().getKey(), "key");
671+
State<String> monoNullEtag = daprClientHttp.getState(STATE_STORE_NAME, stateNullEtag, String.class).block();
672+
assertEquals(monoNullEtag.getKey(), "key");
673+
assertNull(monoNullEtag.getEtag());
672674
}
673675

674676
@Test

0 commit comments

Comments
 (0)