936ef0c59bce4258d7ab04257ad35fb5b57b18f4
[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     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 DmaapModel dmaapModel = mock(DmaapModel.class);
54     private JsonBodyBuilder<DmaapModel> jsonBodyBuilder = mock(JsonBodyBuilder.class);
55
56     @Test
57     void successfulPatchResponse() {
58         DisposableServer server = createValidServer();
59         HttpClient httpClient = createHttpClientForContextWithAddress(server, connectionProvider);
60         CloudHttpClient cloudHttpClient = new CloudHttpClient(httpClient);
61
62         when(jsonBodyBuilder.createJsonBody(dmaapModel)).thenReturn(JSON_BODY);
63         Mono<HttpClientResponse> content = cloudHttpClient.patch(SAMPLE_URL, createRequestDiagnosticContext(), createCustomHeaders(),
64             jsonBodyBuilder, dmaapModel);
65         HttpClientResponse httpClientResponse = content.block();
66
67         assertEquals(HttpResponseStatus.OK, httpClientResponse.status());
68         server.disposeNow();
69     }
70
71     @Test
72     void errorPatchRequest() {
73         DisposableServer server = createInvalidServer();
74         HttpClient httpClient = createHttpClientForContextWithAddress(server, connectionProvider);
75         CloudHttpClient cloudHttpClient = new CloudHttpClient(httpClient);
76
77         when(jsonBodyBuilder.createJsonBody(dmaapModel)).thenReturn(JSON_BODY);
78         Mono<HttpClientResponse> content = cloudHttpClient.patch(SAMPLE_URL, createRequestDiagnosticContext(), createCustomHeaders(),
79             jsonBodyBuilder, dmaapModel);
80         HttpClientResponse httpClientResponse = content.block();
81
82         assertEquals(HttpResponseStatus.INTERNAL_SERVER_ERROR, httpClientResponse.status());
83         server.disposeNow();
84     }
85
86     @Test
87     void successfulPostResponse() {
88         DisposableServer server = createValidServer();
89         HttpClient httpClient = createHttpClientForContextWithAddress(server, connectionProvider);
90         CloudHttpClient cloudHttpClient = new CloudHttpClient(httpClient);
91
92         when(jsonBodyBuilder.createJsonBody(dmaapModel)).thenReturn(JSON_BODY);
93         Mono<HttpClientResponse> content = cloudHttpClient.post(SAMPLE_URL, createRequestDiagnosticContext(), createCustomHeaders(),
94             jsonBodyBuilder, dmaapModel);
95         HttpClientResponse httpClientResponse = content.block();
96
97         assertEquals(HttpResponseStatus.OK, httpClientResponse.status());
98         server.disposeNow();
99     }
100
101     @Test
102     void errorPostRequest() {
103         DisposableServer server = createInvalidServer();
104         HttpClient httpClient = createHttpClientForContextWithAddress(server, connectionProvider);
105         CloudHttpClient cloudHttpClient = new CloudHttpClient(httpClient);
106
107         when(jsonBodyBuilder.createJsonBody(dmaapModel)).thenReturn(JSON_BODY);
108         Mono<HttpClientResponse> content = cloudHttpClient.post(SAMPLE_URL, createRequestDiagnosticContext(), createCustomHeaders(),
109             jsonBodyBuilder, dmaapModel);
110         HttpClientResponse httpClientResponse = content.block();
111
112         assertEquals(HttpResponseStatus.INTERNAL_SERVER_ERROR, httpClientResponse.status());
113         server.disposeNow();
114     }
115
116     @Test
117     void successfulGetResponse() {
118         DisposableServer server = createValidServer();
119         HttpClient httpClient = createHttpClientForContextWithAddress(server, connectionProvider);
120         CloudHttpClient cloudHttpClient = new CloudHttpClient(httpClient);
121
122         when(jsonBodyBuilder.createJsonBody(dmaapModel)).thenReturn(JSON_BODY);
123         Mono<String> content = cloudHttpClient.get(SAMPLE_URL, String.class);
124         Mono<String> contentWithHeaders = cloudHttpClient.get(SAMPLE_URL, createRequestDiagnosticContext(),
125             createCustomHeaders(), String.class);
126
127         StepVerifier.create(content)
128             .expectNext(SAMPLE_STRING)
129             .expectComplete()
130             .verify();
131         StepVerifier.create(contentWithHeaders)
132             .expectNext(SAMPLE_STRING)
133             .expectComplete()
134             .verify();
135         server.disposeNow();
136     }
137
138     @Test
139     void errorGetRequest() {
140         DisposableServer server = createInvalidServer();
141         HttpClient httpClient = createHttpClientForContextWithAddress(server, connectionProvider);
142         CloudHttpClient cloudHttpClient = new CloudHttpClient(httpClient);
143
144         Mono<String> content = cloudHttpClient.get(SAMPLE_URL, String.class);
145
146         StepVerifier.create(content)
147             .expectError()
148             .verify();
149         server.disposeNow();
150     }
151
152     private Map<String, String> createCustomHeaders() {
153         Map<String, String> customHeaders = new HashMap<>();
154         customHeaders.put("X_INVOCATION_ID", UUID.randomUUID().toString());
155         return customHeaders;
156     }
157
158     private DisposableServer createValidServer() {
159         Mono<String> response = Mono.just(SAMPLE_STRING);
160         return HttpServer.create()
161             .handle((req, resp) -> resp.sendString(response))
162             .wiretap(true)
163             .bindNow();
164     }
165
166     private DisposableServer createInvalidServer() {
167         return HttpServer.create()
168             .handle((req, resp) -> Mono.error(new Exception("returnError")))
169             .wiretap(true)
170             .bindNow();
171     }
172
173     private RequestDiagnosticContext createRequestDiagnosticContext() {
174         return ImmutableRequestDiagnosticContext.builder()
175             .invocationId(UUID.randomUUID()).requestId(UUID.randomUUID()).build();
176     }
177
178     private HttpClient createHttpClientForContextWithAddress(DisposableServer disposableServer,
179         ConnectionProvider connectionProvider) {
180         HttpClient client = connectionProvider == null? HttpClient.create() : HttpClient.create(connectionProvider);
181         return client.addressSupplier(disposableServer::address).wiretap(true);
182     }
183 }