From 1c0c7b5ff5044fc9c23f8018418c81d3ebcad133 Mon Sep 17 00:00:00 2001 From: Artur Ciocanu Date: Mon, 21 Apr 2025 09:31:18 -0700 Subject: [PATCH 01/12] Fix URL building logic Signed-off-by: Artur Ciocanu --- .../dapr/it/methodinvoke/http/GH_1314_IT.java | 87 +++++++++++++++++++ .../main/java/io/dapr/client/DaprHttp.java | 21 ++++- 2 files changed, 105 insertions(+), 3 deletions(-) create mode 100644 sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/GH_1314_IT.java diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/GH_1314_IT.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/GH_1314_IT.java new file mode 100644 index 0000000000..112fad9cb2 --- /dev/null +++ b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/GH_1314_IT.java @@ -0,0 +1,87 @@ +package io.dapr.it.methodinvoke.http; + +import com.github.tomakehurst.wiremock.WireMockServer; +import com.github.tomakehurst.wiremock.client.WireMock; +import io.dapr.client.DaprClient; +import io.dapr.client.DaprClientBuilder; +import io.dapr.client.domain.HttpExtension; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.util.Map; + +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.post; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +public class GH_1314_IT { + + private static WireMockServer wireMockServer; + + @BeforeAll + static void setup() { + wireMockServer = new WireMockServer(3500); + + wireMockServer.start(); + + WireMock.configureFor("localhost", 3500); + + stubFor(post( + urlEqualTo("/v1.0/invoke/say-hello/method/say-hello/hello") + ) + .willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody("\"Hello from say-hello app!\""))); + } + + @AfterAll + static void teardown() { + wireMockServer.stop(); + } + + @Test + void testInvokeSayHelloWithoutLeadingSlash() { + String urlWithoutLeadingSlash = "say-hello/hello"; + + sayHelloUsingURL(urlWithoutLeadingSlash); + } + + @Test + void testInvokeSayHelloWithLeadingSlash() { + String urlWithLeadingSlash = "/say-hello/hello"; + + sayHelloUsingURL(urlWithLeadingSlash); + } + + private static void sayHelloUsingURL(String url) { + DaprClient client = new DaprClientBuilder().build(); + + try { + Map requestData = Map.of("message", "Hello"); + + String response = client.invokeMethod( + "say-hello", + url, + requestData, + HttpExtension.POST, + String.class + ).block(); + + assertEquals("Hello from say-hello app!", response); + } catch (Exception e) { + fail("Exception occurred: " + e.getMessage()); + } finally { + try { + client.close(); + } catch (Exception e) { + fail(e); + } + } + } + +} diff --git a/sdk/src/main/java/io/dapr/client/DaprHttp.java b/sdk/src/main/java/io/dapr/client/DaprHttp.java index 5b23d733ec..489fd40491 100644 --- a/sdk/src/main/java/io/dapr/client/DaprHttp.java +++ b/sdk/src/main/java/io/dapr/client/DaprHttp.java @@ -24,7 +24,6 @@ import java.io.IOException; import java.net.URI; -import java.net.URISyntaxException; import java.net.URLEncoder; import java.net.http.HttpClient; import java.net.http.HttpRequest; @@ -324,10 +323,17 @@ private static String getContentType(Map headers) { private static URI createUri(URI uri, String[] pathSegments, Map> urlParameters) { String path = createPath(uri, pathSegments); String query = createQuery(urlParameters); + StringBuilder result = new StringBuilder(); + + result.append(uri.getScheme()).append("://").append(uri.getAuthority()).append(path); + + if (query != null) { + result.append("?").append(query); + } try { - return new URI(uri.getScheme(), uri.getAuthority(), path, query, null); - } catch (URISyntaxException exception) { + return URI.create(result.toString()); + } catch (IllegalArgumentException exception) { throw new DaprException(exception); } } @@ -346,6 +352,10 @@ private static String createPath(URI uri, String[] pathSegments) { } for (String segment : pathSegments) { + if (segment == null || segment.isEmpty()) { + continue; // Skip empty segments + } + pathBuilder.append(encodePathSegment(segment)).append("/"); // Encode each segment } @@ -363,6 +373,11 @@ private static String createQuery(Map> urlParameters) { for (Map.Entry> entry : urlParameters.entrySet()) { String key = entry.getKey(); + + if (key == null || key.isEmpty()) { + continue; // Skip empty keys + } + List values = entry.getValue(); for (String value : values) { From 8222ed543b69ba869491146856ecc567e1fe0a04 Mon Sep 17 00:00:00 2001 From: Artur Ciocanu Date: Wed, 23 Apr 2025 08:17:45 -0700 Subject: [PATCH 02/12] Add test for query params Signed-off-by: Artur Ciocanu --- .../http/MethodInvokeController.java | 6 ++++++ .../it/methodinvoke/http/MethodInvokeIT.java | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java index 8ff77985b7..fe04a391bb 100644 --- a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java +++ b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java @@ -6,6 +6,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; @@ -80,6 +81,11 @@ public List getPersons() { return persons; } + @GetMapping(path = "/query-params") + public String getQueryParams(@RequestParam String uri) { + return uri; + } + @PostMapping(path = "/sleep") public void sleep(@RequestBody int seconds) throws InterruptedException { if (seconds < 0) { diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java index ba7b485ca6..989eaf8bff 100644 --- a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java @@ -2,6 +2,7 @@ import io.dapr.client.DaprClient; import io.dapr.client.DaprClientBuilder; +import io.dapr.client.DaprHttp; import io.dapr.client.domain.HttpExtension; import io.dapr.exceptions.DaprException; import io.dapr.it.BaseIT; @@ -14,6 +15,7 @@ import java.util.Arrays; import java.util.Calendar; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -140,4 +142,20 @@ public void testInvokeException() throws Exception { assertTrue(new String(exception.getPayload()).contains("Internal Server Error")); } } + + @Test + public void testInvokeQueryParams() throws Exception { + try (DaprClient client = daprRun.newDaprClientBuilder().build()) { + client.waitForSidecar(10000).block(); + + String uri = "abc/abc/pqr"; + Map> queryParams = Map.of("uri", List.of(uri)); + HttpExtension httpExtension = new HttpExtension(DaprHttp.HttpMethods.GET, queryParams, Map.of()); + String result = client.invokeMethod(daprRun.getAppName(), "query-params", null, + httpExtension, String.class).block(); + + assertEquals(uri, result); + } + } + } From 4f637bc175f0e42892dff81df2956833f639c390 Mon Sep 17 00:00:00 2001 From: Artur Ciocanu Date: Wed, 23 Apr 2025 10:13:56 -0700 Subject: [PATCH 03/12] Fix the assertion in the test Signed-off-by: Artur Ciocanu --- .../java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java index 989eaf8bff..99456ce267 100644 --- a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java @@ -1,7 +1,6 @@ package io.dapr.it.methodinvoke.http; import io.dapr.client.DaprClient; -import io.dapr.client.DaprClientBuilder; import io.dapr.client.DaprHttp; import io.dapr.client.domain.HttpExtension; import io.dapr.exceptions.DaprException; @@ -15,7 +14,6 @@ import java.util.Arrays; import java.util.Calendar; import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -148,7 +146,7 @@ public void testInvokeQueryParams() throws Exception { try (DaprClient client = daprRun.newDaprClientBuilder().build()) { client.waitForSidecar(10000).block(); - String uri = "abc/abc/pqr"; + String uri = "abc/pqr"; Map> queryParams = Map.of("uri", List.of(uri)); HttpExtension httpExtension = new HttpExtension(DaprHttp.HttpMethods.GET, queryParams, Map.of()); String result = client.invokeMethod(daprRun.getAppName(), "query-params", null, From 695ec95037de0a28c37baac3d9d82fbe4a249aef Mon Sep 17 00:00:00 2001 From: Artur Ciocanu Date: Wed, 23 Apr 2025 13:21:42 -0700 Subject: [PATCH 04/12] Adjust the tests Signed-off-by: Artur Ciocanu --- .../src/test/java/io/dapr/it/DaprRun.java | 1 + .../dapr/it/methodinvoke/http/GH_1314_IT.java | 87 ------------------- .../http/MethodInvokeController.java | 2 +- .../it/methodinvoke/http/MethodInvokeIT.java | 16 ---- .../MethodInvokeQueryParamEncodingIT.java | 46 ++++++++++ 5 files changed, 48 insertions(+), 104 deletions(-) delete mode 100644 sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/GH_1314_IT.java create mode 100644 sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeQueryParamEncodingIT.java diff --git a/sdk-tests/src/test/java/io/dapr/it/DaprRun.java b/sdk-tests/src/test/java/io/dapr/it/DaprRun.java index 966d4f08dd..3891261739 100644 --- a/sdk-tests/src/test/java/io/dapr/it/DaprRun.java +++ b/sdk-tests/src/test/java/io/dapr/it/DaprRun.java @@ -312,6 +312,7 @@ private static String buildDaprCommand( .append(ports.getAppPort() != null ? " --app-port " + ports.getAppPort() : "") .append(ports.getHttpPort() != null ? " --dapr-http-port " + ports.getHttpPort() : "") .append(ports.getGrpcPort() != null ? " --dapr-grpc-port " + ports.getGrpcPort() : "") + .append(" --log-level debug") .append(isAppHealthCheckEnabled(serviceClass) ? " --enable-app-health-check --app-health-probe-interval=1" : "") .append(serviceClass == null ? "" : diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/GH_1314_IT.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/GH_1314_IT.java deleted file mode 100644 index 112fad9cb2..0000000000 --- a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/GH_1314_IT.java +++ /dev/null @@ -1,87 +0,0 @@ -package io.dapr.it.methodinvoke.http; - -import com.github.tomakehurst.wiremock.WireMockServer; -import com.github.tomakehurst.wiremock.client.WireMock; -import io.dapr.client.DaprClient; -import io.dapr.client.DaprClientBuilder; -import io.dapr.client.domain.HttpExtension; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import java.util.Map; - -import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; -import static com.github.tomakehurst.wiremock.client.WireMock.post; -import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; -import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; - -public class GH_1314_IT { - - private static WireMockServer wireMockServer; - - @BeforeAll - static void setup() { - wireMockServer = new WireMockServer(3500); - - wireMockServer.start(); - - WireMock.configureFor("localhost", 3500); - - stubFor(post( - urlEqualTo("/v1.0/invoke/say-hello/method/say-hello/hello") - ) - .willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody("\"Hello from say-hello app!\""))); - } - - @AfterAll - static void teardown() { - wireMockServer.stop(); - } - - @Test - void testInvokeSayHelloWithoutLeadingSlash() { - String urlWithoutLeadingSlash = "say-hello/hello"; - - sayHelloUsingURL(urlWithoutLeadingSlash); - } - - @Test - void testInvokeSayHelloWithLeadingSlash() { - String urlWithLeadingSlash = "/say-hello/hello"; - - sayHelloUsingURL(urlWithLeadingSlash); - } - - private static void sayHelloUsingURL(String url) { - DaprClient client = new DaprClientBuilder().build(); - - try { - Map requestData = Map.of("message", "Hello"); - - String response = client.invokeMethod( - "say-hello", - url, - requestData, - HttpExtension.POST, - String.class - ).block(); - - assertEquals("Hello from say-hello app!", response); - } catch (Exception e) { - fail("Exception occurred: " + e.getMessage()); - } finally { - try { - client.close(); - } catch (Exception e) { - fail(e); - } - } - } - -} diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java index fe04a391bb..3d3a1f8c9f 100644 --- a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java +++ b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java @@ -81,7 +81,7 @@ public List getPersons() { return persons; } - @GetMapping(path = "/query-params") + @GetMapping(path = "/query") public String getQueryParams(@RequestParam String uri) { return uri; } diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java index 99456ce267..4cc242d0e1 100644 --- a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java @@ -1,7 +1,6 @@ package io.dapr.it.methodinvoke.http; import io.dapr.client.DaprClient; -import io.dapr.client.DaprHttp; import io.dapr.client.domain.HttpExtension; import io.dapr.exceptions.DaprException; import io.dapr.it.BaseIT; @@ -141,19 +140,4 @@ public void testInvokeException() throws Exception { } } - @Test - public void testInvokeQueryParams() throws Exception { - try (DaprClient client = daprRun.newDaprClientBuilder().build()) { - client.waitForSidecar(10000).block(); - - String uri = "abc/pqr"; - Map> queryParams = Map.of("uri", List.of(uri)); - HttpExtension httpExtension = new HttpExtension(DaprHttp.HttpMethods.GET, queryParams, Map.of()); - String result = client.invokeMethod(daprRun.getAppName(), "query-params", null, - httpExtension, String.class).block(); - - assertEquals(uri, result); - } - } - } diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeQueryParamEncodingIT.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeQueryParamEncodingIT.java new file mode 100644 index 0000000000..6a48d06c88 --- /dev/null +++ b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeQueryParamEncodingIT.java @@ -0,0 +1,46 @@ +package io.dapr.it.methodinvoke.http; + +import io.dapr.client.DaprClient; +import io.dapr.client.DaprHttp; +import io.dapr.client.domain.HttpExtension; +import io.dapr.it.BaseIT; +import io.dapr.it.DaprRun; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class MethodInvokeQueryParamEncodingIT extends BaseIT { + + private DaprRun daprRun = null; + + @BeforeEach + public void init() throws Exception { + daprRun = startDaprApp( + MethodInvokeQueryParamEncodingIT.class.getSimpleName() + "http", + MethodInvokeService.SUCCESS_MESSAGE, + MethodInvokeService.class, + true, + 30000); + daprRun.waitForAppHealth(20000); + } + + @Test + public void testInvokeQueryParams() throws Exception { + try (DaprClient client = daprRun.newDaprClientBuilder().build()) { + client.waitForSidecar(10000).block(); + + String uri = "abc/pqr"; + Map> queryParams = Map.of("uri", List.of(uri)); + HttpExtension httpExtension = new HttpExtension(DaprHttp.HttpMethods.GET, queryParams, Map.of()); + String result = client.invokeMethod(daprRun.getAppName(), "query", null, + httpExtension, String.class).block(); + + assertEquals(uri, result); + } + } + +} From 5f5082a9a337907835f062b2901d193170ae7bb7 Mon Sep 17 00:00:00 2001 From: Artur Ciocanu Date: Wed, 23 Apr 2025 13:22:38 -0700 Subject: [PATCH 05/12] Remove uneeded changes from IT test Signed-off-by: Artur Ciocanu --- .../test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java | 1 - 1 file changed, 1 deletion(-) diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java index 4cc242d0e1..0bd618a1b7 100644 --- a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java @@ -139,5 +139,4 @@ public void testInvokeException() throws Exception { assertTrue(new String(exception.getPayload()).contains("Internal Server Error")); } } - } From 404e0b9eb40924359468e2d4f94e4e0aa9099157 Mon Sep 17 00:00:00 2001 From: Artur Ciocanu Date: Wed, 23 Apr 2025 13:23:40 -0700 Subject: [PATCH 06/12] Revert some unintended changes Signed-off-by: Artur Ciocanu --- .../test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java index 0bd618a1b7..ba7b485ca6 100644 --- a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java @@ -1,6 +1,7 @@ package io.dapr.it.methodinvoke.http; import io.dapr.client.DaprClient; +import io.dapr.client.DaprClientBuilder; import io.dapr.client.domain.HttpExtension; import io.dapr.exceptions.DaprException; import io.dapr.it.BaseIT; From 87fbc7bb4cfa198d6d8b542c8adbe78fcc04b005 Mon Sep 17 00:00:00 2001 From: Artur Ciocanu Date: Thu, 24 Apr 2025 09:11:47 -0700 Subject: [PATCH 07/12] Simplify the testing a little bit Signed-off-by: Artur Ciocanu --- .../src/test/java/io/dapr/it/DaprRun.java | 1 - .../http/MethodInvokeController.java | 11 ++--- .../it/methodinvoke/http/MethodInvokeIT.java | 5 +- .../MethodInvokeQueryParamEncodingIT.java | 46 ------------------- 4 files changed, 9 insertions(+), 54 deletions(-) delete mode 100644 sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeQueryParamEncodingIT.java diff --git a/sdk-tests/src/test/java/io/dapr/it/DaprRun.java b/sdk-tests/src/test/java/io/dapr/it/DaprRun.java index 3891261739..966d4f08dd 100644 --- a/sdk-tests/src/test/java/io/dapr/it/DaprRun.java +++ b/sdk-tests/src/test/java/io/dapr/it/DaprRun.java @@ -312,7 +312,6 @@ private static String buildDaprCommand( .append(ports.getAppPort() != null ? " --app-port " + ports.getAppPort() : "") .append(ports.getHttpPort() != null ? " --dapr-http-port " + ports.getHttpPort() : "") .append(ports.getGrpcPort() != null ? " --dapr-grpc-port " + ports.getGrpcPort() : "") - .append(" --log-level debug") .append(isAppHealthCheckEnabled(serviceClass) ? " --enable-app-health-check --app-health-probe-interval=1" : "") .append(serviceClass == null ? "" : diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java index 3d3a1f8c9f..5f7aa60486 100644 --- a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java +++ b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java @@ -77,13 +77,12 @@ public void deletePerson(@PathVariable("personId") Integer personId){ } @GetMapping(path = "/persons") - public List getPersons() { - return persons; - } + public List getPersons(@RequestParam(required = false) String uri) { + if (uri != null) { + System.out.println("MethodInvokeController->get persons with uri: " + uri); + } - @GetMapping(path = "/query") - public String getQueryParams(@RequestParam String uri) { - return uri; + return persons; } @PostMapping(path = "/sleep") diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java index ba7b485ca6..3ae735d837 100644 --- a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java @@ -2,6 +2,7 @@ import io.dapr.client.DaprClient; import io.dapr.client.DaprClientBuilder; +import io.dapr.client.DaprHttp; import io.dapr.client.domain.HttpExtension; import io.dapr.exceptions.DaprException; import io.dapr.it.BaseIT; @@ -91,7 +92,9 @@ public void testInvokeWithObjects() throws Exception { client.invokeMethod(daprRun.getAppName(), "persons/1", null, HttpExtension.DELETE).block(); - persons = Arrays.asList(client.invokeMethod(daprRun.getAppName(), "persons", null, HttpExtension.GET, Person[].class).block()); + Map> queryParams = Map.of("uri", List.of("abc/pqr")); + HttpExtension httpExtension = new HttpExtension(DaprHttp.HttpMethods.GET, queryParams, Map.of()); + persons = Arrays.asList(client.invokeMethod(daprRun.getAppName(), "persons", null, httpExtension, Person[].class).block()); assertEquals(9, persons.size()); Person person = new Person(); diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeQueryParamEncodingIT.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeQueryParamEncodingIT.java deleted file mode 100644 index 6a48d06c88..0000000000 --- a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeQueryParamEncodingIT.java +++ /dev/null @@ -1,46 +0,0 @@ -package io.dapr.it.methodinvoke.http; - -import io.dapr.client.DaprClient; -import io.dapr.client.DaprHttp; -import io.dapr.client.domain.HttpExtension; -import io.dapr.it.BaseIT; -import io.dapr.it.DaprRun; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class MethodInvokeQueryParamEncodingIT extends BaseIT { - - private DaprRun daprRun = null; - - @BeforeEach - public void init() throws Exception { - daprRun = startDaprApp( - MethodInvokeQueryParamEncodingIT.class.getSimpleName() + "http", - MethodInvokeService.SUCCESS_MESSAGE, - MethodInvokeService.class, - true, - 30000); - daprRun.waitForAppHealth(20000); - } - - @Test - public void testInvokeQueryParams() throws Exception { - try (DaprClient client = daprRun.newDaprClientBuilder().build()) { - client.waitForSidecar(10000).block(); - - String uri = "abc/pqr"; - Map> queryParams = Map.of("uri", List.of(uri)); - HttpExtension httpExtension = new HttpExtension(DaprHttp.HttpMethods.GET, queryParams, Map.of()); - String result = client.invokeMethod(daprRun.getAppName(), "query", null, - httpExtension, String.class).block(); - - assertEquals(uri, result); - } - } - -} From cd116aa909b989702c4dc8e801f802e94f996c57 Mon Sep 17 00:00:00 2001 From: Artur Ciocanu Date: Thu, 24 Apr 2025 10:25:37 -0700 Subject: [PATCH 08/12] Adjust the test to use ServerRequest Signed-off-by: Artur Ciocanu --- .../it/methodinvoke/http/MethodInvokeController.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java index 5f7aa60486..c817ce8d77 100644 --- a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java +++ b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java @@ -6,8 +6,8 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.function.ServerRequest; import java.util.ArrayList; import java.util.HashMap; @@ -77,12 +77,12 @@ public void deletePerson(@PathVariable("personId") Integer personId){ } @GetMapping(path = "/persons") - public List getPersons(@RequestParam(required = false) String uri) { - if (uri != null) { - System.out.println("MethodInvokeController->get persons with uri: " + uri); - } + public List getPersons(ServerRequest request) { + Optional uri = request.param("uri"); + + uri.ifPresent(value -> System.out.println("MethodInvokeController->get persons with uri: " + value)); - return persons; + return persons; } @PostMapping(path = "/sleep") From 27e9eedece6c4317b542d7e057c31d74ef81ccbd Mon Sep 17 00:00:00 2001 From: Artur Ciocanu Date: Fri, 25 Apr 2025 16:11:40 -0700 Subject: [PATCH 09/12] Test removing things from method invoke controller Signed-off-by: Artur Ciocanu --- .../dapr/it/methodinvoke/http/MethodInvokeController.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java index c817ce8d77..2e95a0d36a 100644 --- a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java +++ b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java @@ -7,7 +7,6 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.function.ServerRequest; import java.util.ArrayList; import java.util.HashMap; @@ -77,11 +76,7 @@ public void deletePerson(@PathVariable("personId") Integer personId){ } @GetMapping(path = "/persons") - public List getPersons(ServerRequest request) { - Optional uri = request.param("uri"); - - uri.ifPresent(value -> System.out.println("MethodInvokeController->get persons with uri: " + value)); - + public List getPersons() { return persons; } From c370d9f7aa55abff3073b5cab65a9a91ea41f676 Mon Sep 17 00:00:00 2001 From: Artur Ciocanu Date: Fri, 25 Apr 2025 21:07:34 -0700 Subject: [PATCH 10/12] Add query param encoding test Signed-off-by: Artur Ciocanu --- .../http/MethodInvokeController.java | 6 ++ .../it/methodinvoke/http/MethodInvokeIT.java | 58 +++++++++++++------ 2 files changed, 46 insertions(+), 18 deletions(-) diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java index 2e95a0d36a..31d25e1d37 100644 --- a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java +++ b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java @@ -6,6 +6,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; @@ -88,6 +89,11 @@ public void sleep(@RequestBody int seconds) throws InterruptedException { Thread.sleep(seconds * 1000); } + @GetMapping(path = "/query") + public Map getQuery(@RequestParam("uri") String uri) { + return Map.of("uri", uri); + } + @GetMapping(path = "/health") public void health() { } diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java index 3ae735d837..a3d094f7f1 100644 --- a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java @@ -1,7 +1,7 @@ package io.dapr.it.methodinvoke.http; +import com.fasterxml.jackson.databind.JsonNode; import io.dapr.client.DaprClient; -import io.dapr.client.DaprClientBuilder; import io.dapr.client.DaprHttp; import io.dapr.client.domain.HttpExtension; import io.dapr.exceptions.DaprException; @@ -36,19 +36,16 @@ public class MethodInvokeIT extends BaseIT { @BeforeEach public void init() throws Exception { daprRun = startDaprApp( - MethodInvokeIT.class.getSimpleName() + "http", - MethodInvokeService.SUCCESS_MESSAGE, - MethodInvokeService.class, - true, - 30000); + MethodInvokeIT.class.getSimpleName() + "http", + MethodInvokeService.SUCCESS_MESSAGE, + MethodInvokeService.class, + true, + 30000); daprRun.waitForAppHealth(20000); } @Test public void testInvoke() throws Exception { - - // At this point, it is guaranteed that the service above is running and all ports being listened to. - try (DaprClient client = daprRun.newDaprClientBuilder().build()) { client.waitForSidecar(10000).block(); for (int i = 0; i < NUM_MESSAGES; i++) { @@ -64,11 +61,14 @@ public void testInvoke() throws Exception { client.invokeMethod(daprRun.getAppName(), "messages/1", null, HttpExtension.DELETE).block(); - messages = client.invokeMethod(daprRun.getAppName(), "messages", null, HttpExtension.GET, Map.class).block(); + messages = + client.invokeMethod(daprRun.getAppName(), "messages", null, HttpExtension.GET, Map.class).block(); assertEquals(9, messages.size()); - client.invokeMethod(daprRun.getAppName(), "messages/2", "updated message".getBytes(), HttpExtension.PUT).block(); - messages = client.invokeMethod(daprRun.getAppName(), "messages", null, HttpExtension.GET, Map.class).block(); + client.invokeMethod(daprRun.getAppName(), "messages/2", "updated message".getBytes(), HttpExtension.PUT) + .block(); + messages = + client.invokeMethod(daprRun.getAppName(), "messages", null, HttpExtension.GET, Map.class).block(); assertEquals("updated message", messages.get("2")); } } @@ -87,14 +87,14 @@ public void testInvokeWithObjects() throws Exception { System.out.println("Invoke method persons with parameter : " + person); } - List persons = Arrays.asList(client.invokeMethod(daprRun.getAppName(), "persons", null, HttpExtension.GET, Person[].class).block()); + List persons = Arrays.asList( + client.invokeMethod(daprRun.getAppName(), "persons", null, HttpExtension.GET, Person[].class).block()); assertEquals(10, persons.size()); client.invokeMethod(daprRun.getAppName(), "persons/1", null, HttpExtension.DELETE).block(); - Map> queryParams = Map.of("uri", List.of("abc/pqr")); - HttpExtension httpExtension = new HttpExtension(DaprHttp.HttpMethods.GET, queryParams, Map.of()); - persons = Arrays.asList(client.invokeMethod(daprRun.getAppName(), "persons", null, httpExtension, Person[].class).block()); + persons = Arrays.asList( + client.invokeMethod(daprRun.getAppName(), "persons", null, HttpExtension.GET, Person[].class).block()); assertEquals(9, persons.size()); Person person = new Person(); @@ -104,7 +104,8 @@ public void testInvokeWithObjects() throws Exception { client.invokeMethod(daprRun.getAppName(), "persons/2", person, HttpExtension.PUT).block(); - persons = Arrays.asList(client.invokeMethod(daprRun.getAppName(), "persons", null, HttpExtension.GET, Person[].class).block()); + persons = Arrays.asList( + client.invokeMethod(daprRun.getAppName(), "persons", null, HttpExtension.GET, Person[].class).block()); Person resultPerson = persons.get(1); assertEquals("John", resultPerson.getName()); assertEquals("Smith", resultPerson.getLastName()); @@ -132,7 +133,8 @@ public void testInvokeTimeout() throws Exception { public void testInvokeException() throws Exception { try (DaprClient client = daprRun.newDaprClientBuilder().build()) { client.waitForSidecar(10000).block(); - MethodInvokeServiceProtos.SleepRequest req = MethodInvokeServiceProtos.SleepRequest.newBuilder().setSeconds(-9).build(); + MethodInvokeServiceProtos.SleepRequest req = + MethodInvokeServiceProtos.SleepRequest.newBuilder().setSeconds(-9).build(); DaprException exception = assertThrows(DaprException.class, () -> client.invokeMethod(daprRun.getAppName(), "sleep", -9, HttpExtension.POST).block()); @@ -143,4 +145,24 @@ public void testInvokeException() throws Exception { assertTrue(new String(exception.getPayload()).contains("Internal Server Error")); } } + + @Test + public void testInvokeQueryParamEncoding() throws Exception { + try (DaprClient client = daprRun.newDaprClientBuilder().build()) { + client.waitForSidecar(10000).block(); + + String uri = "abc/pqr"; + Map> queryParams = Map.of("uri", List.of(uri)); + HttpExtension httpExtension = new HttpExtension(DaprHttp.HttpMethods.GET, queryParams, Map.of()); + JsonNode result = client.invokeMethod( + daprRun.getAppName(), + "/query", + null, + httpExtension, + JsonNode.class + ).block(); + + assertEquals(uri, result.get("uri").asText()); + } + } } From 3a3363db2603738db492e9ddf2cfe067477792a9 Mon Sep 17 00:00:00 2001 From: Artur Ciocanu Date: Fri, 25 Apr 2025 21:12:14 -0700 Subject: [PATCH 11/12] Revert some unintended changes Signed-off-by: Artur Ciocanu --- .../http/MethodInvokeController.java | 2 +- .../it/methodinvoke/http/MethodInvokeIT.java | 24 ++++++++----------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java index 31d25e1d37..d381e2ac69 100644 --- a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java +++ b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java @@ -78,7 +78,7 @@ public void deletePerson(@PathVariable("personId") Integer personId){ @GetMapping(path = "/persons") public List getPersons() { - return persons; + return persons; } @PostMapping(path = "/sleep") diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java index a3d094f7f1..67f96908ed 100644 --- a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java @@ -46,6 +46,9 @@ public void init() throws Exception { @Test public void testInvoke() throws Exception { + + // At this point, it is guaranteed that the service above is running and all ports being listened to. + try (DaprClient client = daprRun.newDaprClientBuilder().build()) { client.waitForSidecar(10000).block(); for (int i = 0; i < NUM_MESSAGES; i++) { @@ -61,14 +64,11 @@ public void testInvoke() throws Exception { client.invokeMethod(daprRun.getAppName(), "messages/1", null, HttpExtension.DELETE).block(); - messages = - client.invokeMethod(daprRun.getAppName(), "messages", null, HttpExtension.GET, Map.class).block(); + messages = client.invokeMethod(daprRun.getAppName(), "messages", null, HttpExtension.GET, Map.class).block(); assertEquals(9, messages.size()); - client.invokeMethod(daprRun.getAppName(), "messages/2", "updated message".getBytes(), HttpExtension.PUT) - .block(); - messages = - client.invokeMethod(daprRun.getAppName(), "messages", null, HttpExtension.GET, Map.class).block(); + client.invokeMethod(daprRun.getAppName(), "messages/2", "updated message".getBytes(), HttpExtension.PUT).block(); + messages = client.invokeMethod(daprRun.getAppName(), "messages", null, HttpExtension.GET, Map.class).block(); assertEquals("updated message", messages.get("2")); } } @@ -87,14 +87,12 @@ public void testInvokeWithObjects() throws Exception { System.out.println("Invoke method persons with parameter : " + person); } - List persons = Arrays.asList( - client.invokeMethod(daprRun.getAppName(), "persons", null, HttpExtension.GET, Person[].class).block()); + List persons = Arrays.asList(client.invokeMethod(daprRun.getAppName(), "persons", null, HttpExtension.GET, Person[].class).block()); assertEquals(10, persons.size()); client.invokeMethod(daprRun.getAppName(), "persons/1", null, HttpExtension.DELETE).block(); - persons = Arrays.asList( - client.invokeMethod(daprRun.getAppName(), "persons", null, HttpExtension.GET, Person[].class).block()); + persons = Arrays.asList(client.invokeMethod(daprRun.getAppName(), "persons", null, HttpExtension.GET, Person[].class).block()); assertEquals(9, persons.size()); Person person = new Person(); @@ -104,8 +102,7 @@ public void testInvokeWithObjects() throws Exception { client.invokeMethod(daprRun.getAppName(), "persons/2", person, HttpExtension.PUT).block(); - persons = Arrays.asList( - client.invokeMethod(daprRun.getAppName(), "persons", null, HttpExtension.GET, Person[].class).block()); + persons = Arrays.asList(client.invokeMethod(daprRun.getAppName(), "persons", null, HttpExtension.GET, Person[].class).block()); Person resultPerson = persons.get(1); assertEquals("John", resultPerson.getName()); assertEquals("Smith", resultPerson.getLastName()); @@ -133,8 +130,7 @@ public void testInvokeTimeout() throws Exception { public void testInvokeException() throws Exception { try (DaprClient client = daprRun.newDaprClientBuilder().build()) { client.waitForSidecar(10000).block(); - MethodInvokeServiceProtos.SleepRequest req = - MethodInvokeServiceProtos.SleepRequest.newBuilder().setSeconds(-9).build(); + MethodInvokeServiceProtos.SleepRequest req = MethodInvokeServiceProtos.SleepRequest.newBuilder().setSeconds(-9).build(); DaprException exception = assertThrows(DaprException.class, () -> client.invokeMethod(daprRun.getAppName(), "sleep", -9, HttpExtension.POST).block()); From 74a769e0c3d597aad030f1a0817ffac35a83e2c9 Mon Sep 17 00:00:00 2001 From: Artur Ciocanu Date: Fri, 25 Apr 2025 21:14:14 -0700 Subject: [PATCH 12/12] Some tiny styles Signed-off-by: Artur Ciocanu --- .../io/dapr/it/methodinvoke/http/MethodInvokeIT.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java index 67f96908ed..9d9ac02f8b 100644 --- a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java @@ -36,11 +36,11 @@ public class MethodInvokeIT extends BaseIT { @BeforeEach public void init() throws Exception { daprRun = startDaprApp( - MethodInvokeIT.class.getSimpleName() + "http", - MethodInvokeService.SUCCESS_MESSAGE, - MethodInvokeService.class, - true, - 30000); + MethodInvokeIT.class.getSimpleName() + "http", + MethodInvokeService.SUCCESS_MESSAGE, + MethodInvokeService.class, + true, + 30000); daprRun.waitForAppHealth(20000); }