diff --git a/.gitignore b/.gitignore index db715d5666..76cb9c94c1 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ .run/ .vs/ .vscode/ +.devcontainer/ # Output folders **/target/ diff --git a/sdk-actors/pom.xml b/sdk-actors/pom.xml index ddabdf49bf..7c2b60cde2 100644 --- a/sdk-actors/pom.xml +++ b/sdk-actors/pom.xml @@ -61,6 +61,12 @@ ${grpc.version} test + + commons-validator + commons-validator + 1.7 + test + diff --git a/sdk-actors/src/test/java/io/dapr/actors/TestUtils.java b/sdk-actors/src/test/java/io/dapr/actors/TestUtils.java index 86ccccceed..5ccc453862 100644 --- a/sdk-actors/src/test/java/io/dapr/actors/TestUtils.java +++ b/sdk-actors/src/test/java/io/dapr/actors/TestUtils.java @@ -16,6 +16,7 @@ import io.dapr.exceptions.DaprException; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.function.Executable; +import org.apache.commons.validator.routines.InetAddressValidator; public final class TestUtils { @@ -54,4 +55,12 @@ public static void assertThrowsDaprException( Assertions.assertEquals(expectedErrorCode, daprException.getErrorCode()); Assertions.assertEquals(expectedErrorMessage, daprException.getMessage()); } -} + + public static String formatIpAddress(final String ipAddress) { + String formattedIpAddress = ipAddress; + if(InetAddressValidator.getInstance().isValidInet6Address(ipAddress)) { + formattedIpAddress = "[" + ipAddress + "]"; // per URL spec https://url.spec.whatwg.org/#host-writing + } + return formattedIpAddress; + } +} \ No newline at end of file diff --git a/sdk-actors/src/test/java/io/dapr/actors/client/DaprHttpClientTest.java b/sdk-actors/src/test/java/io/dapr/actors/client/DaprHttpClientTest.java index 634780a5f0..69e47bfd0b 100644 --- a/sdk-actors/src/test/java/io/dapr/actors/client/DaprHttpClientTest.java +++ b/sdk-actors/src/test/java/io/dapr/actors/client/DaprHttpClientTest.java @@ -25,6 +25,7 @@ import org.junit.jupiter.api.Test; import reactor.core.publisher.Mono; +import static io.dapr.actors.TestUtils.formatIpAddress; import static io.dapr.actors.TestUtils.assertThrowsDaprException; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -36,10 +37,13 @@ public class DaprHttpClientTest { private MockInterceptor mockInterceptor; + private String sidecarIp; + private final String EXPECTED_RESULT = "{\"data\":\"ewoJCSJwcm9wZXJ0eUEiOiAidmFsdWVBIiwKCQkicHJvcGVydHlCIjogInZhbHVlQiIKCX0=\"}"; @BeforeEach public void setUp() { + sidecarIp = formatIpAddress(Properties.SIDECAR_IP.get()); mockInterceptor = new MockInterceptor(Behavior.UNORDERED); okHttpClient = new OkHttpClient.Builder().addInterceptor(mockInterceptor).build(); } @@ -47,10 +51,26 @@ public void setUp() { @Test public void invokeActorMethod() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/actors/DemoActor/1/method/Payment") + .post("http://" + sidecarIp + ":3000/v1.0/actors/DemoActor/1/method/Payment") + .respond(EXPECTED_RESULT); + DaprHttp daprHttp = new DaprHttpProxy(sidecarIp, 3000, okHttpClient); + DaprHttpClient = new DaprHttpClient(daprHttp); + Mono mono = + DaprHttpClient.invoke("DemoActor", "1", "Payment", "".getBytes()); + assertEquals(new String(mono.block()), EXPECTED_RESULT); + } + + @Test + public void invokeActorMethodIPv6() { + String prevSidecarIp = sidecarIp; + System.setProperty(Properties.SIDECAR_IP.getName(), "2001:db8:3333:4444:5555:6666:7777:8888"); + sidecarIp = formatIpAddress(Properties.SIDECAR_IP.get()); + mockInterceptor.addRule() + .post("http://" + sidecarIp + ":3000/v1.0/actors/DemoActor/1/method/Payment") .respond(EXPECTED_RESULT); - DaprHttp daprHttp = new DaprHttpProxy(Properties.SIDECAR_IP.get(), 3000, okHttpClient); + DaprHttp daprHttp = new DaprHttpProxy(sidecarIp, 3000, okHttpClient); DaprHttpClient = new DaprHttpClient(daprHttp); + System.setProperty(Properties.SIDECAR_IP.getName(), prevSidecarIp); Mono mono = DaprHttpClient.invoke("DemoActor", "1", "Payment", "".getBytes()); assertEquals(new String(mono.block()), EXPECTED_RESULT); @@ -59,12 +79,12 @@ public void invokeActorMethod() { @Test public void invokeActorMethodError() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/actors/DemoActor/1/method/Payment") + .post("http://" + sidecarIp + ":3000/v1.0/actors/DemoActor/1/method/Payment") .respond(404, ResponseBody.create("" + "{\"errorCode\":\"ERR_SOMETHING\"," + "\"message\":\"error message\"}", MediaTypes.MEDIATYPE_JSON)); - DaprHttp daprHttp = new DaprHttpProxy(Properties.SIDECAR_IP.get(), 3000, okHttpClient); + DaprHttp daprHttp = new DaprHttpProxy(sidecarIp, 3000, okHttpClient); DaprHttpClient = new DaprHttpClient(daprHttp); Mono mono = DaprHttpClient.invoke("DemoActor", "1", "Payment", "".getBytes()); diff --git a/sdk-actors/src/test/java/io/dapr/actors/runtime/DaprHttpClientTest.java b/sdk-actors/src/test/java/io/dapr/actors/runtime/DaprHttpClientTest.java index a267452a68..2a20d5bc13 100644 --- a/sdk-actors/src/test/java/io/dapr/actors/runtime/DaprHttpClientTest.java +++ b/sdk-actors/src/test/java/io/dapr/actors/runtime/DaprHttpClientTest.java @@ -38,6 +38,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.fail; +import static io.dapr.actors.TestUtils.formatIpAddress; public class DaprHttpClientTest { @@ -46,11 +47,14 @@ public class DaprHttpClientTest { private OkHttpClient okHttpClient; private MockInterceptor mockInterceptor; + + private String sidecarIp; private final String EXPECTED_RESULT = "{\"data\":\"ewoJCSJwcm9wZXJ0eUEiOiAidmFsdWVBIiwKCQkicHJvcGVydHlCIjogInZhbHVlQiIKCX0=\"}"; @BeforeEach public void setUp() throws Exception { + sidecarIp = formatIpAddress(Properties.SIDECAR_IP.get()); mockInterceptor = new MockInterceptor(Behavior.UNORDERED); okHttpClient = new OkHttpClient.Builder().addInterceptor(mockInterceptor).build(); } @@ -58,21 +62,35 @@ public void setUp() throws Exception { @Test public void getActorState() { mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/actors/DemoActor/1/state/order") + .get("http://" + sidecarIp + ":3000/v1.0/actors/DemoActor/1/state/order") .respond(EXPECTED_RESULT); - DaprHttp daprHttp = new DaprHttpProxy(Properties.SIDECAR_IP.get(), 3000, okHttpClient); + DaprHttp daprHttp = new DaprHttpProxy(sidecarIp, 3000, okHttpClient); DaprHttpClient = new DaprHttpClient(daprHttp); Mono mono = DaprHttpClient.getState("DemoActor", "1", "order"); assertEquals(new String(mono.block()), EXPECTED_RESULT); } + @Test + public void getActorStateIPv6() { + String prevSidecarIp = sidecarIp; + System.setProperty(Properties.SIDECAR_IP.getName(), "2001:db8:3333:4444:5555:6666:7777:8888"); + sidecarIp = formatIpAddress(Properties.SIDECAR_IP.get()); + mockInterceptor.addRule() + .get("http://" + sidecarIp + ":3000/v1.0/actors/DemoActor/1/state/order") + .respond(EXPECTED_RESULT); + DaprHttp daprHttp = new DaprHttpProxy(sidecarIp, 3000, okHttpClient); + DaprHttpClient = new DaprHttpClient(daprHttp); + System.setProperty(Properties.SIDECAR_IP.getName(), prevSidecarIp); + Mono mono = DaprHttpClient.getState("DemoActor", "1", "order"); + assertEquals(new String(mono.block()), EXPECTED_RESULT); + } @Test public void saveActorStateTransactionally() { mockInterceptor.addRule() - .put("http://127.0.0.1:3000/v1.0/actors/DemoActor/1/state") + .put("http://" + sidecarIp + ":3000/v1.0/actors/DemoActor/1/state") .respond(EXPECTED_RESULT); - DaprHttp daprHttp = new DaprHttpProxy(Properties.SIDECAR_IP.get(), 3000, okHttpClient); + DaprHttp daprHttp = new DaprHttpProxy(sidecarIp, 3000, okHttpClient); DaprHttpClient = new DaprHttpClient(daprHttp); List ops = Collections.singletonList(new ActorStateOperation("UPSERT", "key", "value")); Mono mono = DaprHttpClient.saveStateTransactionally("DemoActor", "1", ops); @@ -82,9 +100,9 @@ public void saveActorStateTransactionally() { @Test public void registerActorReminder() { mockInterceptor.addRule() - .put("http://127.0.0.1:3000/v1.0/actors/DemoActor/1/reminders/reminder") + .put("http://" + sidecarIp + ":3000/v1.0/actors/DemoActor/1/reminders/reminder") .respond(EXPECTED_RESULT); - DaprHttp daprHttp = new DaprHttpProxy(Properties.SIDECAR_IP.get(), 3000, okHttpClient); + DaprHttp daprHttp = new DaprHttpProxy(sidecarIp, 3000, okHttpClient); DaprHttpClient = new DaprHttpClient(daprHttp); Mono mono = DaprHttpClient.registerReminder( @@ -98,9 +116,9 @@ public void registerActorReminder() { @Test public void unregisterActorReminder() { mockInterceptor.addRule() - .delete("http://127.0.0.1:3000/v1.0/actors/DemoActor/1/reminders/reminder") + .delete("http://" + sidecarIp + ":3000/v1.0/actors/DemoActor/1/reminders/reminder") .respond(EXPECTED_RESULT); - DaprHttp daprHttp = new DaprHttpProxy(Properties.SIDECAR_IP.get(), 3000, okHttpClient); + DaprHttp daprHttp = new DaprHttpProxy(sidecarIp, 3000, okHttpClient); DaprHttpClient = new DaprHttpClient(daprHttp); Mono mono = DaprHttpClient.unregisterReminder("DemoActor", "1", "reminder"); assertNull(mono.block()); @@ -110,7 +128,7 @@ public void unregisterActorReminder() { public void registerActorTimer() { String data = "hello world"; mockInterceptor.addRule() - .put("http://127.0.0.1:3000/v1.0/actors/DemoActor/1/timers/timer") + .put("http://" + sidecarIp + ":3000/v1.0/actors/DemoActor/1/timers/timer") .answer(new RuleAnswer() { @Override public Response.Builder respond(Request request) { @@ -132,7 +150,7 @@ public Response.Builder respond(Request request) { .body(ResponseBody.create("{}", MediaType.get("application/json"))); } }); - DaprHttp daprHttp = new DaprHttpProxy(Properties.SIDECAR_IP.get(), 3000, okHttpClient); + DaprHttp daprHttp = new DaprHttpProxy(sidecarIp, 3000, okHttpClient); DaprHttpClient = new DaprHttpClient(daprHttp); Mono mono = DaprHttpClient.registerTimer( @@ -150,9 +168,9 @@ public Response.Builder respond(Request request) { @Test public void unregisterActorTimer() { mockInterceptor.addRule() - .delete("http://127.0.0.1:3000/v1.0/actors/DemoActor/1/timers/timer") + .delete("http://" + sidecarIp + ":3000/v1.0/actors/DemoActor/1/timers/timer") .respond(EXPECTED_RESULT); - DaprHttp daprHttp = new DaprHttpProxy(Properties.SIDECAR_IP.get(), 3000, okHttpClient); + DaprHttp daprHttp = new DaprHttpProxy(sidecarIp, 3000, okHttpClient); DaprHttpClient = new DaprHttpClient(daprHttp); Mono mono = DaprHttpClient.unregisterTimer("DemoActor", "1", "timer"); assertNull(mono.block()); diff --git a/sdk-tests/src/test/java/io/dapr/it/state/HelloWorldClientIT.java b/sdk-tests/src/test/java/io/dapr/it/state/HelloWorldClientIT.java index d7bec5cbb5..577d8b72d1 100644 --- a/sdk-tests/src/test/java/io/dapr/it/state/HelloWorldClientIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/state/HelloWorldClientIT.java @@ -15,6 +15,7 @@ import io.dapr.it.BaseIT; import io.dapr.it.DaprRun; +import io.dapr.config.Properties; import io.dapr.v1.DaprGrpc; import io.dapr.v1.DaprProtos; import io.grpc.ManagedChannel; @@ -34,7 +35,7 @@ public void testHelloWorldState() throws Exception { 2000 ); ManagedChannel channel = - ManagedChannelBuilder.forAddress("127.0.0.1", daprRun.getGrpcPort()).usePlaintext().build(); + ManagedChannelBuilder.forAddress(Properties.SIDECAR_IP.get(), daprRun.getGrpcPort()).usePlaintext().build(); DaprGrpc.DaprBlockingStub client = DaprGrpc.newBlockingStub(channel); String key = "mykey"; diff --git a/sdk-tests/src/test/java/io/dapr/it/state/HelloWorldGrpcStateService.java b/sdk-tests/src/test/java/io/dapr/it/state/HelloWorldGrpcStateService.java index 96fd79f519..d3446a27b7 100644 --- a/sdk-tests/src/test/java/io/dapr/it/state/HelloWorldGrpcStateService.java +++ b/sdk-tests/src/test/java/io/dapr/it/state/HelloWorldGrpcStateService.java @@ -14,6 +14,7 @@ package io.dapr.it.state; import com.google.protobuf.ByteString; +import io.dapr.config.Properties; import io.dapr.v1.CommonProtos.StateItem; import io.dapr.v1.DaprGrpc; import io.dapr.v1.DaprGrpc.DaprBlockingStub; @@ -37,7 +38,7 @@ public static void main(String[] args) { // If port string is not valid, it will throw an exception. int grpcPortInt = Integer.parseInt(grpcPort); - ManagedChannel channel = ManagedChannelBuilder.forAddress("127.0.0.1", grpcPortInt).usePlaintext().build(); + ManagedChannel channel = ManagedChannelBuilder.forAddress(Properties.SIDECAR_IP.get(), grpcPortInt).usePlaintext().build(); DaprBlockingStub client = DaprGrpc.newBlockingStub(channel); String key = "mykey"; diff --git a/sdk/pom.xml b/sdk/pom.xml index 622a41aef4..5f876e8367 100644 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -128,6 +128,12 @@ junit-jupiter-migrationsupport test + + commons-validator + commons-validator + 1.7 + test + io.projectreactor reactor-test diff --git a/sdk/src/main/java/io/dapr/config/Properties.java b/sdk/src/main/java/io/dapr/config/Properties.java index f4c4ba6033..2ceeffb4a4 100644 --- a/sdk/src/main/java/io/dapr/config/Properties.java +++ b/sdk/src/main/java/io/dapr/config/Properties.java @@ -14,6 +14,7 @@ package io.dapr.config; import io.dapr.client.DaprApiProtocol; +import io.dapr.utils.NetworkUtils; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; @@ -27,7 +28,7 @@ public class Properties { /** * Dapr's default IP for HTTP and gRPC communication. */ - private static final String DEFAULT_SIDECAR_IP = "127.0.0.1"; + private static final String DEFAULT_SIDECAR_IP = NetworkUtils.getHostLoopbackAddress(); /** * Dapr's default HTTP port. diff --git a/sdk/src/main/java/io/dapr/utils/NetworkUtils.java b/sdk/src/main/java/io/dapr/utils/NetworkUtils.java index e5b4ad0f2b..8929d898c7 100644 --- a/sdk/src/main/java/io/dapr/utils/NetworkUtils.java +++ b/sdk/src/main/java/io/dapr/utils/NetworkUtils.java @@ -19,9 +19,11 @@ import io.grpc.ManagedChannelBuilder; import java.io.IOException; +import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; import java.net.URI; +import java.net.UnknownHostException; /** * Utility methods for network, internal to Dapr SDK. @@ -112,4 +114,12 @@ private static void callWithRetry(Runnable function, long retryTimeoutMillisecon Thread.sleep(Math.min(remaining, RETRY_WAIT_MILLISECONDS)); } } -} + + /** + * Retrieve loopback address for the host. + * @return The loopback address String + */ + public static String getHostLoopbackAddress() { + return InetAddress.getLoopbackAddress().getHostAddress(); + } +} \ No newline at end of file diff --git a/sdk/src/test/java/io/dapr/client/DaprClientHttpTest.java b/sdk/src/test/java/io/dapr/client/DaprClientHttpTest.java index 34ec5396a7..9592377a2f 100644 --- a/sdk/src/test/java/io/dapr/client/DaprClientHttpTest.java +++ b/sdk/src/test/java/io/dapr/client/DaprClientHttpTest.java @@ -72,6 +72,8 @@ import static io.dapr.utils.TestUtils.assertThrowsDaprException; import static io.dapr.utils.TestUtils.findFreePort; +import static io.dapr.utils.TestUtils.formatIpAddress; + import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.mock; @@ -85,6 +87,8 @@ public class DaprClientHttpTest { private final String EXPECTED_RESULT = "{\"data\":\"ewoJCSJwcm9wZXJ0eUEiOiAidmFsdWVBIiwKCQkicHJvcGVydHlCIjogInZhbHVlQiIKCX0=\"}"; + + private String sidecarIp; private DaprClient daprClientHttp; @@ -98,9 +102,10 @@ public class DaprClientHttpTest { @BeforeEach public void setUp() { + sidecarIp = formatIpAddress(Properties.SIDECAR_IP.get()); mockInterceptor = new MockInterceptor(Behavior.UNORDERED); okHttpClient = new OkHttpClient.Builder().addInterceptor(mockInterceptor).build(); - daprHttp = new DaprHttp(Properties.SIDECAR_IP.get(), 3000, okHttpClient); + daprHttp = new DaprHttp(sidecarIp, 3000, okHttpClient); daprClientHttp = new DaprClientProxy(new DaprClientHttp(daprHttp)); daprClientHttpXML = new DaprClientProxy(new DaprClientHttp(daprHttp, new XmlSerializer(), new XmlSerializer())); } @@ -186,7 +191,7 @@ public void waitForSidecarSlowSuccessfulHealthCheck() throws Exception { public void waitForSidecarOK() throws Exception { int port = findFreePort(); System.setProperty(Properties.HTTP_PORT.getName(), Integer.toString(port)); - daprHttp = new DaprHttp(Properties.SIDECAR_IP.get(), port, okHttpClient); + daprHttp = new DaprHttp(sidecarIp, port, okHttpClient); DaprClientHttp daprClientHttp = new DaprClientHttp(daprHttp); mockInterceptor.addRule() @@ -217,7 +222,7 @@ public void waitForSidecarTimeoutOK() throws Exception { } }); t.start(); - daprHttp = new DaprHttp(Properties.SIDECAR_IP.get(), port, okHttpClient); + daprHttp = new DaprHttp(sidecarIp, port, okHttpClient); DaprClientHttp daprClientHttp = new DaprClientHttp(daprHttp); daprClientHttp.waitForSidecar(10000).block(); } @@ -226,19 +231,35 @@ public void waitForSidecarTimeoutOK() throws Exception { @Test public void publishEventInvocation() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/publish/mypubsubname/A") + .post("http://" + sidecarIp + ":3000/v1.0/publish/mypubsubname/A") .respond(EXPECTED_RESULT); String event = "{ \"message\": \"This is a test\" }"; - daprHttp = new DaprHttp(Properties.SIDECAR_IP.get(), 3000, okHttpClient); + daprHttp = new DaprHttp(sidecarIp, 3000, okHttpClient); DaprClientHttp daprClientHttp = new DaprClientHttp(daprHttp); Mono mono = daprClientHttp.publishEvent("mypubsubname", "A", event, null); assertNull(mono.block()); } + @Test + public void publishEventInvocationIPv6() { + String prevSidecarIp = sidecarIp; + System.setProperty(Properties.SIDECAR_IP.getName(), "2001:db8:3333:4444:5555:6666:7777:8888"); + sidecarIp = formatIpAddress(Properties.SIDECAR_IP.get()); + mockInterceptor.addRule() + .post("http://" + sidecarIp + ":3000/v1.0/publish/mypubsubname/A") + .respond(EXPECTED_RESULT); + String event = "{ \"message\": \"This is a test\" }"; + daprHttp = new DaprHttp(sidecarIp, 3000, okHttpClient); + daprClientHttp = new DaprClientHttp(daprHttp); + System.setProperty(Properties.SIDECAR_IP.getName(), prevSidecarIp); + Mono mono = daprClientHttp.publishEvent("mypubsubname", "A", event, null); + assertNull(mono.block()); + } + @Test public void publishEvent() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/publish/mypubsubname/A") + .post("http://" + sidecarIp + ":3000/v1.0/publish/mypubsubname/A") .header("content-type", "application/json") .respond(EXPECTED_RESULT); String event = "{ \"message\": \"This is a test\" }"; @@ -250,7 +271,7 @@ public void publishEvent() { @Test public void publishEventContentTypeOverride() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/publish/mypubsubname/A") + .post("http://" + sidecarIp + ":3000/v1.0/publish/mypubsubname/A") .header("content-type", "text/plain") .respond(EXPECTED_RESULT); String event = "{ \"message\": \"This is a test\" }"; @@ -284,7 +305,7 @@ public void publishEventIfPubsubIsNullOrEmpty() { @Test public void publishEventNoHotMono() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/publish/mypubsubname/A") + .post("http://" + sidecarIp + ":3000/v1.0/publish/mypubsubname/A") .respond(EXPECTED_RESULT); String event = "{ \"message\": \"This is a test\" }"; @@ -295,8 +316,8 @@ public void publishEventNoHotMono() { @Test public void invokeServiceVerbNull() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/publish/A") - .respond(EXPECTED_RESULT); + .post("http://" + sidecarIp + ":3000/v1.0/publish/A") + .respond(EXPECTED_RESULT); String event = "{ \"message\": \"This is a test\" }"; assertThrows(IllegalArgumentException.class, () -> @@ -306,7 +327,7 @@ public void invokeServiceVerbNull() { @Test public void invokeServiceIllegalArgumentException() { mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/invoke/41/method/badorder") + .get("http://" + sidecarIp + ":3000/v1.0/invoke/41/method/badorder") .respond("INVALID JSON"); assertThrows(IllegalArgumentException.class, () -> { @@ -342,7 +363,7 @@ public void invokeServiceIllegalArgumentException() { @Test public void invokeServiceDaprError() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/invoke/myapp/method/mymethod") + .post("http://" + sidecarIp + ":3000/v1.0/invoke/myapp/method/mymethod") .respond(500, ResponseBody.create( "{ \"errorCode\": \"MYCODE\", \"message\": \"My Message\"}", @@ -359,7 +380,7 @@ public void invokeServiceDaprError() { @Test public void invokeServiceDaprErrorFromGRPC() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/invoke/myapp/method/mymethod") + .post("http://" + sidecarIp + ":3000/v1.0/invoke/myapp/method/mymethod") .respond(500, ResponseBody.create( "{ \"code\": 7 }", @@ -376,7 +397,7 @@ public void invokeServiceDaprErrorFromGRPC() { @Test public void invokeServiceDaprErrorUnknownJSON() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/invoke/myapp/method/mymethod") + .post("http://" + sidecarIp + ":3000/v1.0/invoke/myapp/method/mymethod") .respond(500, ResponseBody.create( "{ \"anything\": 7 }", @@ -394,7 +415,7 @@ public void invokeServiceDaprErrorUnknownJSON() { @Test public void invokeServiceDaprErrorEmptyString() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/invoke/myapp/method/mymethod") + .post("http://" + sidecarIp + ":3000/v1.0/invoke/myapp/method/mymethod") .respond(500, ResponseBody.create( "", @@ -412,8 +433,8 @@ public void invokeServiceDaprErrorEmptyString() { @Test public void invokeServiceMethodNull() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/publish/A") - .respond(EXPECTED_RESULT); + .post("http://" + sidecarIp + ":3000/v1.0/publish/A") + .respond(EXPECTED_RESULT); assertThrows(IllegalArgumentException.class, () -> daprClientHttp.invokeMethod("1", "", null, HttpExtension.POST, null, (Class)null).block()); @@ -422,7 +443,7 @@ public void invokeServiceMethodNull() { @Test public void invokeService() { mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/invoke/41/method/neworder") + .get("http://" + sidecarIp + ":3000/v1.0/invoke/41/method/neworder") .respond("\"hello world\""); Mono mono = daprClientHttp.invokeMethod("41", "neworder", null, HttpExtension.GET, null, String.class); @@ -432,7 +453,7 @@ public void invokeService() { @Test public void invokeServiceNullResponse() { mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/invoke/41/method/neworder") + .get("http://" + sidecarIp + ":3000/v1.0/invoke/41/method/neworder") .respond(new byte[0]); Mono mono = daprClientHttp.invokeMethod("41", "neworder", null, HttpExtension.GET, null, String.class); @@ -442,8 +463,8 @@ public void invokeServiceNullResponse() { @Test public void simpleInvokeService() { mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/invoke/41/method/neworder") - .respond(EXPECTED_RESULT); + .get("http://" + sidecarIp + ":3000/v1.0/invoke/41/method/neworder") + .respond(EXPECTED_RESULT); Mono mono = daprClientHttp.invokeMethod("41", "neworder", null, HttpExtension.GET, byte[].class); assertEquals(new String(mono.block()), EXPECTED_RESULT); @@ -453,8 +474,8 @@ public void simpleInvokeService() { public void invokeServiceWithMetadataMap() { Map map = new HashMap<>(); mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/invoke/41/method/neworder") - .respond(EXPECTED_RESULT); + .get("http://" + sidecarIp + ":3000/v1.0/invoke/41/method/neworder") + .respond(EXPECTED_RESULT); Mono mono = daprClientHttp.invokeMethod("41", "neworder", (byte[]) null, HttpExtension.GET, map); String monoString = new String(mono.block()); @@ -465,8 +486,8 @@ public void invokeServiceWithMetadataMap() { public void invokeServiceWithOutRequest() { Map map = new HashMap<>(); mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/invoke/41/method/neworder") - .respond(EXPECTED_RESULT); + .get("http://" + sidecarIp + ":3000/v1.0/invoke/41/method/neworder") + .respond(EXPECTED_RESULT); Mono mono = daprClientHttp.invokeMethod("41", "neworder", HttpExtension.GET, map); assertNull(mono.block()); @@ -476,8 +497,8 @@ public void invokeServiceWithOutRequest() { public void invokeServiceWithRequest() { Map map = new HashMap<>(); mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/invoke/41/method/neworder") - .respond(EXPECTED_RESULT); + .get("http://" + sidecarIp + ":3000/v1.0/invoke/41/method/neworder") + .respond(EXPECTED_RESULT); Mono mono = daprClientHttp.invokeMethod("41", "neworder", "", HttpExtension.GET, map); assertNull(mono.block()); @@ -487,7 +508,7 @@ public void invokeServiceWithRequest() { public void invokeServiceWithRequestAndQueryString() { Map map = new HashMap<>(); mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/invoke/41/method/neworder?param1=1¶m2=a¶m2=b%2Fc") + .get("http://" + sidecarIp + ":3000/v1.0/invoke/41/method/neworder?param1=1¶m2=a¶m2=b%2Fc") .respond(EXPECTED_RESULT); Map> queryString = new HashMap<>(); @@ -502,7 +523,7 @@ public void invokeServiceWithRequestAndQueryString() { public void invokeServiceNoHotMono() { Map map = new HashMap<>(); mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/invoke/41/method/neworder") + .get("http://" + sidecarIp + ":3000/v1.0/invoke/41/method/neworder") .respond(500); daprClientHttp.invokeMethod("41", "neworder", "", HttpExtension.GET, map); @@ -518,7 +539,7 @@ public void invokeServiceWithContext() { .put("tracestate", tracestate) .put("not_added", "xyz"); mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/invoke/41/method/neworder") + .post("http://" + sidecarIp + ":3000/v1.0/invoke/41/method/neworder") .header("traceparent", traceparent) .header("tracestate", tracestate) .respond(new byte[0]); @@ -535,7 +556,7 @@ public void invokeServiceWithContext() { public void invokeBinding() { Map map = new HashMap<>(); mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/bindings/sample-topic") + .post("http://" + sidecarIp + ":3000/v1.0/bindings/sample-topic") .respond(""); Mono mono = daprClientHttp.invokeBinding("sample-topic", "myoperation", ""); @@ -546,7 +567,7 @@ public void invokeBinding() { public void invokeBindingNullData() { Map map = new HashMap<>(); mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/bindings/sample-topic") + .post("http://" + sidecarIp + ":3000/v1.0/bindings/sample-topic") .respond(""); Mono mono = daprClientHttp.invokeBinding("sample-topic", "myoperation", null); @@ -556,7 +577,7 @@ public void invokeBindingNullData() { @Test public void invokeBindingErrors() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/bindings/sample-topic") + .post("http://" + sidecarIp + ":3000/v1.0/bindings/sample-topic") .respond("NOT VALID JSON"); assertThrows(IllegalArgumentException.class, () -> { @@ -579,7 +600,7 @@ public void invokeBindingErrors() { @Test public void invokeBindingResponseNull() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/bindings/sample-topic") + .post("http://" + sidecarIp + ":3000/v1.0/bindings/sample-topic") .respond(new byte[0]); Mono mono = daprClientHttp.invokeBinding("sample-topic", "myoperation", "", null, String.class); @@ -589,8 +610,8 @@ public void invokeBindingResponseNull() { @Test public void invokeBindingResponseObject() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/bindings/sample-topic") - .respond("\"OK\""); + .post("http://" + sidecarIp + ":3000/v1.0/bindings/sample-topic") + .respond("\"OK\""); Mono mono = daprClientHttp.invokeBinding("sample-topic", "myoperation", "", null, String.class); assertEquals("OK", mono.block()); @@ -600,8 +621,8 @@ public void invokeBindingResponseObject() { public void invokeBindingResponseDouble() { Map map = new HashMap<>(); mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/bindings/sample-topic") - .respond("1.5"); + .post("http://" + sidecarIp + ":3000/v1.0/bindings/sample-topic") + .respond("1.5"); Mono mono = daprClientHttp.invokeBinding("sample-topic", "myoperation", "", map, double.class); assertEquals(1.5, mono.block(), 0.0001); @@ -610,8 +631,8 @@ public void invokeBindingResponseDouble() { @Test public void invokeBindingResponseFloat() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/bindings/sample-topic") - .respond("1.5"); + .post("http://" + sidecarIp + ":3000/v1.0/bindings/sample-topic") + .respond("1.5"); Mono mono = daprClientHttp.invokeBinding("sample-topic", "myoperation", "", null, float.class); assertEquals(1.5, mono.block(), 0.0001); @@ -620,8 +641,8 @@ public void invokeBindingResponseFloat() { @Test public void invokeBindingResponseChar() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/bindings/sample-topic") - .respond("\"a\""); + .post("http://" + sidecarIp + ":3000/v1.0/bindings/sample-topic") + .respond("\"a\""); Mono mono = daprClientHttp.invokeBinding("sample-topic", "myoperation", "", null, char.class); assertEquals('a', (char)mono.block()); @@ -630,8 +651,8 @@ public void invokeBindingResponseChar() { @Test public void invokeBindingResponseByte() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/bindings/sample-topic") - .respond("\"2\""); + .post("http://" + sidecarIp + ":3000/v1.0/bindings/sample-topic") + .respond("\"2\""); Mono mono = daprClientHttp.invokeBinding("sample-topic", "myoperation", "", null, byte.class); assertEquals((byte)0x2, (byte)mono.block()); @@ -640,8 +661,8 @@ public void invokeBindingResponseByte() { @Test public void invokeBindingResponseLong() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/bindings/sample-topic") - .respond("1"); + .post("http://" + sidecarIp + ":3000/v1.0/bindings/sample-topic") + .respond("1"); Mono mono = daprClientHttp.invokeBinding("sample-topic", "myoperation", "", null, long.class); assertEquals(1, (long)mono.block()); @@ -650,8 +671,8 @@ public void invokeBindingResponseLong() { @Test public void invokeBindingResponseInt() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/bindings/sample-topic") - .respond("1"); + .post("http://" + sidecarIp + ":3000/v1.0/bindings/sample-topic") + .respond("1"); Mono mono = daprClientHttp.invokeBinding("sample-topic", "myoperation", "", null, int.class); assertEquals(1, (int)mono.block()); @@ -660,8 +681,8 @@ public void invokeBindingResponseInt() { @Test public void invokeBindingNullName() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/bindings/sample-topic") - .respond(EXPECTED_RESULT); + .post("http://" + sidecarIp + ":3000/v1.0/bindings/sample-topic") + .respond(EXPECTED_RESULT); assertThrows(IllegalArgumentException.class, () -> daprClientHttp.invokeBinding(null, "myoperation", "").block()); @@ -670,8 +691,8 @@ public void invokeBindingNullName() { @Test public void invokeBindingNullOpName() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/bindings/sample-topic") - .respond(EXPECTED_RESULT); + .post("http://" + sidecarIp + ":3000/v1.0/bindings/sample-topic") + .respond(EXPECTED_RESULT); assertThrows(IllegalArgumentException.class, () -> daprClientHttp.invokeBinding("sample-topic", null, "").block()); @@ -680,7 +701,7 @@ public void invokeBindingNullOpName() { @Test public void bindingNoHotMono() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/bindings/sample-topic") + .post("http://" + sidecarIp + ":3000/v1.0/bindings/sample-topic") .respond(EXPECTED_RESULT); daprClientHttp.invokeBinding(null, "", ""); @@ -690,7 +711,7 @@ public void bindingNoHotMono() { @Test public void getStatesErrors() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/state/MyStateStore/bulk") + .post("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/bulk") .respond("NOT VALID JSON"); assertThrows(IllegalArgumentException.class, () -> { @@ -720,7 +741,7 @@ public void getStatesErrors() { @Test public void getStatesString() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/state/MyStateStore/bulk") + .post("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/bulk") .respond("[{\"key\": \"100\", \"data\": \"hello world\", \"etag\": \"1\"}," + "{\"key\": \"200\", \"error\": \"not found\"}]"); @@ -740,7 +761,7 @@ public void getStatesString() { @Test public void getStatesInteger() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/state/MyStateStore/bulk") + .post("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/bulk") .respond("[{\"key\": \"100\", \"data\": 1234, \"etag\": \"1\"}," + "{\"key\": \"200\", \"error\": \"not found\"}]"); @@ -761,7 +782,7 @@ public void getStatesInteger() { @Test public void getStatesBoolean() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/state/MyStateStore/bulk") + .post("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/bulk") .respond("[{\"key\": \"100\", \"data\": true, \"etag\": \"1\"}," + "{\"key\": \"200\", \"error\": \"not found\"}]"); @@ -784,7 +805,7 @@ public void getStatesByteArray() { byte[] value = new byte[]{1, 2, 3}; String base64Value = Base64.getEncoder().encodeToString(value); mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/state/MyStateStore/bulk") + .post("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/bulk") .respond("[{\"key\": \"100\", \"data\": \"" + base64Value + "\", \"etag\": \"1\"}," + "{\"key\": \"200\", \"error\": \"not found\"}]"); @@ -807,7 +828,7 @@ public void getStatesByteArray() { public void getStatesObject() { MyObject object = new MyObject(1, "Event"); mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/state/MyStateStore/bulk") + .post("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/bulk") .respond("[{\"key\": \"100\", \"data\": " + "{ \"id\": \"" + object.id + "\", \"value\": \"" + object.value + "\"}, \"etag\": \"1\"}," + "{\"key\": \"200\", \"error\": \"not found\"}]"); @@ -835,10 +856,10 @@ public void getState() { State stateKeyEmpty = new State<>("", "value", "etag", stateOptions); State stateKeyBadPayload = new State<>("keyBadPayload", "value", "etag", stateOptions); mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/state/MyStateStore/key") + .get("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/key") .respond("\"" + EXPECTED_RESULT + "\""); mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/state/MyStateStore/keyBadPayload") + .get("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/keyBadPayload") .respond("NOT VALID"); assertThrows(IllegalArgumentException.class, () -> { @@ -866,8 +887,8 @@ public void getState() { public void getStatesEmptyEtag() { State stateEmptyEtag = new State<>("key", "value", "", null); mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/state/MyStateStore/key") - .respond("\"" + EXPECTED_RESULT + "\""); + .get("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/key") + .respond("\"" + EXPECTED_RESULT + "\""); State monoEmptyEtag = daprClientHttp.getState(STATE_STORE_NAME, stateEmptyEtag, String.class).block(); assertEquals(monoEmptyEtag.getKey(), "key"); @@ -879,8 +900,8 @@ public void getStateWithMetadata() { Map metadata = new HashMap<>(); metadata.put("key_1", "val_1"); mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/state/MyStateStore/key?metadata.key_1=val_1") - .respond("\"" + EXPECTED_RESULT + "\""); + .get("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/key?metadata.key_1=val_1") + .respond("\"" + EXPECTED_RESULT + "\""); GetStateRequest request = new GetStateRequest(STATE_STORE_NAME, "key"); request.setMetadata(metadata); @@ -892,8 +913,8 @@ public void getStateWithMetadata() { public void getStateWithStateOptions() { StateOptions stateOptions = new StateOptions(StateOptions.Consistency.STRONG, StateOptions.Concurrency.FIRST_WRITE); mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/state/MyStateStore/key?consistency=strong&concurrency=first-write") - .respond("\"" + EXPECTED_RESULT + "\""); + .get("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/key?consistency=strong&concurrency=first-write") + .respond("\"" + EXPECTED_RESULT + "\""); GetStateRequest request = new GetStateRequest(STATE_STORE_NAME, "key"); request.setStateOptions(stateOptions); @@ -905,8 +926,8 @@ public void getStateWithStateOptions() { public void getStatesNullEtag() { State stateNullEtag = new State<>("key", "value", null, null); mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/state/MyStateStore/key") - .respond("\"" + EXPECTED_RESULT + "\""); + .get("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/key") + .respond("\"" + EXPECTED_RESULT + "\""); State monoNullEtag = daprClientHttp.getState(STATE_STORE_NAME, stateNullEtag, String.class).block(); assertEquals(monoNullEtag.getKey(), "key"); @@ -917,7 +938,7 @@ public void getStatesNullEtag() { public void getStatesNoHotMono() { State stateNullEtag = new State<>("key", "value", null, null); mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/state/MyStateStore/key") + .get("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/key") .respond(500); daprClientHttp.getState(STATE_STORE_NAME, stateNullEtag, String.class); @@ -929,8 +950,8 @@ public void saveStates() { State stateKeyValue = new State<>("key", "value", "etag", null); List> stateKeyValueList = Collections.singletonList(stateKeyValue); mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/state/MyStateStore") - .respond(EXPECTED_RESULT); + .post("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore") + .respond(EXPECTED_RESULT); Mono mono = daprClientHttp.saveBulkState(STATE_STORE_NAME, stateKeyValueList); assertNull(mono.block()); @@ -960,7 +981,7 @@ public void saveStatesNullState() { List> stateKeyValueList = new ArrayList<>(); stateKeyValueList.add(null); mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/state/MyStateStore") + .post("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore") .respond(EXPECTED_RESULT); Mono mono1 = daprClientHttp.saveBulkState(STATE_STORE_NAME, stateKeyValueList); @@ -972,8 +993,8 @@ public void saveStatesEtagNull() { State stateKeyValue = new State<>("key", "value", null, null); List> stateKeyValueList = Collections.singletonList(stateKeyValue); mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/state/MyStateStore") - .respond(EXPECTED_RESULT); + .post("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore") + .respond(EXPECTED_RESULT); Mono mono = daprClientHttp.saveBulkState(STATE_STORE_NAME, stateKeyValueList); assertNull(mono.block()); @@ -984,8 +1005,8 @@ public void saveStatesEtagEmpty() { State stateKeyValue = new State<>("key", "value", "", null); List> stateKeyValueList = Collections.singletonList(stateKeyValue); mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/state/MyStateStore") - .respond(EXPECTED_RESULT); + .post("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore") + .respond(EXPECTED_RESULT); Mono mono = daprClientHttp.saveBulkState(STATE_STORE_NAME, stateKeyValueList); assertNull(mono.block()); @@ -994,8 +1015,8 @@ public void saveStatesEtagEmpty() { @Test public void simpleSaveStates() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/state/MyStateStore") - .respond(EXPECTED_RESULT); + .post("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore") + .respond(EXPECTED_RESULT); StateOptions stateOptions = mock(StateOptions.class); Mono mono = daprClientHttp.saveState(STATE_STORE_NAME, "key", "etag", "value", stateOptions); @@ -1005,7 +1026,7 @@ public void simpleSaveStates() { @Test public void saveStatesNoHotMono() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/state/MyStateStore") + .post("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore") .respond(500); StateOptions stateOptions = mock(StateOptions.class); @@ -1016,7 +1037,7 @@ public void saveStatesNoHotMono() { @Test public void simpleExecuteTransaction() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/state/MyStateStore/transaction") + .post("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/transaction") .matches(new BodyMatcher( "{\"operations\":[{\"operation\":\"upsert\",\"request\":{\"value\":\"my data\",\"key\":\"key1\"," + "\"etag\":\"ETag1\",\"options\":{}}},{\"operation\":\"delete\",\"request\":{\"key\":\"deleteKey\"}}]}" @@ -1043,7 +1064,7 @@ public void simpleExecuteTransaction() { @Test public void simpleExecuteTransactionXMLData() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/state/MyStateStore/transaction") + .post("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/transaction") .matches(new BodyMatcher("{\"operations\":[{\"operation\":\"upsert\"," + "\"request\":{\"value\":\"PFN0cmluZz5teSBkYXRhPC9TdHJpbmc+\",\"key\":\"key1\",\"etag\":\"ETag1\"," + "\"options\":{}}},{\"operation\":\"delete\",\"request\":{\"value\":\"PG51bGwvPg==\"," + @@ -1070,7 +1091,7 @@ public void simpleExecuteTransactionXMLData() { @Test public void simpleExecuteTransactionNullEtag() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/state/MyStateStore/transaction") + .post("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/transaction") .respond(EXPECTED_RESULT); String etag = null; String key = "key1"; @@ -1093,7 +1114,7 @@ public void simpleExecuteTransactionNullEtag() { @Test public void simpleExecuteTransactionEmptyEtag() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/state/MyStateStore/transaction") + .post("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/transaction") .respond(EXPECTED_RESULT); String etag = "empty"; String key = "key1"; @@ -1116,7 +1137,7 @@ public void simpleExecuteTransactionEmptyEtag() { @Test public void simpleExecuteTransactionNullOperationAndNullState() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/state/MyStateStore/transaction") + .post("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/transaction") .respond(EXPECTED_RESULT); String etag = null; String key = "key1"; @@ -1154,7 +1175,7 @@ public void executeTransactionErrors() { @Test public void simpleExecuteTransactionNull() { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/state/MyStateStore/transaction") + .post("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/transaction") .respond(EXPECTED_RESULT); Mono mono = daprClientHttp.executeStateTransaction(STATE_STORE_NAME, null); @@ -1168,8 +1189,8 @@ public void deleteState() { StateOptions stateOptions = mock(StateOptions.class); State stateKeyValue = new State<>("key", "value", "etag", stateOptions); mockInterceptor.addRule() - .delete("http://127.0.0.1:3000/v1.0/state/MyStateStore/key") - .respond(EXPECTED_RESULT); + .delete("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/key") + .respond(EXPECTED_RESULT); Mono mono = daprClientHttp.deleteState(STATE_STORE_NAME, stateKeyValue.getKey(), stateKeyValue.getEtag(), stateOptions); assertNull(mono.block()); @@ -1182,8 +1203,8 @@ public void deleteStateWithMetadata() { StateOptions stateOptions = mock(StateOptions.class); State stateKeyValue = new State<>("key", "value", "etag", stateOptions); mockInterceptor.addRule() - .delete("http://127.0.0.1:3000/v1.0/state/MyStateStore/key?metadata.key_1=val_1") - .respond(EXPECTED_RESULT); + .delete("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/key?metadata.key_1=val_1") + .respond(EXPECTED_RESULT); DeleteStateRequest request = new DeleteStateRequest(STATE_STORE_NAME, stateKeyValue.getKey()); request.setMetadata(metadata) @@ -1198,7 +1219,7 @@ public void deleteStateNoHotMono() { StateOptions stateOptions = mock(StateOptions.class); State stateKeyValue = new State<>("key", "value", "etag", stateOptions); mockInterceptor.addRule() - .delete("http://127.0.0.1:3000/v1.0/state/MyStateStore/key") + .delete("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/key") .respond(500); daprClientHttp.deleteState(STATE_STORE_NAME, stateKeyValue.getKey(), stateKeyValue.getEtag(), stateOptions); @@ -1209,8 +1230,8 @@ public void deleteStateNoHotMono() { public void deleteStateNullEtag() { State stateKeyValue = new State<>("key", "value", null, null); mockInterceptor.addRule() - .delete("http://127.0.0.1:3000/v1.0/state/MyStateStore/key") - .respond(EXPECTED_RESULT); + .delete("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/key") + .respond(EXPECTED_RESULT); Mono mono = daprClientHttp.deleteState(STATE_STORE_NAME, stateKeyValue.getKey(), stateKeyValue.getEtag(), null); assertNull(mono.block()); @@ -1220,8 +1241,8 @@ public void deleteStateNullEtag() { public void deleteStateEmptyEtag() { State stateKeyValue = new State<>("key", "value", "", null); mockInterceptor.addRule() - .delete("http://127.0.0.1:3000/v1.0/state/MyStateStore/key") - .respond(EXPECTED_RESULT); + .delete("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/key") + .respond(EXPECTED_RESULT); Mono mono = daprClientHttp.deleteState(STATE_STORE_NAME, stateKeyValue.getKey(), stateKeyValue.getEtag(), null); assertNull(mono.block()); @@ -1232,8 +1253,8 @@ public void deleteStateIllegalArgumentException() { State stateKeyValueNull = new State<>(null, "value", "etag", null); State stateKeyValueEmpty = new State<>("", "value", "etag", null); mockInterceptor.addRule() - .delete("http://127.0.0.1:3000/v1.0/state/MyStateStore/key") - .respond(EXPECTED_RESULT); + .delete("http://" + sidecarIp + ":3000/v1.0/state/MyStateStore/key") + .respond(EXPECTED_RESULT); assertThrows(IllegalArgumentException.class, () -> { daprClientHttp.deleteState(STATE_STORE_NAME, null, null, null).block(); @@ -1258,7 +1279,7 @@ public void deleteStateIllegalArgumentException() { @Test public void getSecrets() { mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/secrets/MySecretStore/key") + .get("http://" + sidecarIp + ":3000/v1.0/secrets/MySecretStore/key") .respond("{ \"mysecretkey\": \"mysecretvalue\"}"); assertThrows(IllegalArgumentException.class, () -> { @@ -1273,7 +1294,7 @@ public void getSecrets() { @Test public void getSecretsSpecialCharsInKey() { mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/secrets/MySecretStore/key%2Fone") + .get("http://" + sidecarIp + ":3000/v1.0/secrets/MySecretStore/key%2Fone") .respond("{ \"mysecretkey\": \"mysecretvalue\"}"); assertThrows(IllegalArgumentException.class, () -> { @@ -1288,8 +1309,8 @@ public void getSecretsSpecialCharsInKey() { @Test public void getSecretsEmpty() { mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/secrets/MySecretStore/key") - .respond(""); + .get("http://" + sidecarIp + ":3000/v1.0/secrets/MySecretStore/key") + .respond(""); assertThrows(IllegalArgumentException.class, () -> { daprClientHttp.getSecret(SECRET_STORE_NAME, null).block(); @@ -1302,7 +1323,7 @@ public void getSecretsEmpty() { @Test public void getSecrets404() { mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/secrets/MySecretStore/key") + .get("http://" + sidecarIp + ":3000/v1.0/secrets/MySecretStore/key") .respond(404); assertThrowsDaprException("UNKNOWN", () -> @@ -1313,7 +1334,7 @@ public void getSecrets404() { @Test public void getSecrets404WithErrorCode() { mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/secrets/MySecretStore/key") + .get("http://" + sidecarIp + ":3000/v1.0/secrets/MySecretStore/key") .respond(404, ResponseBody.create("" + "{\"errorCode\":\"ERR_SECRET_STORE_NOT_FOUND\"," + @@ -1327,7 +1348,7 @@ public void getSecrets404WithErrorCode() { @Test public void getSecretsErrors() { mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/secrets/MySecretStore/key") + .get("http://" + sidecarIp + ":3000/v1.0/secrets/MySecretStore/key") .respond("INVALID JSON"); assertThrows(IllegalArgumentException.class, () -> @@ -1348,17 +1369,17 @@ public void getSecretsErrors() { @Test public void getSecretsWithMetadata() { mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/secrets/MySecretStore/key") - .respond("{ \"mysecretkey\": \"mysecretvalue\"}"); + .get("http://" + sidecarIp + ":3000/v1.0/secrets/MySecretStore/key") + .respond("{ \"mysecretkey\": \"mysecretvalue\"}"); mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/secrets/MySecretStore/key?metadata.metakey=metavalue") - .respond("{ \"mysecretkey2\": \"mysecretvalue2\"}"); + .get("http://" + sidecarIp + ":3000/v1.0/secrets/MySecretStore/key?metadata.metakey=metavalue") + .respond("{ \"mysecretkey2\": \"mysecretvalue2\"}"); { Map secret = daprClientHttp.getSecret( - SECRET_STORE_NAME, - "key", - null).block(); + SECRET_STORE_NAME, + "key", + null).block(); assertEquals(1, secret.size()); assertEquals("mysecretvalue", secret.get("mysecretkey")); @@ -1366,9 +1387,9 @@ public void getSecretsWithMetadata() { { Map secret = daprClientHttp.getSecret( - SECRET_STORE_NAME, - "key", - Collections.singletonMap("metakey", "metavalue")).block(); + SECRET_STORE_NAME, + "key", + Collections.singletonMap("metakey", "metavalue")).block(); assertEquals(1, secret.size()); assertEquals("mysecretvalue2", secret.get("mysecretkey2")); @@ -1378,7 +1399,7 @@ public void getSecretsWithMetadata() { @Test public void getBulkSecrets() { mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/secrets/MySecretStore/bulk") + .get("http://" + sidecarIp + ":3000/v1.0/secrets/MySecretStore/bulk") .respond("{ \"one\": { \"mysecretkey\": \"mysecretvalue\"}, \"two\": { \"a\": \"1\", \"b\": \"2\"}}"); Map> secrets = daprClientHttp.getBulkSecret(SECRET_STORE_NAME).block(); @@ -1394,7 +1415,7 @@ public void getBulkSecrets() { @Test public void getBulkSecretsWithMetadata() { mockInterceptor.addRule() - .get("http://127.0.0.1:3000/v1.0/secrets/MySecretStore/bulk?metadata.metakey=metavalue") + .get("http://" + sidecarIp + ":3000/v1.0/secrets/MySecretStore/bulk?metadata.metakey=metavalue") .respond("{ \"one\": { \"mysecretkey\": \"mysecretvalue\"}, \"two\": { \"a\": \"1\", \"b\": \"2\"}}"); Map> secrets = @@ -1545,8 +1566,8 @@ public void close() throws Exception { @Test public void shutdown() throws Exception { mockInterceptor.addRule() - .post("http://127.0.0.1:3000/v1.0/shutdown") - .respond(204); + .post("http://" + sidecarIp + ":3000/v1.0/shutdown") + .respond(204); final Mono mono = daprClientHttp.shutdown(); assertNull(mono.block()); @@ -1653,4 +1674,4 @@ public int hashCode() { return result; } } -} +} \ No newline at end of file diff --git a/sdk/src/test/java/io/dapr/client/DaprHttpTest.java b/sdk/src/test/java/io/dapr/client/DaprHttpTest.java index dac27904bd..ceac555878 100644 --- a/sdk/src/test/java/io/dapr/client/DaprHttpTest.java +++ b/sdk/src/test/java/io/dapr/client/DaprHttpTest.java @@ -38,6 +38,7 @@ import java.util.List; import java.util.Map; +import static io.dapr.utils.TestUtils.formatIpAddress; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.fail; @@ -52,6 +53,8 @@ public class DaprHttpTest { private static final String EXPECTED_RESULT = "{\"data\":\"ewoJCSJwcm9wZXJ0eUEiOiAidmFsdWVBIiwKCQkicHJvcGVydHlCIjogInZhbHVlQiIKCX0=\"}"; + + private String sidecarIp; private OkHttpClient okHttpClient; @@ -61,6 +64,7 @@ public class DaprHttpTest { @BeforeEach public void setUp() { + sidecarIp = formatIpAddress(Properties.SIDECAR_IP.get()); mockInterceptor = new MockInterceptor(Behavior.UNORDERED); okHttpClient = new OkHttpClient.Builder().addInterceptor(mockInterceptor).build(); } @@ -68,12 +72,12 @@ public void setUp() { @Test public void invokeApi_daprApiToken_present() throws IOException { mockInterceptor.addRule() - .post("http://127.0.0.1:3500/v1.0/state") + .post("http://" + sidecarIp + ":3500/v1.0/state") .hasHeader(Headers.DAPR_API_TOKEN) .respond(serializer.serialize(EXPECTED_RESULT)); environmentVariables.set(Properties.API_TOKEN.getEnvName(), "xyz"); assertEquals("xyz", Properties.API_TOKEN.get()); - DaprHttp daprHttp = new DaprHttp(Properties.SIDECAR_IP.get(), 3500, okHttpClient); + DaprHttp daprHttp = new DaprHttp(sidecarIp, 3500, okHttpClient); Mono mono = daprHttp.invokeApi("POST", "v1.0/state".split("/"), null, (byte[]) null, null, Context.empty()); DaprHttp.Response response = mono.block(); @@ -84,12 +88,12 @@ public void invokeApi_daprApiToken_present() throws IOException { @Test public void invokeApi_daprApiToken_absent() throws IOException { mockInterceptor.addRule() - .post("http://127.0.0.1:3500/v1.0/state") + .post("http://" + sidecarIp + ":3500/v1.0/state") .not() .hasHeader(Headers.DAPR_API_TOKEN) .respond(serializer.serialize(EXPECTED_RESULT)); assertNull(Properties.API_TOKEN.get()); - DaprHttp daprHttp = new DaprHttp(Properties.SIDECAR_IP.get(), 3500, okHttpClient); + DaprHttp daprHttp = new DaprHttp(sidecarIp, 3500, okHttpClient); Mono mono = daprHttp.invokeApi("POST", "v1.0/state".split("/"), null, (byte[]) null, null, Context.empty()); DaprHttp.Response response = mono.block(); @@ -103,9 +107,29 @@ public void invokeMethod() throws IOException { headers.put("content-type", "text/html"); headers.put("header1", "value1"); mockInterceptor.addRule() - .post("http://127.0.0.1:3500/v1.0/state") + .post("http://" + sidecarIp + ":3500/v1.0/state") .respond(serializer.serialize(EXPECTED_RESULT)); - DaprHttp daprHttp = new DaprHttp(Properties.SIDECAR_IP.get(), 3500, okHttpClient); + DaprHttp daprHttp = new DaprHttp(sidecarIp, 3500, okHttpClient); + Mono mono = + daprHttp.invokeApi("POST", "v1.0/state".split("/"), null, (byte[]) null, headers, Context.empty()); + DaprHttp.Response response = mono.block(); + String body = serializer.deserialize(response.getBody(), String.class); + assertEquals(EXPECTED_RESULT, body); + } + + @Test + public void invokeMethodIPv6() throws IOException { + String prevSidecarIp = sidecarIp; + System.setProperty(Properties.SIDECAR_IP.getName(), "2001:db8:3333:4444:5555:6666:7777:8888"); + sidecarIp = formatIpAddress(Properties.SIDECAR_IP.get()); + Map headers = new HashMap<>(); + headers.put("content-type", "text/html"); + headers.put("header1", "value1"); + mockInterceptor.addRule() + .post("http://" + sidecarIp + ":3500/v1.0/state") + .respond(serializer.serialize(EXPECTED_RESULT)); + DaprHttp daprHttp = new DaprHttp(sidecarIp, 3500, okHttpClient); + System.setProperty(Properties.SIDECAR_IP.getName(), prevSidecarIp); Mono mono = daprHttp.invokeApi("POST", "v1.0/state".split("/"), null, (byte[]) null, headers, Context.empty()); DaprHttp.Response response = mono.block(); @@ -116,10 +140,10 @@ public void invokeMethod() throws IOException { @Test public void invokePostMethod() throws IOException { mockInterceptor.addRule() - .post("http://127.0.0.1:3500/v1.0/state") + .post("http://" + sidecarIp + ":3500/v1.0/state") .respond(serializer.serialize(EXPECTED_RESULT)) .addHeader("Header", "Value"); - DaprHttp daprHttp = new DaprHttp(Properties.SIDECAR_IP.get(), 3500, okHttpClient); + DaprHttp daprHttp = new DaprHttp(sidecarIp, 3500, okHttpClient); Mono mono = daprHttp.invokeApi("POST", "v1.0/state".split("/"), null, "", null, Context.empty()); DaprHttp.Response response = mono.block(); @@ -130,9 +154,9 @@ public void invokePostMethod() throws IOException { @Test public void invokeDeleteMethod() throws IOException { mockInterceptor.addRule() - .delete("http://127.0.0.1:3500/v1.0/state") + .delete("http://" + sidecarIp + ":3500/v1.0/state") .respond(serializer.serialize(EXPECTED_RESULT)); - DaprHttp daprHttp = new DaprHttp(Properties.SIDECAR_IP.get(), 3500, okHttpClient); + DaprHttp daprHttp = new DaprHttp(sidecarIp, 3500, okHttpClient); Mono mono = daprHttp.invokeApi("DELETE", "v1.0/state".split("/"), null, (String) null, null, Context.empty()); DaprHttp.Response response = mono.block(); @@ -153,9 +177,9 @@ public void invokeHEADMethod() throws IOException { @Test public void invokeGetMethod() throws IOException { mockInterceptor.addRule() - .get("http://127.0.0.1:3500/v1.0/get") + .get("http://" + sidecarIp + ":3500/v1.0/get") .respond(serializer.serialize(EXPECTED_RESULT)); - DaprHttp daprHttp = new DaprHttp(Properties.SIDECAR_IP.get(), 3500, okHttpClient); + DaprHttp daprHttp = new DaprHttp(sidecarIp, 3500, okHttpClient); Mono mono = daprHttp.invokeApi("GET", "v1.0/get".split("/"), null, null, Context.empty()); DaprHttp.Response response = mono.block(); String body = serializer.deserialize(response.getBody(), String.class); @@ -170,9 +194,9 @@ public void invokeMethodWithHeaders() throws IOException { Map> urlParameters = new HashMap<>(); urlParameters.put("orderId", Collections.singletonList("41")); mockInterceptor.addRule() - .get("http://127.0.0.1:3500/v1.0/state/order?orderId=41") + .get("http://" + sidecarIp + ":3500/v1.0/state/order?orderId=41") .respond(serializer.serialize(EXPECTED_RESULT)); - DaprHttp daprHttp = new DaprHttp(Properties.SIDECAR_IP.get(), 3500, okHttpClient); + DaprHttp daprHttp = new DaprHttp(sidecarIp, 3500, okHttpClient); Mono mono = daprHttp.invokeApi("GET", "v1.0/state/order".split("/"), urlParameters, headers, Context.empty()); DaprHttp.Response response = mono.block(); @@ -183,9 +207,9 @@ public void invokeMethodWithHeaders() throws IOException { @Test public void invokePostMethodRuntime() throws IOException { mockInterceptor.addRule() - .post("http://127.0.0.1:3500/v1.0/state") + .post("http://" + sidecarIp + ":3500/v1.0/state") .respond(500); - DaprHttp daprHttp = new DaprHttp(Properties.SIDECAR_IP.get(), 3500, okHttpClient); + DaprHttp daprHttp = new DaprHttp(sidecarIp, 3500, okHttpClient); Mono mono = daprHttp.invokeApi("POST", "v1.0/state".split("/"), null, null, Context.empty()); StepVerifier.create(mono).expectError(RuntimeException.class).verify(); @@ -194,10 +218,10 @@ public void invokePostMethodRuntime() throws IOException { @Test public void invokePostDaprError() throws IOException { mockInterceptor.addRule() - .post("http://127.0.0.1:3500/v1.0/state") + .post("http://" + sidecarIp + ":3500/v1.0/state") .respond(500, ResponseBody.create(MediaType.parse("text"), "{\"errorCode\":null,\"message\":null}")); - DaprHttp daprHttp = new DaprHttp(Properties.SIDECAR_IP.get(), 3500, okHttpClient); + DaprHttp daprHttp = new DaprHttp(sidecarIp, 3500, okHttpClient); Mono mono = daprHttp.invokeApi("POST", "v1.0/state".split("/"), null, null, Context.empty()); StepVerifier.create(mono).expectError(RuntimeException.class).verify(); } @@ -205,10 +229,10 @@ public void invokePostDaprError() throws IOException { @Test public void invokePostMethodUnknownError() throws IOException { mockInterceptor.addRule() - .post("http://127.0.0.1:3500/v1.0/state") + .post("http://" + sidecarIp + ":3500/v1.0/state") .respond(500, ResponseBody.create(MediaType.parse("application/json"), "{\"errorCode\":\"null\",\"message\":\"null\"}")); - DaprHttp daprHttp = new DaprHttp(Properties.SIDECAR_IP.get(), 3500, okHttpClient); + DaprHttp daprHttp = new DaprHttp(sidecarIp, 3500, okHttpClient); Mono mono = daprHttp.invokeApi("POST", "v1.0/state".split("/"), null, null, Context.empty()); StepVerifier.create(mono).expectError(RuntimeException.class).verify(); } @@ -268,17 +292,17 @@ public void testCallbackCalledAtTheExpectedTimeTest() throws IOException { String urlDeleteState = STATE_PATH + "/" + deletedStateKey; String urlExistingState = STATE_PATH + "/" + existingState; mockInterceptor.addRule() - .get("http://127.0.0.1:3500/" + urlDeleteState) + .get("http://" + sidecarIp + ":3500/" + urlDeleteState) .respond(200, ResponseBody.create(MediaType.parse("application/json"), deletedStateKey)); mockInterceptor.addRule() - .delete("http://127.0.0.1:3500/" + urlDeleteState) + .delete("http://" + sidecarIp + ":3500/" + urlDeleteState) .respond(204); mockInterceptor.addRule() - .get("http://127.0.0.1:3500/" + urlExistingState) + .get("http://" + sidecarIp + ":3500/" + urlExistingState) .respond(200, ResponseBody.create(MediaType.parse("application/json"), serializer.serialize(existingState))); - DaprHttp daprHttp = new DaprHttp(Properties.SIDECAR_IP.get(), 3500, okHttpClient); + DaprHttp daprHttp = new DaprHttp(sidecarIp, 3500, okHttpClient); Mono response = daprHttp.invokeApi("GET", urlExistingState.split("/"), null, null, Context.empty()); assertEquals(existingState, serializer.deserialize(response.block().getBody(), String.class)); Mono responseDeleted = daprHttp.invokeApi("GET", urlDeleteState.split("/"), null, null, Context.empty()); @@ -287,7 +311,7 @@ public void testCallbackCalledAtTheExpectedTimeTest() throws IOException { assertNull(serializer.deserialize(responseDeleteKey.block().getBody(), String.class)); mockInterceptor.reset(); mockInterceptor.addRule() - .get("http://127.0.0.1:3500/" + urlDeleteState) + .get("http://" + sidecarIp + ":3500/" + urlDeleteState) .respond(404, ResponseBody.create(MediaType.parse("application/json"), "{\"errorCode\":\"404\",\"message\":\"State Not Found\"}")); try { diff --git a/sdk/src/test/java/io/dapr/utils/TestUtils.java b/sdk/src/test/java/io/dapr/utils/TestUtils.java index 592db3a98b..8f5929ec2f 100644 --- a/sdk/src/test/java/io/dapr/utils/TestUtils.java +++ b/sdk/src/test/java/io/dapr/utils/TestUtils.java @@ -17,6 +17,7 @@ import io.dapr.exceptions.DaprException; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.function.Executable; +import org.apache.commons.validator.routines.InetAddressValidator; import java.io.IOException; import java.net.ServerSocket; @@ -79,4 +80,12 @@ public static int findFreePort() throws IOException { return socket.getLocalPort(); } } -} + + public static String formatIpAddress(final String ipAddress) { + String formattedIpAddress = ipAddress; + if(InetAddressValidator.getInstance().isValidInet6Address(ipAddress)) { + formattedIpAddress = "[" + ipAddress + "]"; // per URL spec https://url.spec.whatwg.org/#host-writing + } + return formattedIpAddress; + } +} \ No newline at end of file