diff --git a/sdk/pom.xml b/sdk/pom.xml
index a55bc782b5..650e5ba593 100644
--- a/sdk/pom.xml
+++ b/sdk/pom.xml
@@ -53,7 +53,9 @@
test
-
+
+ true
+
@@ -88,6 +90,9 @@
org.apache.maven.plugins
maven-failsafe-plugin
2.22.2
+
+ ${skipITs}
+
@@ -97,6 +102,55 @@
+
+ org.jacoco
+ jacoco-maven-plugin
+ 0.8.4
+
+
+ default-prepare-agent
+
+ prepare-agent
+
+
+
+ report
+ test
+
+ report
+
+
+
+ check
+
+ check
+
+
+
+
+ CLASS
+
+
+ LINE
+ COVEREDRATIO
+ 0.00
+
+
+ BRANCH
+ COVEREDRATIO
+ 0.00
+
+
+
+ io.dapr.utils.Constants
+
+
+
+
+
+
+
+
diff --git a/sdk/src/main/java/io/dapr/actors/ActorId.java b/sdk/src/main/java/io/dapr/actors/ActorId.java
index 77a5f235b3..d49e86bc1f 100644
--- a/sdk/src/main/java/io/dapr/actors/ActorId.java
+++ b/sdk/src/main/java/io/dapr/actors/ActorId.java
@@ -111,22 +111,7 @@ public static ActorId createRandom() {
return new ActorId(id.toString());
}
- /**
- * Determines whether two specified actorIds have the same id.
- *
- * @param id1 The first actorId to compare, or null
- * @param id2 The second actorId to compare, or null.
- * @return true if the id is same for both objects; otherwise, false.
- */
- private static boolean equals(ActorId id1, ActorId id2) {
- if (id1 == null && id2 == null) {
- return true;
- } else if (id2 == null || id1 == null) {
- return false;
- } else {
- return hasEqualContent(id1, id2);
- }
- }
+
/**
* Compares if two actors have the same content.
diff --git a/sdk/src/main/java/io/dapr/actors/client/ActorProxyImpl.java b/sdk/src/main/java/io/dapr/actors/client/ActorProxyImpl.java
index 6e94e07964..c4877e1046 100644
--- a/sdk/src/main/java/io/dapr/actors/client/ActorProxyImpl.java
+++ b/sdk/src/main/java/io/dapr/actors/client/ActorProxyImpl.java
@@ -67,14 +67,14 @@ public String getActorType() {
public Mono invokeActorMethod(String methodName, Object data, Class clazz) {
try {
Mono result = this.daprClient.invokeActorMethod(
- actorType,
- actorId.toString(),
- methodName,
- this.wrap(data));
+ actorType,
+ actorId.toString(),
+ methodName,
+ this.wrap(data));
return result
- .filter(s -> (s != null) && (!s.isEmpty()))
- .map(s -> unwrap(s, clazz));
+ .filter(s -> (s != null) && (!s.isEmpty()))
+ .map(s -> unwrap(s, clazz));
} catch (IOException e) {
return Mono.error(e);
}
@@ -87,8 +87,8 @@ public Mono invokeActorMethod(String methodName, Object data, Class cl
public Mono invokeActorMethod(String methodName, Class clazz) {
Mono result = this.daprClient.invokeActorMethod(actorType, actorId.toString(), methodName, null);
return result
- .filter(s -> (s != null) && (!s.isEmpty()))
- .map(s -> unwrap(s, clazz));
+ .filter(s -> (s != null) && (!s.isEmpty()))
+ .map(s -> unwrap(s, clazz));
}
/**
@@ -107,10 +107,10 @@ public Mono invokeActorMethod(String methodName) {
public Mono invokeActorMethod(String methodName, Object data) {
try {
Mono result = this.daprClient.invokeActorMethod(
- actorType,
- actorId.toString(),
- methodName,
- this.wrap(data));
+ actorType,
+ actorId.toString(),
+ methodName,
+ this.wrap(data));
return result.then();
} catch (IOException e) {
return Mono.error(e);
diff --git a/sdk/src/test/java/io/dapr/actors/ActorIdTest.java b/sdk/src/test/java/io/dapr/actors/ActorIdTest.java
index ab62f0e33b..fe512ae844 100644
--- a/sdk/src/test/java/io/dapr/actors/ActorIdTest.java
+++ b/sdk/src/test/java/io/dapr/actors/ActorIdTest.java
@@ -46,7 +46,7 @@ public void verifyEqualsByActorId() {
List values = createEqualsTestValues();
for (Wrapper w : values) {
ActorId a1 = (ActorId) w.item1;
- ActorId a2 = (ActorId) w.item2;
+ Object a2 = w.item2;
Assert.assertEquals(w.expectedResult, a1.equals(a2));
}
}
@@ -65,6 +65,7 @@ private List createEqualsTestValues() {
List list = new ArrayList();
list.add(new Wrapper(new ActorId("1"), null, false));
list.add(new Wrapper(new ActorId("1"), new ActorId("1"), true));
+ list.add(new Wrapper(new ActorId("1"), new Object(), false));
list.add(new Wrapper(new ActorId("1"), new ActorId("2"), false));
return list;
diff --git a/sdk/src/test/java/io/dapr/actors/client/ActorProxyBuilderTest.java b/sdk/src/test/java/io/dapr/actors/client/ActorProxyBuilderTest.java
new file mode 100644
index 0000000000..bc91f9a51e
--- /dev/null
+++ b/sdk/src/test/java/io/dapr/actors/client/ActorProxyBuilderTest.java
@@ -0,0 +1,54 @@
+package io.dapr.actors.client;
+
+import io.dapr.actors.ActorId;
+import org.junit.Assert;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class ActorProxyBuilderTest {
+
+ @Test(expected = IllegalArgumentException.class)
+ public void buildWithNullActorId() {
+ new ActorProxyBuilder()
+ .withActorId(null)
+ .withActorType("test")
+ .withPort(20)
+ .build();
+
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void buildWithEmptyActorType() {
+ new ActorProxyBuilder()
+ .withActorId(new ActorId("100"))
+ .withActorType("")
+ .withPort(20)
+ .build();
+
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void buildWithNullActorType() {
+ new ActorProxyBuilder()
+ .withActorId(new ActorId("100"))
+ .withActorType(null)
+ .withPort(20)
+ .build();
+
+ }
+
+ @Test()
+ public void build() {
+ ActorProxy actorProxy = new ActorProxyBuilder()
+ .withActorId(new ActorId("100"))
+ .withActorType("test")
+ .withPort(20)
+ .build();
+
+ Assert.assertNotNull(actorProxy);
+ Assert.assertEquals("test",actorProxy.getActorType());
+ Assert.assertEquals("100",actorProxy.getActorId().toString());
+
+ }
+}
\ No newline at end of file
diff --git a/sdk/src/test/java/io/dapr/actors/client/ActorProxyImplTest.java b/sdk/src/test/java/io/dapr/actors/client/ActorProxyImplTest.java
index 8c49d664b2..a1c4604cb8 100644
--- a/sdk/src/test/java/io/dapr/actors/client/ActorProxyImplTest.java
+++ b/sdk/src/test/java/io/dapr/actors/client/ActorProxyImplTest.java
@@ -4,18 +4,288 @@
import io.dapr.actors.runtime.ActorStateSerializer;
import org.junit.Assert;
import org.junit.Test;
+import org.mockito.Mockito;
+import reactor.core.publisher.Mono;
+
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
public class ActorProxyImplTest {
@Test()
public void constructorActorProxyTest() {
- final ActorProxyHttpAsyncClient actorProxyAsyncClient = (ActorProxyHttpAsyncClient)new ActorProxyClientBuilder().buildAsyncClient();
- final ActorProxyImpl actorProxy= new ActorProxyImpl(
- "myActorType",
- new ActorId("100"),
- new ActorStateSerializer(),
- actorProxyAsyncClient);
- Assert.assertEquals(actorProxy.getActorId().toString(),"100");
- Assert.assertEquals(actorProxy.getActorType(),"myActorType");
+ final ActorProxyHttpAsyncClient actorProxyAsyncClient = mock(ActorProxyHttpAsyncClient.class);
+ final ActorStateSerializer serializer = mock(ActorStateSerializer.class);
+ final ActorProxyImpl actorProxy = new ActorProxyImpl(
+ "myActorType",
+ new ActorId("100"),
+ serializer,
+ actorProxyAsyncClient);
+ Assert.assertEquals(actorProxy.getActorId().toString(), "100");
+ Assert.assertEquals(actorProxy.getActorType(), "myActorType");
+ }
+
+ @Test()
+ public void invokeActorMethodWithoutDataWithReturnType() {
+ final ActorProxyHttpAsyncClient actorProxyAsyncClient = mock(ActorProxyHttpAsyncClient.class);
+ when(actorProxyAsyncClient.invokeActorMethod(anyString(), anyString(), anyString(), Mockito.isNull()))
+ .thenReturn(Mono.just("{\n" +
+ "\t\"data\": \"ewoJCSJwcm9wZXJ0eUEiOiAidmFsdWVBIiwKCQkicHJvcGVydHlCIjogInZhbHVlQiIKCX0=\"\n" +
+ "}"));
+
+ final ActorProxy actorProxy = new ActorProxyImpl(
+ "myActorType",
+ new ActorId("100"),
+ new ActorStateSerializer(),
+ actorProxyAsyncClient);
+
+ Mono result = actorProxy.invokeActorMethod("getData", MyData.class);
+ MyData myData = result.block();
+ Assert.assertNotNull(myData);
+ Assert.assertEquals("valueA", myData.getPropertyA());
+ Assert.assertEquals("valueB", myData.getPropertyB());
+ }
+
+ @Test()
+ public void invokeActorMethodWithoutDataWithEmptyReturnType() {
+ final ActorProxyHttpAsyncClient actorProxyAsyncClient = mock(ActorProxyHttpAsyncClient.class);
+ when(actorProxyAsyncClient.invokeActorMethod(anyString(), anyString(), anyString(), Mockito.isNull()))
+ .thenReturn(Mono.just(""));
+
+ final ActorProxy actorProxy = new ActorProxyImpl(
+ "myActorType",
+ new ActorId("100"),
+ new ActorStateSerializer(),
+ actorProxyAsyncClient);
+
+ Mono result = actorProxy.invokeActorMethod("getData", MyData.class);
+ MyData myData = result.block();
+ Assert.assertNull(myData);
+ }
+
+ @Test(expected = RuntimeException.class)
+ public void invokeActorMethodWithIncorrectReturnType() {
+ final ActorProxyHttpAsyncClient actorProxyAsyncClient = mock(ActorProxyHttpAsyncClient.class);
+ when(actorProxyAsyncClient.invokeActorMethod(anyString(), anyString(), anyString(), Mockito.isNull()))
+ .thenReturn(Mono.just("{test}"));
+
+ final ActorProxy actorProxy = new ActorProxyImpl(
+ "myActorType",
+ new ActorId("100"),
+ new ActorStateSerializer(),
+ actorProxyAsyncClient);
+
+ Mono result = actorProxy.invokeActorMethod("getData", MyData.class);
+
+ result.doOnSuccess(x ->
+ Assert.fail("Not exception was throw"))
+ .doOnError(Throwable::printStackTrace
+ ).block();
+
+
+ }
+
+ @Test()
+ public void invokeActorMethodSavingDataWithReturnType() {
+ final ActorProxyHttpAsyncClient actorProxyAsyncClient = mock(ActorProxyHttpAsyncClient.class);
+ when(actorProxyAsyncClient.invokeActorMethod(anyString(), anyString(), anyString(), Mockito.isNotNull()))
+ .thenReturn(Mono.just("{\n" +
+ "\t\"data\": \"ewoJCSJwcm9wZXJ0eUEiOiAidmFsdWVBIiwKCQkicHJvcGVydHlCIjogInZhbHVlQiIKCX0=\"\n" +
+ "}"));
+
+ final ActorProxy actorProxy = new ActorProxyImpl(
+ "myActorType",
+ new ActorId("100"),
+ new ActorStateSerializer(),
+ actorProxyAsyncClient);
+
+ MyData saveData = new MyData();
+ saveData.setPropertyA("valueA");
+ saveData.setPropertyB("valueB");
+
+ Mono result = actorProxy.invokeActorMethod("getData", saveData, MyData.class);
+ MyData myData = result.block();
+ Assert.assertNotNull(myData);
+ Assert.assertEquals("valueA", myData.getPropertyA());
+ Assert.assertEquals("valueB", myData.getPropertyB());
+
}
+
+ @Test(expected = RuntimeException.class)
+ public void invokeActorMethodSavingDataWithIncorrectReturnType() {
+ final ActorProxyHttpAsyncClient actorProxyAsyncClient = mock(ActorProxyHttpAsyncClient.class);
+ when(actorProxyAsyncClient.invokeActorMethod(anyString(), anyString(), anyString(), Mockito.isNotNull()))
+ .thenReturn(Mono.just("{test}"));
+
+ final ActorProxy actorProxy = new ActorProxyImpl(
+ "myActorType",
+ new ActorId("100"),
+ new ActorStateSerializer(),
+ actorProxyAsyncClient);
+
+ MyData saveData = new MyData();
+ saveData.setPropertyA("valueA");
+ saveData.setPropertyB("valueB");
+
+ Mono result = actorProxy.invokeActorMethod("getData", saveData, MyData.class);
+ result.doOnSuccess(x ->
+ Assert.fail("Not exception was throw"))
+ .doOnError(Throwable::printStackTrace
+ ).block();
+
+ }
+
+ @Test()
+ public void invokeActorMethodSavingDataWithEmptyReturnType() {
+ final ActorProxyHttpAsyncClient actorProxyAsyncClient = mock(ActorProxyHttpAsyncClient.class);
+ when(actorProxyAsyncClient.invokeActorMethod(anyString(), anyString(), anyString(), Mockito.isNotNull()))
+ .thenReturn(Mono.just(""));
+
+ final ActorProxy actorProxy = new ActorProxyImpl(
+ "myActorType",
+ new ActorId("100"),
+ new ActorStateSerializer(),
+ actorProxyAsyncClient);
+
+ MyData saveData = new MyData();
+ saveData.setPropertyA("valueA");
+ saveData.setPropertyB("valueB");
+
+ Mono result = actorProxy.invokeActorMethod("getData", saveData, MyData.class);
+ MyData myData = result.block();
+ Assert.assertNull(myData);
+ }
+
+
+ @Test(expected = RuntimeException.class)
+ public void invokeActorMethodSavingDataWithIncorrectInputType() {
+ final ActorProxyHttpAsyncClient actorProxyAsyncClient = mock(ActorProxyHttpAsyncClient.class);
+ when(actorProxyAsyncClient.invokeActorMethod(anyString(), anyString(), anyString(), Mockito.isNotNull()))
+ .thenReturn(Mono.just("{test}"));
+
+ final ActorProxy actorProxy = new ActorProxyImpl(
+ "myActorType",
+ new ActorId("100"),
+ new ActorStateSerializer(),
+ actorProxyAsyncClient);
+
+ MyData saveData = new MyData();
+ saveData.setPropertyA("valueA");
+ saveData.setPropertyB("valueB");
+ saveData.setMyData(saveData);
+
+ Mono result = actorProxy.invokeActorMethod("getData", saveData, MyData.class);
+ result.doOnSuccess(x ->
+ Assert.fail("Not exception was throw"))
+ .doOnError(Throwable::printStackTrace
+ ).block();
+
+ }
+
+ @Test()
+ public void invokeActorMethodWithDataWithVoidReturnType() {
+ MyData saveData = new MyData();
+ saveData.setPropertyA("valueA");
+ saveData.setPropertyB("valueB");
+
+ final ActorProxyHttpAsyncClient actorProxyAsyncClient = mock(ActorProxyHttpAsyncClient.class);
+ when(actorProxyAsyncClient.invokeActorMethod(anyString(), anyString(), anyString(), Mockito.isNotNull()))
+ .thenReturn(Mono.empty());
+
+ final ActorProxy actorProxy = new ActorProxyImpl(
+ "myActorType",
+ new ActorId("100"),
+ new ActorStateSerializer(),
+ actorProxyAsyncClient);
+
+ Mono result = actorProxy.invokeActorMethod("getData", saveData);
+ Void emptyResponse = result.block();
+ Assert.assertNull(emptyResponse);
+ }
+
+
+ @Test(expected = RuntimeException.class)
+ public void invokeActorMethodWithDataWithVoidIncorrectInputType() {
+ MyData saveData = new MyData();
+ saveData.setPropertyA("valueA");
+ saveData.setPropertyB("valueB");
+ saveData.setMyData(saveData);
+
+ final ActorProxyHttpAsyncClient actorProxyAsyncClient = mock(ActorProxyHttpAsyncClient.class);
+ when(actorProxyAsyncClient.invokeActorMethod(anyString(), anyString(), anyString(), Mockito.isNotNull()))
+ .thenReturn(Mono.empty());
+
+ final ActorProxy actorProxy = new ActorProxyImpl(
+ "myActorType",
+ new ActorId("100"),
+ new ActorStateSerializer(),
+ actorProxyAsyncClient);
+
+ Mono result = actorProxy.invokeActorMethod("getData", saveData);
+ Void emptyResponse = result.doOnError(Throwable::printStackTrace).block();
+ Assert.assertNull(emptyResponse);
+ }
+
+ @Test()
+ public void invokeActorMethodWithoutDataWithVoidReturnType() {
+ final ActorProxyHttpAsyncClient actorProxyAsyncClient = mock(ActorProxyHttpAsyncClient.class);
+ when(actorProxyAsyncClient.invokeActorMethod(anyString(), anyString(), anyString(), Mockito.isNull()))
+ .thenReturn(Mono.empty());
+
+ final ActorProxy actorProxy = new ActorProxyImpl(
+ "myActorType",
+ new ActorId("100"),
+ new ActorStateSerializer(),
+ actorProxyAsyncClient);
+
+ Mono result = actorProxy.invokeActorMethod("getData");
+ Void emptyResponse = result.block();
+ Assert.assertNull(emptyResponse);
+ }
+
+ static class MyData {
+
+ /// Gets or sets the value for PropertyA.
+ private String propertyA;
+
+ /// Gets or sets the value for PropertyB.
+ private String propertyB;
+
+ private MyData myData;
+
+
+ public String getPropertyB() {
+ return propertyB;
+ }
+
+ public void setPropertyB(String propertyB) {
+ this.propertyB = propertyB;
+ }
+
+ public String getPropertyA() {
+ return propertyA;
+ }
+
+ public void setPropertyA(String propertyA) {
+ this.propertyA = propertyA;
+ }
+
+ @Override
+ public String toString() {
+ return "MyData{" +
+ "propertyA='" + propertyA + '\'' +
+ ", propertyB='" + propertyB + '\'' +
+ '}';
+ }
+
+ public MyData getMyData() {
+ return myData;
+ }
+
+ public void setMyData(MyData myData) {
+ this.myData = myData;
+ }
+ }
+
}