From 57b86c5d2ea3a3ea3639991effa34194d54a627e Mon Sep 17 00:00:00 2001 From: Will <28876888+willtsai@users.noreply.github.com> Date: Tue, 20 Feb 2024 07:55:27 -0800 Subject: [PATCH] Change "127.0.0.1" to SIDECAR_IP to dynamically account for IPv4 vs. IPv6 environments (#649) * Generate updated javadocs for 1.3.1 (#643) Signed-off-by: Will Tsai * Migrated out of JCenter as a Maven repository manager (#648) * Upgrade okhttp-mock dependency Version 1.3.2 was never deployed to Maven Central * No longer refer to JCenter, as it has been shut down Signed-off-by: Will Tsai * initial commit: modified ./dapr/client/DaprClientHttpTest.java unit test Signed-off-by: Will Tsai * refactored hardcoded 127.0.0.1 localhost IP to use Dapr sidecar IP Signed-off-by: Will Tsai * refactored hardcoded 127.0.0.1 localhost IP to use Dapr sidecar IP Signed-off-by: Will Tsai * cleaned up unused imports Signed-off-by: Will Tsai * fixed tabbing and imports Signed-off-by: Will Tsai * added utils for getting local host and test utils for ipv6 addresses Signed-off-by: Will Tsai * Add auto-assign dapr_bot workflow (#654) Signed-off-by: Will Tsai * Bump actions/setup-java from 2.3.1 to 2.4.0 (#663) Bumps [actions/setup-java](https://github.com/actions/setup-java) from 2.3.1 to 2.4.0. - [Release notes](https://github.com/actions/setup-java/releases) - [Commits](https://github.com/actions/setup-java/compare/v2.3.1...v2.4.0) --- updated-dependencies: - dependency-name: actions/setup-java dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Signed-off-by: Will Tsai * added HTTP client tests for IPv6 addresses Signed-off-by: Will Tsai * fixed tests by returning SIDECAR_IP to IPv4 address Signed-off-by: Will Tsai * changes to address PMD code validation violations Signed-off-by: Will Tsai * changing back to loopback address for DEFAULT_SIDECAR_IP fallback Signed-off-by: Will Tsai * Fix vault example + Upgrade Dapr CLI and runtime. (#666) * Upgrade Dapr CLI and runtime. Signed-off-by: Artur Souza * Fix expected vault output. Signed-off-by: Artur Souza Signed-off-by: Will Tsai * Update LICENSE to Apache 2.0 (#657) * Update LICENSE to Apache 2.0 Signed-off-by: Artur Souza * Update headers to Apache 2. Signed-off-by: Artur Souza Co-authored-by: Artur Souza Signed-off-by: Will Tsai * Bump actions/github-script from 1 to 5 (#655) Bumps [actions/github-script](https://github.com/actions/github-script) from 1 to 5. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v1...v5) --- updated-dependencies: - dependency-name: actions/github-script dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Signed-off-by: Will Tsai * Add DCO requirements and updated code of conduct (#669) Issue reference: dapr/docs#2039 Signed-off-by: Will Signed-off-by: Will Tsai * Bump actions/setup-java from 2.4.0 to 2.5.0 (#668) Bumps [actions/setup-java](https://github.com/actions/setup-java) from 2.4.0 to 2.5.0. - [Release notes](https://github.com/actions/setup-java/releases) - [Commits](https://github.com/actions/setup-java/compare/v2.4.0...v2.5.0) --- updated-dependencies: - dependency-name: actions/setup-java dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Artur Souza Signed-off-by: Will Tsai * Config api support (#670) * inital draft for config api Signed-off-by: Pravin Pushkar * Introducing new client for preview apis and code refactoring Signed-off-by: Pravin Pushkar * Unit tests and code refactoring Signed-off-by: Pravin Pushkar * Adding integration test Signed-off-by: pravinpushkar * Copyright changes Signed-off-by: pravinpushkar * Review comments fixes Signed-off-by: pravinpushkar * Removed DaprPreviewClientProxy and updated example README Signed-off-by: pravinpushkar * Adding validate workflow for cofiguration api example Signed-off-by: pravinpushkar * fixing example autovalidation and code coverage Signed-off-by: pravinpushkar * Fixing autovalidation and removing getAllConfiguration Signed-off-by: pravinpushkar * Fixing review comments Signed-off-by: pravinpushkar * Add regex header checkstyle. Signed-off-by: Artur Souza * Fix headers and add javadocs to some. Signed-off-by: Artur Souza Co-authored-by: Artur Souza Signed-off-by: Will Tsai * Update for next release: 1.5.0 snapshot (#672) * Update CLI and runtime to 1.6.0-rc.x Signed-off-by: Artur Souza * Upgrade the version to 1.5.0-SNAPSHOT Signed-off-by: Artur Souza Signed-off-by: Will Tsai * Update proto RC. (#674) Signed-off-by: Artur Souza Signed-off-by: Will Tsai * Java SDK - Documentation for configuration API methods (#676) * Java SDK - Documentation for configuration API methods Signed-off-by: pravinpushkar * review comment fixes Signed-off-by: pravinpushkar Co-authored-by: Artur Souza Signed-off-by: Will Tsai * Generate updated javadocs for 1.4.0 (#677) Signed-off-by: Will Tsai * address package dependency issue on integration test Signed-off-by: Will Tsai * added comment to include spec for ipv6 represention in url Signed-off-by: Will Tsai * corrected comment in NetworkUtils.getHostLoopbackAddress() Signed-off-by: Will Tsai * added comment to include spec for ipv6 represention in url Signed-off-by: Will Tsai * updated dependency scope to test Signed-off-by: Will Tsai * fix NetworkUtils.java Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com> * checkstyle fix in NetworkUtils.java Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com> * fix imports Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com> * fix ipv6 formatting issues Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com> * fix ipv6 formatting issues Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com> * fix code style nits Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com> * refactor formatIpAddress method in actors utls Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com> --------- Signed-off-by: Will Tsai Signed-off-by: Artur Souza Signed-off-by: Will Signed-off-by: Will <28876888+willtsai@users.noreply.github.com> Signed-off-by: Will Tsai <28876888+willtsai@users.noreply.github.com> Co-authored-by: Artur Souza Co-authored-by: Maarten Mulders Co-authored-by: Mukundan Sundararajan Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> Co-authored-by: Pravin Pushkar Co-authored-by: Cassie Coyle --- .gitignore | 1 + sdk-actors/pom.xml | 6 + .../test/java/io/dapr/actors/TestUtils.java | 11 +- .../actors/client/DaprHttpClientTest.java | 28 +- .../actors/runtime/DaprHttpClientTest.java | 42 ++- .../io/dapr/it/state/HelloWorldClientIT.java | 3 +- .../it/state/HelloWorldGrpcStateService.java | 3 +- sdk/pom.xml | 6 + .../main/java/io/dapr/config/Properties.java | 3 +- .../main/java/io/dapr/utils/NetworkUtils.java | 12 +- .../io/dapr/client/DaprClientHttpTest.java | 259 ++++++++++-------- .../java/io/dapr/client/DaprHttpTest.java | 74 +++-- .../test/java/io/dapr/utils/TestUtils.java | 11 +- 13 files changed, 293 insertions(+), 166 deletions(-) diff --git a/.gitignore b/.gitignore index db715d566..76cb9c94c 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 ddabdf49b..7c2b60cde 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 86cccccee..5ccc45386 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 @@ package io.dapr.actors; 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 final class TestUtils { 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 634780a5f..69e47bfd0 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.BeforeEach; 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,24 +51,40 @@ public class DaprHttpClientTest { @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(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()); 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(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); + } + @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 a267452a6..2a20d5bc1 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 java.util.List; 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 class DaprHttpClientTest { @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 class DaprHttpClientTest { @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 class DaprHttpClientTest { @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 class DaprHttpClientTest { 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 class DaprHttpClientTest { .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 class DaprHttpClientTest { @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 d7bec5cbb..577d8b72d 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 @@ package io.dapr.it.state; 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 class HelloWorldClientIT extends BaseIT { 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 96fd79f51..d3446a27b 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 @@ limitations under the License. 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 class HelloWorldGrpcStateService { // 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 622a41aef..5f876e836 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 f4c4ba603..2ceeffb4a 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 @@ limitations under the License. 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 e5b4ad0f2..8929d898c 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.ManagedChannel; 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 @@ public final class NetworkUtils { 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 34ec5396a..9592377a2 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 uk.org.webcompere.systemstubs.stream.SystemOut; 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 class DaprClientHttpTest { 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 class DaprClientHttpTest { } }); 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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { 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 class DaprClientHttpTest { 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 class DaprClientHttpTest { 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 class DaprClientHttpTest { 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 class DaprClientHttpTest { 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 class DaprClientHttpTest { .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 class DaprClientHttpTest { 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 class DaprClientHttpTest { 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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { 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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { 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 class DaprClientHttpTest { 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 class DaprClientHttpTest { 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 class DaprClientHttpTest { 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 class DaprClientHttpTest { 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 class DaprClientHttpTest { 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 class DaprClientHttpTest { 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 class DaprClientHttpTest { 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 class DaprClientHttpTest { 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 class DaprClientHttpTest { 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 class DaprClientHttpTest { 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 class DaprClientHttpTest { 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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { 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 class DaprClientHttpTest { 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 class DaprClientHttpTest { 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 class DaprClientHttpTest { 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 class DaprClientHttpTest { 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 class DaprClientHttpTest { 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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { { 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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { @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 class DaprClientHttpTest { 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 dac27904b..ceac55587 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.HashMap; 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 class DaprHttpTest { @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 class DaprHttpTest { @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 class DaprHttpTest { 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 class DaprHttpTest { @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 class DaprHttpTest { @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 class DaprHttpTest { @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 class DaprHttpTest { 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 class DaprHttpTest { @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 class DaprHttpTest { @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 class DaprHttpTest { @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 class DaprHttpTest { 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 class DaprHttpTest { 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 592db3a98..8f5929ec2 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.DaprErrorDetails; 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 final class TestUtils { 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