f4efe1ab1391a456ac538cddc1217b6159526bba
[dcaegen2/services/sdk.git] /
1 /*
2  * ============LICENSE_START====================================
3  * DCAEGEN2-SERVICES-SDK
4  * =========================================================
5  * Copyright (C) 2019 Nokia. 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
43 class CloudHttpClientIT {
44
45     private static final int MAX_CONNECTIONS = 1;
46     private static final String SAMPLE_STRING = "sampleString";
47     private static final String SAMPLE_URL = "/sampleURL";
48     private static final String JSON_BODY = "{\"correlationId\":\"NOKnhfsadhff\","
49             + "\"ipaddress-v4\":\"256.22.33.155\", "
50             + "\"ipaddress-v6\":\"200J:0db8:85a3:0000:0000:8a2e:0370:7334\"}";
51     private static final ConnectionProvider connectionProvider = ConnectionProvider.fixed("test", MAX_CONNECTIONS);
52
53     private final DmaapModel dmaapModel = mock(DmaapModel.class);
54     private final JsonBodyBuilder<DmaapModel> jsonBodyBuilder = mock(JsonBodyBuilder.class);
55
56     @Test
57     void successfulPatchResponse() {
58         DisposableServer server = createValidServer();
59         RxHttpClient httpClient = createHttpClientForContextWithAddress(server);
60         CloudHttpClient cloudHttpClient = new CloudHttpClient(httpClient);
61
62         when(jsonBodyBuilder.createJsonBody(dmaapModel)).thenReturn(JSON_BODY);
63         Mono<HttpResponse> content = cloudHttpClient
64                 .patch(SAMPLE_URL, createRequestDiagnosticContext(), createCustomHeaders(),
65                         jsonBodyBuilder, dmaapModel);
66         HttpResponse httpClientResponse = content.block();
67
68         assertEquals(HttpResponseStatus.OK.code(), httpClientResponse.statusCode());
69         server.disposeNow();
70     }
71
72     @Test
73     void errorPatchRequest() {
74         DisposableServer server = createInvalidServer();
75         RxHttpClient httpClient = createHttpClientForContextWithAddress(server);
76         CloudHttpClient cloudHttpClient = new CloudHttpClient(httpClient);
77
78         when(jsonBodyBuilder.createJsonBody(dmaapModel)).thenReturn(JSON_BODY);
79         Mono<HttpResponse> content = cloudHttpClient
80                 .patch(SAMPLE_URL, createRequestDiagnosticContext(), createCustomHeaders(),
81                         jsonBodyBuilder, dmaapModel);
82         HttpResponse httpClientResponse = content.block();
83
84         assertEquals(HttpResponseStatus.INTERNAL_SERVER_ERROR.code(), httpClientResponse.statusCode());
85         server.disposeNow();
86     }
87
88     @Test
89     void successfulPostResponse() {
90         DisposableServer server = createValidServer();
91         RxHttpClient httpClient = createHttpClientForContextWithAddress(server);
92         CloudHttpClient cloudHttpClient = new CloudHttpClient(httpClient);
93
94         when(jsonBodyBuilder.createJsonBody(dmaapModel)).thenReturn(JSON_BODY);
95         Mono<HttpResponse> content = cloudHttpClient
96                 .post(SAMPLE_URL, createRequestDiagnosticContext(), createCustomHeaders(),
97                         jsonBodyBuilder, dmaapModel);
98         HttpResponse httpClientResponse = content.block();
99
100         assertEquals(HttpResponseStatus.OK.code(), httpClientResponse.statusCode());
101         server.disposeNow();
102     }
103
104     @Test
105     void errorPostRequest() {
106         DisposableServer server = createInvalidServer();
107         RxHttpClient httpClient = createHttpClientForContextWithAddress(server);
108         CloudHttpClient cloudHttpClient = new CloudHttpClient(httpClient);
109
110         when(jsonBodyBuilder.createJsonBody(dmaapModel)).thenReturn(JSON_BODY);
111         Mono<HttpResponse> content = cloudHttpClient
112                 .post(SAMPLE_URL, createRequestDiagnosticContext(), createCustomHeaders(),
113                         jsonBodyBuilder, dmaapModel);
114         HttpResponse httpClientResponse = content.block();
115
116         assertEquals(HttpResponseStatus.INTERNAL_SERVER_ERROR.code(), httpClientResponse.statusCode());
117         server.disposeNow();
118     }
119
120     @Test
121     void successfulGetResponse() {
122         DisposableServer server = createValidServer();
123         RxHttpClient httpClient = createHttpClientForContextWithAddress(server);
124         CloudHttpClient cloudHttpClient = new CloudHttpClient(httpClient);
125
126         when(jsonBodyBuilder.createJsonBody(dmaapModel)).thenReturn(JSON_BODY);
127         Mono<String> content = cloudHttpClient.get(SAMPLE_URL, String.class);
128         Mono<String> contentWithHeaders = cloudHttpClient.get(SAMPLE_URL, createRequestDiagnosticContext(),
129                 createCustomHeaders(), String.class);
130
131         StepVerifier.create(content)
132                 .expectNext(SAMPLE_STRING)
133                 .expectComplete()
134                 .verify();
135         StepVerifier.create(contentWithHeaders)
136                 .expectNext(SAMPLE_STRING)
137                 .expectComplete()
138                 .verify();
139         server.disposeNow();
140     }
141
142     @Test
143     void errorGetRequest() {
144         DisposableServer server = createInvalidServer();
145         RxHttpClient httpClient = createHttpClientForContextWithAddress(server);
146         CloudHttpClient cloudHttpClient = new CloudHttpClient(httpClient);
147
148         Mono<String> content = cloudHttpClient.get(SAMPLE_URL, String.class);
149
150         StepVerifier.create(content)
151                 .expectError()
152                 .verify();
153         server.disposeNow();
154     }
155
156     @Test
157     void successfulPutResponse() {
158         DisposableServer server = createValidServer();
159         RxHttpClient httpClient = createHttpClientForContextWithAddress(server);
160         CloudHttpClient cloudHttpClient = new CloudHttpClient(httpClient);
161
162         when(jsonBodyBuilder.createJsonBody(dmaapModel)).thenReturn(JSON_BODY);
163         Mono<HttpResponse> content = cloudHttpClient
164             .put(SAMPLE_URL, createRequestDiagnosticContext(), createCustomHeaders(),
165                 jsonBodyBuilder, dmaapModel);
166         HttpResponse httpClientResponse = content.block();
167
168         assertEquals(HttpResponseStatus.OK.code(), httpClientResponse.statusCode());
169         server.disposeNow();
170     }
171
172     @Test
173     void errorPutRequest() {
174         DisposableServer server = createInvalidServer();
175         RxHttpClient httpClient = createHttpClientForContextWithAddress(server);
176         CloudHttpClient cloudHttpClient = new CloudHttpClient(httpClient);
177
178         when(jsonBodyBuilder.createJsonBody(dmaapModel)).thenReturn(JSON_BODY);
179         Mono<HttpResponse> content = cloudHttpClient
180             .put(SAMPLE_URL, createRequestDiagnosticContext(), createCustomHeaders(),
181                 jsonBodyBuilder, dmaapModel);
182         HttpResponse httpClientResponse = content.block();
183
184         assertEquals(HttpResponseStatus.INTERNAL_SERVER_ERROR.code(), httpClientResponse.statusCode());
185         server.disposeNow();
186     }
187
188     private Map<String, String> createCustomHeaders() {
189         Map<String, String> customHeaders = new HashMap<>();
190         customHeaders.put("X_INVOCATION_ID", UUID.randomUUID().toString());
191         return customHeaders;
192     }
193
194     private DisposableServer createValidServer() {
195         Mono<String> response = Mono.just(SAMPLE_STRING);
196         return HttpServer.create()
197                 .handle((req, resp) -> resp.sendString(response))
198                 .wiretap(true)
199                 .bindNow();
200     }
201
202     private DisposableServer createInvalidServer() {
203         return HttpServer.create()
204                 .handle((req, resp) -> Mono.error(new Exception("returnError")))
205                 .wiretap(true)
206                 .bindNow();
207     }
208
209     private RequestDiagnosticContext createRequestDiagnosticContext() {
210         return ImmutableRequestDiagnosticContext.builder()
211                 .invocationId(UUID.randomUUID()).requestId(UUID.randomUUID()).build();
212     }
213
214     private RxHttpClient createHttpClientForContextWithAddress(DisposableServer disposableServer) {
215         HttpClient client = HttpClient.create(connectionProvider)
216                 .addressSupplier(disposableServer::address)
217                 .wiretap(true);
218         return new RxHttpClient(client);
219     }
220 }