2 * ============LICENSE_START===========================================================================================
3 * Copyright (c) 2017 AT&T Intellectual Property.
4 * Copyright (c) 2017 Amdocs
6 * =====================================================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
8 * the License. You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
13 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
14 * specific language governing permissions and limitations under the License.
15 * ============LICENSE_END================================================== ===========================================
17 * ECOMP and OpenECOMP are trademarks and service marks of AT&T Intellectual Property.
19 package org.onap.aai.restclient.client;
21 import static org.junit.Assert.assertEquals;
22 import static org.junit.Assert.assertNotNull;
23 import static org.junit.Assert.assertNull;
25 import javax.ws.rs.core.MediaType;
26 import javax.ws.rs.core.Response;
27 import javax.ws.rs.core.Response.Status;
29 import org.junit.Before;
30 import org.junit.Test;
31 import org.mockito.Mockito;
32 import org.onap.aai.restclient.client.OperationResult;
33 import org.onap.aai.restclient.client.RestClient;
34 import org.onap.aai.restclient.enums.RestAuthenticationMode;
35 import org.onap.aai.restclient.rest.RestClientBuilder;
37 import com.sun.jersey.api.client.Client;
38 import com.sun.jersey.api.client.ClientResponse;
39 import com.sun.jersey.api.client.UniformInterfaceException;
40 import com.sun.jersey.api.client.WebResource;
41 import com.sun.jersey.api.client.WebResource.Builder;
42 import com.sun.jersey.core.util.MultivaluedMapImpl;
44 public class RestfulClientTest {
46 private static final String TEST_URL = "http://localhost:9000/aai/v7";
48 private final MultivaluedMapImpl emptyMap = new MultivaluedMapImpl();
50 private RestClientBuilder mockClientBuilder;
51 private Client mockedClient;
52 private WebResource mockedWebResource;
53 private Builder mockedBuilder;
54 private ClientResponse mockedClientResponse;
57 * Test case initialization
59 * @throws Exception the exception
61 @SuppressWarnings("unchecked")
63 public void init() throws Exception {
64 mockedClientResponse = Mockito.mock(ClientResponse.class);
65 setResponseStatus(Response.Status.OK);
66 Mockito.when(mockedClientResponse.getHeaders()).thenReturn(emptyMap);
67 Mockito.when(mockedClientResponse.getEntity(String.class)).thenReturn("hello");
69 mockedBuilder = Mockito.mock(Builder.class);
70 Mockito.when(mockedBuilder.get(Mockito.any(Class.class))).thenReturn(mockedClientResponse);
71 Mockito.when(mockedBuilder.post(Mockito.any(Class.class))).thenReturn(mockedClientResponse);
72 Mockito.when(mockedBuilder.put(Mockito.any(Class.class))).thenReturn(mockedClientResponse);
73 Mockito.when(mockedBuilder.delete(Mockito.any(Class.class))).thenReturn(mockedClientResponse);
74 Mockito.when(mockedBuilder.head()).thenReturn(mockedClientResponse);
76 mockedWebResource = Mockito.mock(WebResource.class);
77 Mockito.when(mockedWebResource.accept(Mockito.<MediaType>anyVararg())).thenReturn(mockedBuilder);
79 mockedClient = Mockito.mock(Client.class);
80 Mockito.when(mockedClient.resource(Mockito.anyString())).thenReturn(mockedWebResource);
82 mockClientBuilder = Mockito.mock(RestClientBuilder.class);
83 Mockito.when(mockClientBuilder.getClient()).thenReturn(mockedClient);
87 public void validateConstructors() {
88 RestClient restClient = new RestClient();
89 assertNotNull(restClient);
90 restClient = new RestClient(mockClientBuilder);
91 assertNotNull(restClient);
95 public void validateBasicClientConstruction() throws Exception {
96 Client client = new RestClient(mockClientBuilder).authenticationMode(RestAuthenticationMode.HTTP_NOAUTH)
97 .connectTimeoutMs(1000).readTimeoutMs(500).getClient();
98 assertNotNull(client);
102 public void validateClientWithSslBasicAuthConstruction() throws Exception {
103 Client client = new RestClient(mockClientBuilder).authenticationMode(RestAuthenticationMode.SSL_BASIC)
104 .connectTimeoutMs(1000).readTimeoutMs(500).basicAuthPassword("password").basicAuthUsername("username")
106 assertNotNull(client);
110 public void validateClientWithSslCertConstruction() throws Exception {
111 // This test covers the standard SSL settings, i.e. no validation
112 assertNotNull(buildClient());
114 RestClient restClient = new RestClient(mockClientBuilder);
116 // Test with validation enabled
117 Client client = restClient.authenticationMode(RestAuthenticationMode.SSL_CERT).connectTimeoutMs(1000)
118 .readTimeoutMs(500).clientCertFile("cert").clientCertPassword("password").validateServerCertChain(true)
119 .validateServerHostname(true).getClient();
120 assertNotNull(client);
122 // Test with a trust store
123 client = restClient.authenticationMode(RestAuthenticationMode.SSL_CERT).connectTimeoutMs(1000)
124 .readTimeoutMs(500).clientCertFile("cert").clientCertPassword("password").trustStore("truststore")
126 assertNotNull(client);
130 public void validateSuccessfulPut() throws Exception {
131 RestClient restClient = buildClient();
133 OperationResult result = restClient.put(TEST_URL, "", emptyMap, MediaType.APPLICATION_JSON_TYPE,
134 MediaType.APPLICATION_JSON_TYPE);
136 assertEquals(Response.Status.OK.getStatusCode(), result.getResultCode());
137 assertNotNull(result.getResult());
138 assertNull(result.getFailureCause());
140 // Repeat the PUT operation, this time with a return code of 204
141 setResponseToNoContent();
142 result = restClient.put(TEST_URL, "", emptyMap, MediaType.APPLICATION_JSON_TYPE,
143 MediaType.APPLICATION_JSON_TYPE);
145 assertEquals(Response.Status.NO_CONTENT.getStatusCode(), result.getResultCode());
146 assertNull(result.getResult());
147 assertNull(result.getFailureCause());
151 public void validateSuccessfulPost() throws Exception {
152 RestClient restClient = buildClient();
154 OperationResult result = restClient.post(TEST_URL, "", emptyMap, MediaType.APPLICATION_JSON_TYPE,
155 MediaType.APPLICATION_JSON_TYPE);
157 assertEquals(Response.Status.OK.getStatusCode(), result.getResultCode());
158 assertNotNull(result.getResult());
159 assertNull(result.getFailureCause());
161 // Repeat the POST operation, this time with a return code of 204
162 setResponseToNoContent();
163 result = restClient.post(TEST_URL, "", emptyMap, MediaType.APPLICATION_JSON_TYPE,
164 MediaType.APPLICATION_JSON_TYPE);
166 assertEquals(Response.Status.NO_CONTENT.getStatusCode(), result.getResultCode());
167 assertNull(result.getResult());
168 assertNull(result.getFailureCause());
172 public void validateSuccessfulGet() throws Exception {
173 OperationResult result = buildClient().get(TEST_URL, emptyMap, MediaType.APPLICATION_JSON_TYPE);
175 assertEquals(Response.Status.OK.getStatusCode(), result.getResultCode());
176 assertNotNull(result.getResult());
177 assertNull(result.getFailureCause());
181 public void validateSuccessfulGetWithBasicAuth() throws Exception {
182 RestClient restClient = new RestClient(mockClientBuilder).authenticationMode(RestAuthenticationMode.SSL_BASIC)
183 .connectTimeoutMs(1000).readTimeoutMs(500).basicAuthUsername("username").basicAuthUsername("password");
185 OperationResult result = restClient.get(TEST_URL, emptyMap, MediaType.APPLICATION_JSON_TYPE);
187 assertEquals(Response.Status.OK.getStatusCode(), result.getResultCode());
188 assertNotNull(result.getResult());
189 assertNull(result.getFailureCause());
193 public void validateResourceNotFoundGet() throws Exception {
194 setResponseStatus(Response.Status.NOT_FOUND);
195 Mockito.when(mockedClientResponse.getEntity(String.class)).thenReturn("RNF");
197 OperationResult result = buildClient().get(TEST_URL, emptyMap, MediaType.APPLICATION_JSON_TYPE);
199 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), result.getResultCode());
200 assertNull(result.getResult());
201 assertNotNull(result.getFailureCause());
205 public void validateHealthCheck() throws Exception {
206 boolean targetServiceHealthy =
207 buildClient().healthCheck("http://localhost:9000/aai/util/echo", "startSerice", "targetService");
209 assertEquals(true, targetServiceHealthy);
213 public void validateHealthCheckFailureWith403() throws Exception {
214 Mockito.when(mockedClientResponse.getStatus()).thenReturn(Response.Status.FORBIDDEN.getStatusCode());
216 boolean targetServiceHealthy =
217 buildClient().healthCheck("http://localhost:9000/aai/util/echo", "startSerice", "targetService");
219 assertEquals(false, targetServiceHealthy);
223 public void validateHealthCheckFailureWithThrownException() throws Exception {
224 Mockito.when(mockedBuilder.get(Mockito.any(Class.class))).thenThrow(new IllegalArgumentException("error"));
226 boolean targetServiceHealthy =
227 buildClient().healthCheck("http://localhost:9000/aai/util/echo", "startSerice", "targetService");
229 assertEquals(false, targetServiceHealthy);
233 public void validateSuccessfulGetWithRetries() throws Exception {
234 Mockito.when(mockedClientResponse.getStatus()).thenReturn(408).thenReturn(Response.Status.OK.getStatusCode());
235 Mockito.when(mockedClientResponse.getEntity(String.class)).thenReturn("error").thenReturn("ok");
237 OperationResult result = buildClient().get(TEST_URL, emptyMap, MediaType.APPLICATION_JSON_TYPE, 3);
239 assertEquals(Response.Status.OK.getStatusCode(), result.getResultCode());
240 assertNotNull(result.getResult());
241 assertNull(result.getFailureCause());
246 public void validateFailedGetWithRetriesCausedByResourceNotFound() throws Exception {
247 setResponseStatus(Response.Status.NOT_FOUND);
248 Mockito.when(mockedClientResponse.getEntity(String.class)).thenReturn("error").thenReturn("ok");
250 OperationResult result = buildClient().get(TEST_URL, emptyMap, MediaType.APPLICATION_JSON_TYPE, 3);
252 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), result.getResultCode());
253 assertNull(result.getResult());
254 assertNotNull(result.getFailureCause());
259 public void validateFailedGetAfterMaxRetries() throws Exception {
260 setResponseStatus(Response.Status.INTERNAL_SERVER_ERROR);
261 Mockito.when(mockedClientResponse.getEntity(String.class)).thenReturn("error");
263 OperationResult result = buildClient().get(TEST_URL, emptyMap, MediaType.APPLICATION_JSON_TYPE, 3);
265 assertEquals(504, result.getResultCode());
266 assertNull(result.getResult());
267 assertNotNull(result.getFailureCause());
272 public void validateSuccessfulDelete() throws Exception {
273 RestClient restClient = buildClient();
275 OperationResult result = restClient.delete(TEST_URL, emptyMap, MediaType.APPLICATION_JSON_TYPE);
277 assertEquals(Response.Status.OK.getStatusCode(), result.getResultCode());
278 assertNotNull(result.getResult());
279 assertNull(result.getFailureCause());
281 // Repeat the DELETE operation, this time with a return code of 204
282 setResponseToNoContent();
283 result = restClient.delete(TEST_URL, emptyMap, MediaType.APPLICATION_JSON_TYPE);
285 assertEquals(Response.Status.NO_CONTENT.getStatusCode(), result.getResultCode());
286 assertNull(result.getResult());
287 assertNull(result.getFailureCause());
292 public void validateSuccessfulHead() throws Exception {
293 OperationResult result = buildClient().head(TEST_URL, emptyMap, MediaType.APPLICATION_JSON_TYPE);
295 assertEquals(Response.Status.OK.getStatusCode(), result.getResultCode());
296 assertNotNull(result.getResult());
297 assertNull(result.getFailureCause());
302 public void validateSuccessfulPatch() throws Exception {
303 Mockito.when(mockedBuilder.header("X-HTTP-Method-Override", "PATCH")).thenReturn(mockedBuilder);
304 OperationResult result = buildClient().patch(TEST_URL, "", emptyMap, MediaType.APPLICATION_JSON_TYPE,
305 MediaType.APPLICATION_JSON_TYPE);
307 assertEquals(Response.Status.OK.getStatusCode(), result.getResultCode());
308 assertNotNull(result.getResult());
309 assertNull(result.getFailureCause());
314 * Specify the status code of the response object returned by the mocked client
316 * @param status object storing the status code to mock in the ClientResponse
318 private void setResponseStatus(Status status) {
319 Mockito.when(mockedClientResponse.getStatus()).thenReturn(status.getStatusCode());
323 * Set the mocked client to return a response of "204 No Content"
325 private void setResponseToNoContent() {
326 setResponseStatus(Response.Status.NO_CONTENT);
327 // The Jersey client throws an exception when getEntity() is called following a 204 response
328 UniformInterfaceException uniformInterfaceException = new UniformInterfaceException(mockedClientResponse);
329 Mockito.when(mockedClientResponse.getEntity(String.class)).thenThrow(uniformInterfaceException);
333 * @return a mocked Rest Client object using standard SSL settings
335 private RestClient buildClient() {
336 return new RestClient(mockClientBuilder).authenticationMode(RestAuthenticationMode.SSL_CERT)
337 .connectTimeoutMs(1000).readTimeoutMs(500).clientCertFile("cert").clientCertPassword("password");