From 17e4f28a7ec1f4ba1d6c9b7d37e720f2bc832a0d Mon Sep 17 00:00:00 2001 From: shafang Date: Mon, 25 Nov 2019 15:48:09 -0800 Subject: [PATCH 1/6] draft --- .../ConfigurationClientBuilder.java | 14 ++ .../implementation/CustomHeadersPolicy.java | 43 ++++++ .../CustomizedHeadersTest.java | 133 ++++++++++++++++++ 3 files changed, 190 insertions(+) create mode 100644 sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/implementation/CustomHeadersPolicy.java create mode 100644 sdk/appconfiguration/azure-data-appconfiguration/src/test/java/com/azure/data/appconfiguration/CustomizedHeadersTest.java diff --git a/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/ConfigurationClientBuilder.java b/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/ConfigurationClientBuilder.java index df4d670d247e..6400d7486338 100644 --- a/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/ConfigurationClientBuilder.java +++ b/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/ConfigurationClientBuilder.java @@ -36,6 +36,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.Supplier; /** * This class provides a fluent builder API to help aid the configuration and instantiation of @@ -97,6 +98,7 @@ public final class ConfigurationClientBuilder { private HttpPipelinePolicy retryPolicy; private Configuration configuration; private ConfigurationServiceVersion version; + private Supplier headersSupplier; /** * The constructor with defaults. @@ -377,6 +379,18 @@ public ConfigurationClientBuilder serviceVersion(ConfigurationServiceVersion ver return this; } + /** + * Sets the customized headers that is used when each request is sent. It is possible to use new header value for + * each request. + * + * @param headersSupplier user's headers supplier applied to each request. + * @return The updated ConfigurationClientBuilder object. + */ + public ConfigurationClientBuilder headersSupplier(Supplier headersSupplier) { + this.headersSupplier = headersSupplier; + return this; + } + private String getBuildEndpoint() { if (endpoint != null) { return endpoint; diff --git a/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/implementation/CustomHeadersPolicy.java b/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/implementation/CustomHeadersPolicy.java new file mode 100644 index 000000000000..ed1af52c7b41 --- /dev/null +++ b/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/implementation/CustomHeadersPolicy.java @@ -0,0 +1,43 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.data.appconfiguration.implementation; + +import com.azure.core.http.HttpHeader; +import com.azure.core.http.HttpHeaders; +import com.azure.core.http.HttpPipelineCallContext; +import com.azure.core.http.HttpPipelineNextPolicy; +import com.azure.core.http.HttpResponse; +import com.azure.core.http.policy.HttpPipelinePolicy; +import reactor.core.publisher.Mono; + +import java.util.Objects; +import java.util.function.Supplier; + +public class CustomHeadersPolicy implements HttpPipelinePolicy { + private final Supplier customHeaderSupplier; + + public CustomHeadersPolicy(Supplier customHeaderSupplier) { + this.customHeaderSupplier = Objects.requireNonNull(customHeaderSupplier, "Custom header cannot be null"); + } + + /** + * Adds the customized headers to authenticate a request to Azure App Configuration service. + * + * @param context The request context + * @param next The next HTTP pipeline policy to process the {@code context's} request after this policy + * completes. + * @return A {@link Mono} representing the HTTP response that will arrive asynchronously. + */ + @Override + public Mono process(HttpPipelineCallContext context, HttpPipelineNextPolicy next) { + final HttpHeaders httpHeaders = customHeaderSupplier.get(); + + if (Objects.nonNull(httpHeaders) && httpHeaders.getSize() > 0) { + for (HttpHeader header : httpHeaders) { + context.getHttpRequest().getHeaders().put(header.getName(), header.getValue()); + } + } + return next.process(); + } +} diff --git a/sdk/appconfiguration/azure-data-appconfiguration/src/test/java/com/azure/data/appconfiguration/CustomizedHeadersTest.java b/sdk/appconfiguration/azure-data-appconfiguration/src/test/java/com/azure/data/appconfiguration/CustomizedHeadersTest.java new file mode 100644 index 000000000000..600efd94bbf1 --- /dev/null +++ b/sdk/appconfiguration/azure-data-appconfiguration/src/test/java/com/azure/data/appconfiguration/CustomizedHeadersTest.java @@ -0,0 +1,133 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.data.appconfiguration; + +import com.azure.core.http.HttpHeaders; +import com.azure.core.http.HttpMethod; +import com.azure.core.http.HttpPipeline; +import com.azure.core.http.HttpPipelineBuilder; +import com.azure.core.http.HttpRequest; +import com.azure.core.http.HttpResponse; +import com.azure.core.http.policy.FixedDelay; +import com.azure.core.http.policy.RetryPolicy; +import com.azure.core.test.http.NoOpHttpClient; +import com.azure.data.appconfiguration.implementation.CustomHeadersPolicy; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.net.URL; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.time.Duration; +import java.time.temporal.ChronoUnit; +import java.util.UUID; +import java.util.function.Supplier; + +public class CustomizedHeadersTest { + + private static final String REQUEST_ID_HEADER = "x-ms-client-request-id"; + private static final String CORRELATION_ID_HEADER = "x-ms-correlation-request-id"; + private static final String CORRELATION_CONTEXT_HEADER = "correlation-context"; + + private final HttpResponse mockResponse = new HttpResponse(null) { + @Override + public int getStatusCode() { + return 500; + } + @Override + public String getHeaderValue(String name) { + return null; + } + @Override + public HttpHeaders getHeaders() { + return new HttpHeaders(); + } + @Override + public Mono getBodyAsByteArray() { + return Mono.empty(); + } + @Override + public Flux getBody() { + return Flux.empty(); + } + @Override + public Mono getBodyAsString() { + return Mono.empty(); + } + @Override + public Mono getBodyAsString(Charset charset) { + return Mono.empty(); + } + }; + + + @Test + public void newRequestIdForEachCall() throws Exception { + + String customRequestIdHeaderName = "x-ms-client-custom-request-id"; + String clientProvidedRequestId = UUID.randomUUID().toString(); + + Supplier requestIdSupplier = () -> + new HttpHeaders().put(customRequestIdHeaderName, clientProvidedRequestId); + + HttpPipeline pipeline = new HttpPipelineBuilder() + .httpClient(new NoOpHttpClient() { + String firstRequestId = null; + @Override + public Mono send(HttpRequest request) { + if (firstRequestId != null) { + String newRequestId = request.getHeaders().getValue(REQUEST_ID_HEADER); + Assertions.assertNotNull(newRequestId); + Assertions.assertNotEquals(newRequestId, firstRequestId); + } + firstRequestId = request.getHeaders().getValue(REQUEST_ID_HEADER); + if (firstRequestId == null) { + Assertions.fail(); + } + return Mono.just(mockResponse); + } + }) + .policies(new CustomHeadersPolicy(requestIdSupplier)) + .build(); + pipeline.send(new HttpRequest(HttpMethod.GET, new URL("http://localhost/"))).block(); + pipeline.send(new HttpRequest(HttpMethod.GET, new URL("http://localhost/"))).block(); + } + + + @Test + public void clientProvidedRequestIdForRetry() throws Exception { + + String customRequestIdHeaderName = "x-ms-client-custom-request-id"; + String clientProvidedRequestId = UUID.randomUUID().toString(); + + Supplier requestIdSupplier = () -> + new HttpHeaders().put(customRequestIdHeaderName, clientProvidedRequestId); + final HttpPipeline pipeline = new HttpPipelineBuilder() + .httpClient(new NoOpHttpClient() { + String firstRequestId = null; + + @Override + public Mono send(HttpRequest request) { + if (firstRequestId != null) { + String newRequestId = request.getHeaders().getValue(customRequestIdHeaderName); + Assertions.assertNotNull(newRequestId); + Assertions.assertEquals(newRequestId, firstRequestId); + Assertions.assertEquals(newRequestId, clientProvidedRequestId); + } + firstRequestId = request.getHeaders().getValue(customRequestIdHeaderName); + if (firstRequestId == null) { + Assertions.fail(); + } + return Mono.just(mockResponse); + } + }) + .policies(new CustomHeadersPolicy(requestIdSupplier), + new RetryPolicy(new FixedDelay(1, Duration.of(0, ChronoUnit.SECONDS)))) + .build(); + + pipeline.send(new HttpRequest(HttpMethod.GET, new URL("http://localhost/"))).block(); + } +} From 5b39b9e9d98be442f4846baecaea55da51423d92 Mon Sep 17 00:00:00 2001 From: shafang Date: Mon, 9 Dec 2019 23:44:25 -0800 Subject: [PATCH 2/6] revert back to no changes --- .../ConfigurationClientBuilder.java | 14 -- .../implementation/CustomHeadersPolicy.java | 43 ------ .../CustomizedHeadersTest.java | 133 ------------------ 3 files changed, 190 deletions(-) delete mode 100644 sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/implementation/CustomHeadersPolicy.java delete mode 100644 sdk/appconfiguration/azure-data-appconfiguration/src/test/java/com/azure/data/appconfiguration/CustomizedHeadersTest.java diff --git a/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/ConfigurationClientBuilder.java b/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/ConfigurationClientBuilder.java index 6400d7486338..df4d670d247e 100644 --- a/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/ConfigurationClientBuilder.java +++ b/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/ConfigurationClientBuilder.java @@ -36,7 +36,6 @@ import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.function.Supplier; /** * This class provides a fluent builder API to help aid the configuration and instantiation of @@ -98,7 +97,6 @@ public final class ConfigurationClientBuilder { private HttpPipelinePolicy retryPolicy; private Configuration configuration; private ConfigurationServiceVersion version; - private Supplier headersSupplier; /** * The constructor with defaults. @@ -379,18 +377,6 @@ public ConfigurationClientBuilder serviceVersion(ConfigurationServiceVersion ver return this; } - /** - * Sets the customized headers that is used when each request is sent. It is possible to use new header value for - * each request. - * - * @param headersSupplier user's headers supplier applied to each request. - * @return The updated ConfigurationClientBuilder object. - */ - public ConfigurationClientBuilder headersSupplier(Supplier headersSupplier) { - this.headersSupplier = headersSupplier; - return this; - } - private String getBuildEndpoint() { if (endpoint != null) { return endpoint; diff --git a/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/implementation/CustomHeadersPolicy.java b/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/implementation/CustomHeadersPolicy.java deleted file mode 100644 index ed1af52c7b41..000000000000 --- a/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/implementation/CustomHeadersPolicy.java +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.data.appconfiguration.implementation; - -import com.azure.core.http.HttpHeader; -import com.azure.core.http.HttpHeaders; -import com.azure.core.http.HttpPipelineCallContext; -import com.azure.core.http.HttpPipelineNextPolicy; -import com.azure.core.http.HttpResponse; -import com.azure.core.http.policy.HttpPipelinePolicy; -import reactor.core.publisher.Mono; - -import java.util.Objects; -import java.util.function.Supplier; - -public class CustomHeadersPolicy implements HttpPipelinePolicy { - private final Supplier customHeaderSupplier; - - public CustomHeadersPolicy(Supplier customHeaderSupplier) { - this.customHeaderSupplier = Objects.requireNonNull(customHeaderSupplier, "Custom header cannot be null"); - } - - /** - * Adds the customized headers to authenticate a request to Azure App Configuration service. - * - * @param context The request context - * @param next The next HTTP pipeline policy to process the {@code context's} request after this policy - * completes. - * @return A {@link Mono} representing the HTTP response that will arrive asynchronously. - */ - @Override - public Mono process(HttpPipelineCallContext context, HttpPipelineNextPolicy next) { - final HttpHeaders httpHeaders = customHeaderSupplier.get(); - - if (Objects.nonNull(httpHeaders) && httpHeaders.getSize() > 0) { - for (HttpHeader header : httpHeaders) { - context.getHttpRequest().getHeaders().put(header.getName(), header.getValue()); - } - } - return next.process(); - } -} diff --git a/sdk/appconfiguration/azure-data-appconfiguration/src/test/java/com/azure/data/appconfiguration/CustomizedHeadersTest.java b/sdk/appconfiguration/azure-data-appconfiguration/src/test/java/com/azure/data/appconfiguration/CustomizedHeadersTest.java deleted file mode 100644 index 600efd94bbf1..000000000000 --- a/sdk/appconfiguration/azure-data-appconfiguration/src/test/java/com/azure/data/appconfiguration/CustomizedHeadersTest.java +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.data.appconfiguration; - -import com.azure.core.http.HttpHeaders; -import com.azure.core.http.HttpMethod; -import com.azure.core.http.HttpPipeline; -import com.azure.core.http.HttpPipelineBuilder; -import com.azure.core.http.HttpRequest; -import com.azure.core.http.HttpResponse; -import com.azure.core.http.policy.FixedDelay; -import com.azure.core.http.policy.RetryPolicy; -import com.azure.core.test.http.NoOpHttpClient; -import com.azure.data.appconfiguration.implementation.CustomHeadersPolicy; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -import java.net.URL; -import java.nio.ByteBuffer; -import java.nio.charset.Charset; -import java.time.Duration; -import java.time.temporal.ChronoUnit; -import java.util.UUID; -import java.util.function.Supplier; - -public class CustomizedHeadersTest { - - private static final String REQUEST_ID_HEADER = "x-ms-client-request-id"; - private static final String CORRELATION_ID_HEADER = "x-ms-correlation-request-id"; - private static final String CORRELATION_CONTEXT_HEADER = "correlation-context"; - - private final HttpResponse mockResponse = new HttpResponse(null) { - @Override - public int getStatusCode() { - return 500; - } - @Override - public String getHeaderValue(String name) { - return null; - } - @Override - public HttpHeaders getHeaders() { - return new HttpHeaders(); - } - @Override - public Mono getBodyAsByteArray() { - return Mono.empty(); - } - @Override - public Flux getBody() { - return Flux.empty(); - } - @Override - public Mono getBodyAsString() { - return Mono.empty(); - } - @Override - public Mono getBodyAsString(Charset charset) { - return Mono.empty(); - } - }; - - - @Test - public void newRequestIdForEachCall() throws Exception { - - String customRequestIdHeaderName = "x-ms-client-custom-request-id"; - String clientProvidedRequestId = UUID.randomUUID().toString(); - - Supplier requestIdSupplier = () -> - new HttpHeaders().put(customRequestIdHeaderName, clientProvidedRequestId); - - HttpPipeline pipeline = new HttpPipelineBuilder() - .httpClient(new NoOpHttpClient() { - String firstRequestId = null; - @Override - public Mono send(HttpRequest request) { - if (firstRequestId != null) { - String newRequestId = request.getHeaders().getValue(REQUEST_ID_HEADER); - Assertions.assertNotNull(newRequestId); - Assertions.assertNotEquals(newRequestId, firstRequestId); - } - firstRequestId = request.getHeaders().getValue(REQUEST_ID_HEADER); - if (firstRequestId == null) { - Assertions.fail(); - } - return Mono.just(mockResponse); - } - }) - .policies(new CustomHeadersPolicy(requestIdSupplier)) - .build(); - pipeline.send(new HttpRequest(HttpMethod.GET, new URL("http://localhost/"))).block(); - pipeline.send(new HttpRequest(HttpMethod.GET, new URL("http://localhost/"))).block(); - } - - - @Test - public void clientProvidedRequestIdForRetry() throws Exception { - - String customRequestIdHeaderName = "x-ms-client-custom-request-id"; - String clientProvidedRequestId = UUID.randomUUID().toString(); - - Supplier requestIdSupplier = () -> - new HttpHeaders().put(customRequestIdHeaderName, clientProvidedRequestId); - final HttpPipeline pipeline = new HttpPipelineBuilder() - .httpClient(new NoOpHttpClient() { - String firstRequestId = null; - - @Override - public Mono send(HttpRequest request) { - if (firstRequestId != null) { - String newRequestId = request.getHeaders().getValue(customRequestIdHeaderName); - Assertions.assertNotNull(newRequestId); - Assertions.assertEquals(newRequestId, firstRequestId); - Assertions.assertEquals(newRequestId, clientProvidedRequestId); - } - firstRequestId = request.getHeaders().getValue(customRequestIdHeaderName); - if (firstRequestId == null) { - Assertions.fail(); - } - return Mono.just(mockResponse); - } - }) - .policies(new CustomHeadersPolicy(requestIdSupplier), - new RetryPolicy(new FixedDelay(1, Duration.of(0, ChronoUnit.SECONDS)))) - .build(); - - pipeline.send(new HttpRequest(HttpMethod.GET, new URL("http://localhost/"))).block(); - } -} From 1b813e30202cd41c2a12ed9d60984b47f4f8a134 Mon Sep 17 00:00:00 2001 From: shafang Date: Tue, 10 Dec 2019 00:07:46 -0800 Subject: [PATCH 3/6] add AddHeadersFromContextPolicy and docs --- .../azure-data-appconfiguration/README.md | 17 +++++++++++++++++ .../azure-data-appconfiguration/pom.xml | 4 ++-- .../ConfigurationClientBuilder.java | 2 ++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/sdk/appconfiguration/azure-data-appconfiguration/README.md b/sdk/appconfiguration/azure-data-appconfiguration/README.md index 37fe5789f2d6..52820c3b0f3a 100644 --- a/sdk/appconfiguration/azure-data-appconfiguration/README.md +++ b/sdk/appconfiguration/azure-data-appconfiguration/README.md @@ -307,6 +307,22 @@ ConfigurationSetting setting = client.setReadOnly("some_key", "some_label", fals When you interact with App Configuration using this Java client library, errors returned by the service correspond to the same HTTP status codes returned for [REST API][rest_api] requests. For example, if you try to retrieve a configuration setting that doesn't exist in your configuration store, a `404` error is returned, indicating `Not Found`. +App Configuration provides a way to define customized headers through `Context` object in the public API. + +```java + // Add your headers + HttpHeaders headers = new HttpHeaders(); + headers.put("my-header1", "my-header1-value"); + headers.put("my-header2", "my-header2-value"); + headers.put("my-header3", "my-header3-value"); + // Call API by passing headers in Context. + configurationClient.addConfigurationSettingWithResponse( + new ConfigurationSetting().setKey("key").setValue("value"), + new Context(AddHeadersFromContextPolicy.AZURE_REQUEST_HTTP_HEADERS_KEY, headers)); + // Above three HttpHeader will be added in outgoing HttpRequest. +``` +For more detail information, check out the [AddHeadersFromContextPolicy][add_headers_from_context_policy] + ## Next steps - Samples are explained in detail [here][samples_readme]. @@ -338,5 +354,6 @@ This project has adopted the [Microsoft Open Source Code of Conduct][coc]. For m [source_code]: src [spring_quickstart]: https://docs.microsoft.com/azure/azure-app-configuration/quickstart-java-spring-app [performance_tuning]: https://github.com/Azure/azure-sdk-for-java/wiki/Performance-Tuning +[add_headers_from_context_policy]: https://github.com/Azure/azure-sdk-for-java/blob/master/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/AddHeadersFromContextPolicy.java ![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-java%2Fsdk%2Fappconfiguration%2Fazure-data-appconfiguration%2FREADME.png) diff --git a/sdk/appconfiguration/azure-data-appconfiguration/pom.xml b/sdk/appconfiguration/azure-data-appconfiguration/pom.xml index 0a6b96f9b9a9..dd9df262314e 100644 --- a/sdk/appconfiguration/azure-data-appconfiguration/pom.xml +++ b/sdk/appconfiguration/azure-data-appconfiguration/pom.xml @@ -36,7 +36,7 @@ com.azure azure-core - 1.1.0 + 1.2.0-beta.1 org.slf4j @@ -46,7 +46,7 @@ com.azure azure-core-http-netty - 1.1.0 + 1.2.0-beta.1 diff --git a/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/ConfigurationClientBuilder.java b/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/ConfigurationClientBuilder.java index df4d670d247e..4091c4db4ad9 100644 --- a/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/ConfigurationClientBuilder.java +++ b/sdk/appconfiguration/azure-data-appconfiguration/src/main/java/com/azure/data/appconfiguration/ConfigurationClientBuilder.java @@ -10,6 +10,7 @@ import com.azure.core.http.HttpPipeline; import com.azure.core.http.HttpPipelineBuilder; import com.azure.core.http.policy.AddDatePolicy; +import com.azure.core.http.policy.AddHeadersFromContextPolicy; import com.azure.core.http.policy.AddHeadersPolicy; import com.azure.core.http.policy.BearerTokenAuthenticationPolicy; import com.azure.core.http.policy.HttpLogDetailLevel; @@ -178,6 +179,7 @@ public ConfigurationAsyncClient buildAsyncClient() { policies.add(new UserAgentPolicy(httpLogOptions.getApplicationId(), clientName, clientVersion, buildConfiguration)); policies.add(new RequestIdPolicy()); + policies.add(new AddHeadersFromContextPolicy()); policies.add(new AddHeadersPolicy(headers)); policies.add(new AddDatePolicy()); From 3952d406b6c51fead98de04a1474599395592706 Mon Sep 17 00:00:00 2001 From: shafang Date: Tue, 10 Dec 2019 20:21:46 -0800 Subject: [PATCH 4/6] revert back version --- sdk/appconfiguration/azure-data-appconfiguration/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/appconfiguration/azure-data-appconfiguration/pom.xml b/sdk/appconfiguration/azure-data-appconfiguration/pom.xml index dd9df262314e..d58d7284969a 100644 --- a/sdk/appconfiguration/azure-data-appconfiguration/pom.xml +++ b/sdk/appconfiguration/azure-data-appconfiguration/pom.xml @@ -46,7 +46,7 @@ com.azure azure-core-http-netty - 1.2.0-beta.1 + 1.1.0 From 60648db0492b74e5e787e12554f43d2a37815e3d Mon Sep 17 00:00:00 2001 From: shafang Date: Wed, 11 Dec 2019 17:37:23 -0800 Subject: [PATCH 5/6] add test --- .../ConfigurationAsyncClientTest.java | 21 +++- .../ConfigurationClientTest.java | 36 ++++--- .../ConfigurationClientTestBase.java | 64 +++++++++++-- .../addHeadersFromContextPolicyTest.json | 95 +++++++++++++++++++ 4 files changed, 193 insertions(+), 23 deletions(-) create mode 100644 sdk/appconfiguration/azure-data-appconfiguration/src/test/resources/session-records/addHeadersFromContextPolicyTest.json diff --git a/sdk/appconfiguration/azure-data-appconfiguration/src/test/java/com/azure/data/appconfiguration/ConfigurationAsyncClientTest.java b/sdk/appconfiguration/azure-data-appconfiguration/src/test/java/com/azure/data/appconfiguration/ConfigurationAsyncClientTest.java index f82ea524ac25..0660e799f4bc 100644 --- a/sdk/appconfiguration/azure-data-appconfiguration/src/test/java/com/azure/data/appconfiguration/ConfigurationAsyncClientTest.java +++ b/sdk/appconfiguration/azure-data-appconfiguration/src/test/java/com/azure/data/appconfiguration/ConfigurationAsyncClientTest.java @@ -2,13 +2,12 @@ // Licensed under the MIT License. package com.azure.data.appconfiguration; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; - import com.azure.core.exception.HttpResponseException; import com.azure.core.exception.ResourceExistsException; import com.azure.core.exception.ResourceNotFoundException; +import com.azure.core.http.HttpHeaders; import com.azure.core.http.netty.NettyAsyncHttpClientBuilder; +import com.azure.core.http.policy.AddHeadersFromContextPolicy; import com.azure.core.http.policy.HttpLogDetailLevel; import com.azure.core.http.policy.HttpLogOptions; import com.azure.core.http.policy.RetryPolicy; @@ -29,6 +28,9 @@ import java.util.ArrayList; import java.util.List; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + public class ConfigurationAsyncClientTest extends ConfigurationClientTestBase { private final ClientLogger logger = new ClientLogger(ConfigurationAsyncClientTest.class); private static final String NO_LABEL = null; @@ -869,5 +871,18 @@ public void deleteAllSettings() { return client.deleteConfigurationSettingWithResponse(configurationSetting, false); }).blockLast(); } + + @Test + public void addHeadersFromContextPolicyTest() { + final HttpHeaders headers = getCustomizedHeaders(); + addHeadersFromContextPolicyRunner(expected -> + StepVerifier.create(client.addConfigurationSettingWithResponse(expected) + .subscriberContext(reactor.util.context.Context.of(AddHeadersFromContextPolicy.AZURE_REQUEST_HTTP_HEADERS_KEY, headers))) + .assertNext(response -> { + final HttpHeaders requestHeaders = response.getRequest().getHeaders(); + assertContainsHeaders(headers, requestHeaders); + }) + .verifyComplete()); + } } diff --git a/sdk/appconfiguration/azure-data-appconfiguration/src/test/java/com/azure/data/appconfiguration/ConfigurationClientTest.java b/sdk/appconfiguration/azure-data-appconfiguration/src/test/java/com/azure/data/appconfiguration/ConfigurationClientTest.java index 07c866d3547c..19037c813a44 100644 --- a/sdk/appconfiguration/azure-data-appconfiguration/src/test/java/com/azure/data/appconfiguration/ConfigurationClientTest.java +++ b/sdk/appconfiguration/azure-data-appconfiguration/src/test/java/com/azure/data/appconfiguration/ConfigurationClientTest.java @@ -2,30 +2,32 @@ // Licensed under the MIT License. package com.azure.data.appconfiguration; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; - import com.azure.core.exception.HttpResponseException; import com.azure.core.exception.ResourceExistsException; -import com.azure.core.http.netty.NettyAsyncHttpClientBuilder; -import com.azure.core.http.policy.HttpLogOptions; -import com.azure.data.appconfiguration.models.ConfigurationSetting; -import com.azure.data.appconfiguration.models.SettingFields; -import com.azure.data.appconfiguration.models.SettingSelector; import com.azure.core.exception.ResourceNotFoundException; +import com.azure.core.http.HttpHeaders; +import com.azure.core.http.netty.NettyAsyncHttpClientBuilder; +import com.azure.core.http.policy.AddHeadersFromContextPolicy; import com.azure.core.http.policy.HttpLogDetailLevel; +import com.azure.core.http.policy.HttpLogOptions; import com.azure.core.http.policy.RetryPolicy; import com.azure.core.http.rest.PagedIterable; +import com.azure.core.http.rest.Response; import com.azure.core.util.Context; import com.azure.core.util.logging.ClientLogger; +import com.azure.data.appconfiguration.models.ConfigurationSetting; +import com.azure.data.appconfiguration.models.SettingFields; +import com.azure.data.appconfiguration.models.SettingSelector; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; import java.net.HttpURLConnection; - import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; public class ConfigurationClientTest extends ConfigurationClientTestBase { private final ClientLogger logger = new ClientLogger(ConfigurationClientTest.class); @@ -644,4 +646,16 @@ public void deleteAllSettings() { client.deleteConfigurationSettingWithResponse(configurationSetting, false, Context.NONE).getValue(); }); } + + @Test + public void addHeadersFromContextPolicyTest() { + final HttpHeaders headers = getCustomizedHeaders(); + addHeadersFromContextPolicyRunner(expected -> { + final Response response = + client.addConfigurationSettingWithResponse(expected, + new Context(AddHeadersFromContextPolicy.AZURE_REQUEST_HTTP_HEADERS_KEY, headers)); + assertContainsHeaders(headers, response.getRequest().getHeaders()); + } + ); + } } diff --git a/sdk/appconfiguration/azure-data-appconfiguration/src/test/java/com/azure/data/appconfiguration/ConfigurationClientTestBase.java b/sdk/appconfiguration/azure-data-appconfiguration/src/test/java/com/azure/data/appconfiguration/ConfigurationClientTestBase.java index 9360de2315c6..a50b2ded5d8c 100644 --- a/sdk/appconfiguration/azure-data-appconfiguration/src/test/java/com/azure/data/appconfiguration/ConfigurationClientTestBase.java +++ b/sdk/appconfiguration/azure-data-appconfiguration/src/test/java/com/azure/data/appconfiguration/ConfigurationClientTestBase.java @@ -2,14 +2,8 @@ // Licensed under the MIT License. package com.azure.data.appconfiguration; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; - import com.azure.core.exception.HttpResponseException; +import com.azure.core.http.HttpHeaders; import com.azure.core.http.rest.Response; import com.azure.core.test.TestBase; import com.azure.core.util.Configuration; @@ -19,6 +13,9 @@ import com.azure.data.appconfiguration.models.ConfigurationSetting; import com.azure.data.appconfiguration.models.SettingFields; import com.azure.data.appconfiguration.models.SettingSelector; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + import java.lang.reflect.Field; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; @@ -34,8 +31,13 @@ import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Function; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; public abstract class ConfigurationClientTestBase extends TestBase { private static final String AZURE_APPCONFIG_CONNECTION_STRING = "AZURE_APPCONFIG_CONNECTION_STRING"; @@ -379,6 +381,17 @@ void listRevisionsWithMultipleLabelsRunner(String key, String label, String labe @Test public abstract void deleteAllSettings(); + @Test + public abstract void addHeadersFromContextPolicyTest(); + + void addHeadersFromContextPolicyRunner(Consumer testRunner) { + final String key = getKey(); + final String value = "newValue"; + + final ConfigurationSetting newConfiguration = new ConfigurationSetting().setKey(key).setValue(value); + testRunner.accept(newConfiguration); + } + /** * Helper method to verify that the RestResponse matches what was expected. This method assumes a response status of 200. * @@ -552,4 +565,37 @@ static boolean equalsArray(List settings1, List + assertEquals(headerContainer.getValue(httpHeader.getName()), httpHeader.getValue())); + } } diff --git a/sdk/appconfiguration/azure-data-appconfiguration/src/test/resources/session-records/addHeadersFromContextPolicyTest.json b/sdk/appconfiguration/azure-data-appconfiguration/src/test/resources/session-records/addHeadersFromContextPolicyTest.json new file mode 100644 index 000000000000..bffebd98e591 --- /dev/null +++ b/sdk/appconfiguration/azure-data-appconfiguration/src/test/resources/session-records/addHeadersFromContextPolicyTest.json @@ -0,0 +1,95 @@ +{ + "networkCallRecords" : [ { + "Method" : "PUT", + "Uri" : "https://appconfigtestshawnfang.azconfig.io/kv/key50977280758?api-version=1.0", + "Headers" : { + "User-Agent" : "azsdk-java-UnknownName/UnknownVersion (11.0.4; Windows 10 10.0)", + "x-ms-client-request-id" : "e9b22ff5-88bb-43dc-9fea-326b62ddcd14", + "Content-Type" : "application/json" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Server" : "openresty/1.15.8.1", + "Access-Control-Allow-Origin" : "*", + "Access-Control-Allow-Methods" : "GET, PUT, POST, DELETE, PATCH, OPTIONS", + "Connection" : "keep-alive", + "Last-Modified" : "Thu, 12 Dec 2019 01:34:03 GMT", + "retry-after" : "0", + "StatusCode" : "200", + "Date" : "Thu, 12 Dec 2019 01:34:02 GMT", + "Access-Control-Allow-Headers" : "DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Authorization, x-ms-client-request-id, x-ms-command-name, x-ms-content-sha256, x-ms-date, host, Accept, Accept-Datetime, Date, If-Match, If-None-Match, Sync-Token, x-ms-return-client-request-id, ETag, Last-Modified, Link, Memento-Datetime, x-ms-retry-after, x-ms-request-id, WWW-Authenticate", + "x-ms-correlation-request-id" : "d17cf096-d4b2-4e9b-8989-b995883f9220", + "Strict-Transport-Security" : "max-age=15724800; includeSubDomains", + "Access-Control-Expose-Headers" : "DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Authorization, x-ms-client-request-id, x-ms-command-name, x-ms-content-sha256, x-ms-date, host, Accept, Accept-Datetime, Date, If-Match, If-None-Match, Sync-Token, x-ms-return-client-request-id, ETag, Last-Modified, Link, Memento-Datetime, x-ms-retry-after, x-ms-request-id, WWW-Authenticate", + "ETag" : "\"C9lwXgKsyniqCMiZQEMXehlxbJc\"", + "Access-Control-Allow-Credentials" : "true", + "Sync-Token" : "zAJw6V16=MDotMSM2NDQ5OTU=;sn=644995", + "x-ms-request-id" : "d17cf096-d4b2-4e9b-8989-b995883f9220", + "Body" : "{\"etag\":\"C9lwXgKsyniqCMiZQEMXehlxbJc\",\"key\":\"key50977280758\",\"label\":null,\"content_type\":null,\"value\":\"newValue\",\"tags\":{},\"locked\":false,\"last_modified\":\"2019-12-12T01:34:03+00:00\"}", + "x-ms-client-request-id" : "e9b22ff5-88bb-43dc-9fea-326b62ddcd14", + "Content-Type" : "application/vnd.microsoft.appconfig.kv+json; charset=utf-8" + }, + "Exception" : null + }, { + "Method" : "GET", + "Uri" : "https://appconfigtestshawnfang.azconfig.io/kv?key=key50977%2a&api-version=1.0", + "Headers" : { + "User-Agent" : "azsdk-java-UnknownName/UnknownVersion (11.0.4; Windows 10 10.0)", + "x-ms-client-request-id" : "d8137165-1841-4190-a0a4-8dce7975d4c5", + "Content-Type" : "application/json" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Server" : "openresty/1.15.8.1", + "Access-Control-Allow-Origin" : "*", + "Access-Control-Allow-Methods" : "GET, PUT, POST, DELETE, PATCH, OPTIONS", + "Connection" : "keep-alive", + "retry-after" : "0", + "StatusCode" : "200", + "Date" : "Thu, 12 Dec 2019 01:34:02 GMT", + "Access-Control-Allow-Headers" : "DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Authorization, x-ms-client-request-id, x-ms-command-name, x-ms-content-sha256, x-ms-date, host, Accept, Accept-Datetime, Date, If-Match, If-None-Match, Sync-Token, x-ms-return-client-request-id, ETag, Last-Modified, Link, Memento-Datetime, x-ms-retry-after, x-ms-request-id, WWW-Authenticate", + "x-ms-correlation-request-id" : "54f432e3-19dc-4740-88ea-4eb9568692da", + "Strict-Transport-Security" : "max-age=15724800; includeSubDomains", + "Access-Control-Expose-Headers" : "DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Authorization, x-ms-client-request-id, x-ms-command-name, x-ms-content-sha256, x-ms-date, host, Accept, Accept-Datetime, Date, If-Match, If-None-Match, Sync-Token, x-ms-return-client-request-id, ETag, Last-Modified, Link, Memento-Datetime, x-ms-retry-after, x-ms-request-id, WWW-Authenticate", + "Access-Control-Allow-Credentials" : "true", + "Sync-Token" : "zAJw6V16=MDotMSM2NDQ5OTU=;sn=644995", + "x-ms-request-id" : "54f432e3-19dc-4740-88ea-4eb9568692da", + "Body" : "{\"items\":[{\"etag\":\"C9lwXgKsyniqCMiZQEMXehlxbJc\",\"key\":\"key50977280758\",\"label\":null,\"content_type\":null,\"value\":\"newValue\",\"tags\":{},\"locked\":false,\"last_modified\":\"2019-12-12T01:34:03+00:00\"}]}", + "x-ms-client-request-id" : "d8137165-1841-4190-a0a4-8dce7975d4c5", + "Content-Type" : "application/vnd.microsoft.appconfig.kvset+json; charset=utf-8" + }, + "Exception" : null + }, { + "Method" : "DELETE", + "Uri" : "https://appconfigtestshawnfang.azconfig.io/kv/key50977280758?api-version=1.0", + "Headers" : { + "User-Agent" : "azsdk-java-UnknownName/UnknownVersion (11.0.4; Windows 10 10.0)", + "x-ms-client-request-id" : "6583721c-3230-4d6c-85b7-24fc3dd6d419", + "Content-Type" : "application/json" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "Server" : "openresty/1.15.8.1", + "Access-Control-Allow-Origin" : "*", + "Access-Control-Allow-Methods" : "GET, PUT, POST, DELETE, PATCH, OPTIONS", + "Connection" : "keep-alive", + "Last-Modified" : "Thu, 12 Dec 2019 01:34:03 GMT", + "retry-after" : "0", + "StatusCode" : "200", + "Date" : "Thu, 12 Dec 2019 01:34:02 GMT", + "Access-Control-Allow-Headers" : "DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Authorization, x-ms-client-request-id, x-ms-command-name, x-ms-content-sha256, x-ms-date, host, Accept, Accept-Datetime, Date, If-Match, If-None-Match, Sync-Token, x-ms-return-client-request-id, ETag, Last-Modified, Link, Memento-Datetime, x-ms-retry-after, x-ms-request-id, WWW-Authenticate", + "x-ms-correlation-request-id" : "bd84e592-47bb-42f3-b0dc-2f58afba337e", + "Strict-Transport-Security" : "max-age=15724800; includeSubDomains", + "Access-Control-Expose-Headers" : "DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Authorization, x-ms-client-request-id, x-ms-command-name, x-ms-content-sha256, x-ms-date, host, Accept, Accept-Datetime, Date, If-Match, If-None-Match, Sync-Token, x-ms-return-client-request-id, ETag, Last-Modified, Link, Memento-Datetime, x-ms-retry-after, x-ms-request-id, WWW-Authenticate", + "ETag" : "\"C9lwXgKsyniqCMiZQEMXehlxbJc\"", + "Access-Control-Allow-Credentials" : "true", + "Sync-Token" : "zAJw6V16=MDotMSM2NDQ5OTY=;sn=644996", + "x-ms-request-id" : "bd84e592-47bb-42f3-b0dc-2f58afba337e", + "Body" : "{\"etag\":\"C9lwXgKsyniqCMiZQEMXehlxbJc\",\"key\":\"key50977280758\",\"label\":null,\"content_type\":null,\"value\":\"newValue\",\"tags\":{},\"locked\":false,\"last_modified\":\"2019-12-12T01:34:03+00:00\"}", + "x-ms-client-request-id" : "6583721c-3230-4d6c-85b7-24fc3dd6d419", + "Content-Type" : "application/vnd.microsoft.appconfig.kv+json; charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ "key50977", "b9ec5bff", "key50977280758" ] +} \ No newline at end of file From ed75576ff1beee22985f62b1e236af202dcc1b0a Mon Sep 17 00:00:00 2001 From: shafang Date: Wed, 11 Dec 2019 23:30:12 -0800 Subject: [PATCH 6/6] use import library --- .../data/appconfiguration/ConfigurationAsyncClientTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sdk/appconfiguration/azure-data-appconfiguration/src/test/java/com/azure/data/appconfiguration/ConfigurationAsyncClientTest.java b/sdk/appconfiguration/azure-data-appconfiguration/src/test/java/com/azure/data/appconfiguration/ConfigurationAsyncClientTest.java index 0660e799f4bc..5b84281b7234 100644 --- a/sdk/appconfiguration/azure-data-appconfiguration/src/test/java/com/azure/data/appconfiguration/ConfigurationAsyncClientTest.java +++ b/sdk/appconfiguration/azure-data-appconfiguration/src/test/java/com/azure/data/appconfiguration/ConfigurationAsyncClientTest.java @@ -22,6 +22,7 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; +import reactor.util.context.Context; import java.net.HttpURLConnection; import java.time.Duration; @@ -877,7 +878,7 @@ public void addHeadersFromContextPolicyTest() { final HttpHeaders headers = getCustomizedHeaders(); addHeadersFromContextPolicyRunner(expected -> StepVerifier.create(client.addConfigurationSettingWithResponse(expected) - .subscriberContext(reactor.util.context.Context.of(AddHeadersFromContextPolicy.AZURE_REQUEST_HTTP_HEADERS_KEY, headers))) + .subscriberContext(Context.of(AddHeadersFromContextPolicy.AZURE_REQUEST_HTTP_HEADERS_KEY, headers))) .assertNext(response -> { final HttpHeaders requestHeaders = response.getRequest().getHeaders(); assertContainsHeaders(headers, requestHeaders);