diff --git a/sdk/src/test/java/io/dapr/client/DaprClientGrpcTest.java b/sdk/src/test/java/io/dapr/client/DaprClientGrpcTest.java index 525b32c51..0df44775b 100644 --- a/sdk/src/test/java/io/dapr/client/DaprClientGrpcTest.java +++ b/sdk/src/test/java/io/dapr/client/DaprClientGrpcTest.java @@ -34,6 +34,7 @@ import io.grpc.stub.StreamObserver; import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatcher; import org.mockito.stubbing.Answer; import reactor.core.publisher.Mono; @@ -43,6 +44,7 @@ import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; @@ -1548,6 +1550,29 @@ public class DaprClientGrpcTest { }); } + @Test + public void saveBulkStateTestNullEtag() { + List> states = new ArrayList>(); + states.add(new State("null_etag_value", "null_etag_key", null, (StateOptions)null)); + states.add(new State("empty_etag_value", "empty_etag_key", "", (StateOptions)null)); + + ArgumentCaptor argument = ArgumentCaptor.forClass(DaprProtos.SaveStateRequest.class); + doAnswer((Answer) invocation -> { + StreamObserver observer = (StreamObserver) invocation.getArguments()[1]; + observer.onNext(Empty.getDefaultInstance()); + observer.onCompleted(); + return null; + }).when(daprStub).saveState(argument.capture(), any()); + + StateOptions options = buildStateOptions(StateOptions.Consistency.STRONG, StateOptions.Concurrency.FIRST_WRITE); + Mono result = client.saveBulkState(STATE_STORE_NAME, states); + + result.block(); + assertFalse(argument.getValue().getStates(0).hasEtag()); + assertTrue(argument.getValue().getStates(1).hasEtag()); + assertEquals("", argument.getValue().getStates(1).getEtag().getValue()); + } + @Test public void saveStateExceptionThrownTest() { String key = "key1"; @@ -1621,6 +1646,26 @@ public class DaprClientGrpcTest { result.block(); } + @Test + public void saveStateTestNullEtag() { + String key = "key1"; + String etag = null; + String value = "State value"; + ArgumentCaptor argument = ArgumentCaptor.forClass(DaprProtos.SaveStateRequest.class); + doAnswer((Answer) invocation -> { + StreamObserver observer = (StreamObserver) invocation.getArguments()[1]; + observer.onNext(Empty.getDefaultInstance()); + observer.onCompleted(); + return null; + }).when(daprStub).saveState(argument.capture(), any()); + + StateOptions options = buildStateOptions(StateOptions.Consistency.STRONG, StateOptions.Concurrency.FIRST_WRITE); + Mono result = client.saveState(STATE_STORE_NAME, key, etag, value, options); + + result.block(); + assertFalse(argument.getValue().getStates(0).hasEtag()); + } + @Test public void saveStateTestNoHotMono() { AtomicBoolean called = new AtomicBoolean(false); @@ -1765,6 +1810,25 @@ public class DaprClientGrpcTest { resultDelete.block(); } + @Test + public void deleteStateNullEtag() { + String key = "key1"; + String etag = null; + ArgumentCaptor argument = ArgumentCaptor.forClass(DaprProtos.DeleteStateRequest.class); + doAnswer((Answer) invocation -> { + StreamObserver observer = (StreamObserver) invocation.getArguments()[1]; + observer.onNext(Empty.getDefaultInstance()); + observer.onCompleted(); + return null; + }).when(daprStub).deleteState(argument.capture(), any()); + + StateOptions options = buildStateOptions(StateOptions.Consistency.STRONG, StateOptions.Concurrency.FIRST_WRITE); + Mono result = client.deleteState(STATE_STORE_NAME, key, etag, options); + + result.block(); + assertFalse(argument.getValue().hasEtag()); + } + @Test public void getStateNullEtag() throws Exception { String etag = null;