a913a93fc465513ecd38f76d694c131a9a9e8ae8
[dcaegen2/services/sdk.git] /
1 /*
2  * ============LICENSE_START=======================================================
3  * DCAEGEN2-SERVICES-SDK
4  * ================================================================================
5  * Copyright (C) 2018 NOKIA Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.dcaegen2.services.sdk.rest.services.adapters.http;
22
23 import static org.junit.jupiter.api.Assertions.assertEquals;
24 import static org.mockito.Mockito.mock;
25 import static org.mockito.Mockito.when;
26
27 import io.netty.handler.codec.http.HttpResponseStatus;
28 import java.util.HashMap;
29 import java.util.Map;
30 import java.util.UUID;
31 import org.junit.jupiter.api.Test;
32 import org.onap.dcaegen2.services.sdk.rest.services.model.DmaapModel;
33 import org.onap.dcaegen2.services.sdk.rest.services.model.JsonBodyBuilder;
34 import org.onap.dcaegen2.services.sdk.rest.services.model.logging.ImmutableRequestDiagnosticContext;
35 import org.onap.dcaegen2.services.sdk.rest.services.model.logging.RequestDiagnosticContext;
36 import reactor.core.publisher.Mono;
37 import reactor.netty.DisposableServer;
38 import reactor.netty.http.client.HttpClient;
39 import reactor.netty.http.server.HttpServer;
40 import reactor.netty.resources.ConnectionProvider;
41 import reactor.test.StepVerifier;
42 import reactor.netty.http.client.HttpClientResponse;
43
44 class CloudHttpClientIT {
45
46     private static final int MAX_CONNECTIONS = 1;
47     private static final String SAMPLE_STRING = "sampleString";
48     private static final String SAMPLE_URL = "/sampleURL";
49     private static final String JSON_BODY = "{\"correlationId\":\"NOKnhfsadhff\","
50             + "\"ipaddress-v4\":\"256.22.33.155\", "
51             + "\"ipaddress-v6\":\"200J:0db8:85a3:0000:0000:8a2e:0370:7334\"}";
52     private static final ConnectionProvider connectionProvider = ConnectionProvider.fixed("test", MAX_CONNECTIONS);
53
54     private final DmaapModel dmaapModel = mock(DmaapModel.class);
55     private final JsonBodyBuilder<DmaapModel> jsonBodyBuilder = mock(JsonBodyBuilder.class);
56
57     @Test
58     void successfulPatchResponse() {
59         DisposableServer server = createValidServer();
60         RxHttpClient httpClient = createHttpClientForContextWithAddress(server);
61         CloudHttpClient cloudHttpClient = new CloudHttpClient(httpClient);
62
63         when(jsonBodyBuilder.createJsonBody(dmaapModel)).thenReturn(JSON_BODY);
64         Mono<HttpClientResponse> content = cloudHttpClient
65                 .patch(SAMPLE_URL, createRequestDiagnosticContext(), createCustomHeaders(),
66                         jsonBodyBuilder, dmaapModel);
67         HttpClientResponse httpClientResponse = content.block();
68
69         assertEquals(HttpResponseStatus.OK, httpClientResponse.status());
70         server.disposeNow();
71     }
72
73     @Test
74     void errorPatchRequest() {
75         DisposableServer server = createInvalidServer();
76         RxHttpClient httpClient = createHttpClientForContextWithAddress(server);
77         CloudHttpClient cloudHttpClient = new CloudHttpClient(httpClient);
78
79         when(jsonBodyBuilder.createJsonBody(dmaapModel)).thenReturn(JSON_BODY);
80         Mono<HttpClientResponse> content = cloudHttpClient
81                 .patch(SAMPLE_URL, createRequestDiagnosticContext(), createCustomHeaders(),
82                         jsonBodyBuilder, dmaapModel);
83         HttpClientResponse httpClientResponse = content.block();
84
85         assertEquals(HttpResponseStatus.INTERNAL_SERVER_ERROR, httpClientResponse.status());
86         server.disposeNow();
87     }
88
89     @Test
90     void successfulPostResponse() {
91         DisposableServer server = createValidServer();
92         RxHttpClient httpClient = createHttpClientForContextWithAddress(server);
93         CloudHttpClient cloudHttpClient = new CloudHttpClient(httpClient);
94
95         when(jsonBodyBuilder.createJsonBody(dmaapModel)).thenReturn(JSON_BODY);
96         Mono<HttpClientResponse> content = cloudHttpClient
97                 .post(SAMPLE_URL, createRequestDiagnosticContext(), createCustomHeaders(),
98                         jsonBodyBuilder, dmaapModel);
99         HttpClientResponse httpClientResponse = content.block();
100
101         assertEquals(HttpResponseStatus.OK, httpClientResponse.status());
102         server.disposeNow();
103     }
104
105     @Test
106     void errorPostRequest() {
107         DisposableServer server = createInvalidServer();
108         RxHttpClient httpClient = createHttpClientForContextWithAddress(server);
109         CloudHttpClient cloudHttpClient = new CloudHttpClient(httpClient);
110
111         when(jsonBodyBuilder.createJsonBody(dmaapModel)).thenReturn(JSON_BODY);
112         Mono<HttpClientResponse> content = cloudHttpClient
113                 .post(SAMPLE_URL, createRequestDiagnosticContext(), createCustomHeaders(),
114                         jsonBodyBuilder, dmaapModel);
115         HttpClientResponse httpClientResponse = content.block();
116
117         assertEquals(HttpResponseStatus.INTERNAL_SERVER_ERROR, httpClientResponse.status());
118         server.disposeNow();
119     }
120
121     @Test
122     void successfulGetResponse() {
123         DisposableServer server = createValidServer();
124         RxHttpClient httpClient = createHttpClientForContextWithAddress(server);
125         CloudHttpClient cloudHttpClient = new CloudHttpClient(httpClient);
126
127         when(jsonBodyBuilder.createJsonBody(dmaapModel)).thenReturn(JSON_BODY);
128         Mono<String> content = cloudHttpClient.get(SAMPLE_URL, String.class);
129         Mono<String> contentWithHeaders = cloudHttpClient.get(SAMPLE_URL, createRequestDiagnosticContext(),
130                 createCustomHeaders(), String.class);
131
132         StepVerifier.create(content)
133                 .expectNext(SAMPLE_STRING)
134                 .expectComplete()
135                 .verify();
136         StepVerifier.create(contentWithHeaders)
137                 .expectNext(SAMPLE_STRING)
138                 .expectComplete()
139                 .verify();
140         server.disposeNow();
141     }
142
143     @Test
144     void errorGetRequest() {
145         DisposableServer server = createInvalidServer();
146         RxHttpClient httpClient = createHttpClientForContextWithAddress(server);
147         CloudHttpClient cloudHttpClient = new CloudHttpClient(httpClient);
148
149         Mono<String> content = cloudHttpClient.get(SAMPLE_URL, String.class);
150
151         StepVerifier.create(content)
152                 .expectError()
153                 .verify();
154         server.disposeNow();
155     }
156
157     private Map<String, String> createCustomHeaders() {
158         Map<String, String> customHeaders = new HashMap<>();
159         customHeaders.put("X_INVOCATION_ID", UUID.randomUUID().toString());
160         return customHeaders;
161     }
162
163     private DisposableServer createValidServer() {
164         Mono<String> response = Mono.just(SAMPLE_STRING);
165         return HttpServer.create()
166                 .handle((req, resp) -> resp.sendString(response))
167                 .wiretap(true)
168                 .bindNow();
169     }
170
171     private DisposableServer createInvalidServer() {
172         return HttpServer.create()
173                 .handle((req, resp) -> Mono.error(new Exception("returnError")))
174                 .wiretap(true)
175                 .bindNow();
176     }
177
178     private RequestDiagnosticContext createRequestDiagnosticContext() {
179         return ImmutableRequestDiagnosticContext.builder()
180                 .invocationId(UUID.randomUUID()).requestId(UUID.randomUUID()).build();
181     }
182
183     private RxHttpClient createHttpClientForContextWithAddress(DisposableServer disposableServer) {
184         HttpClient client = HttpClient.create(connectionProvider)
185                 .addressSupplier(disposableServer::address)
186                 .wiretap(true);
187         return new RxHttpClient(client);
188     }
189 }