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; + } + } + }