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.openecomp.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.openecomp.restclient.enums.RestAuthenticationMode;
33 import org.openecomp.restclient.rest.RestClientBuilder;
35 import com.sun.jersey.api.client.Client;
36 import com.sun.jersey.api.client.ClientResponse;
37 import com.sun.jersey.api.client.UniformInterfaceException;
38 import com.sun.jersey.api.client.WebResource;
39 import com.sun.jersey.api.client.WebResource.Builder;
40 import com.sun.jersey.core.util.MultivaluedMapImpl;
42 public class RestfulClientTest {
44 private static final String TEST_URL = "http://localhost:9000/aai/v7";
46 private final MultivaluedMapImpl emptyMap = new MultivaluedMapImpl();
48 private RestClientBuilder mockClientBuilder;
49 private Client mockedClient;
50 private WebResource mockedWebResource;
51 private Builder mockedBuilder;
52 private ClientResponse mockedClientResponse;
55 * Test case initialization
57 * @throws Exception the exception
59 @SuppressWarnings("unchecked")
61 public void init() throws Exception {
62 mockedClientResponse = Mockito.mock(ClientResponse.class);
63 setResponseStatus(Response.Status.OK);
64 Mockito.when(mockedClientResponse.getHeaders()).thenReturn(emptyMap);
65 Mockito.when(mockedClientResponse.getEntity(String.class)).thenReturn("hello");
67 mockedBuilder = Mockito.mock(Builder.class);
68 Mockito.when(mockedBuilder.get(Mockito.any(Class.class))).thenReturn(mockedClientResponse);
69 Mockito.when(mockedBuilder.post(Mockito.any(Class.class))).thenReturn(mockedClientResponse);
70 Mockito.when(mockedBuilder.put(Mockito.any(Class.class))).thenReturn(mockedClientResponse);
71 Mockito.when(mockedBuilder.delete(Mockito.any(Class.class))).thenReturn(mockedClientResponse);
72 Mockito.when(mockedBuilder.head()).thenReturn(mockedClientResponse);
74 mockedWebResource = Mockito.mock(WebResource.class);
75 Mockito.when(mockedWebResource.accept(Mockito.<MediaType>anyVararg())).thenReturn(mockedBuilder);
77 mockedClient = Mockito.mock(Client.class);
78 Mockito.when(mockedClient.resource(Mockito.anyString())).thenReturn(mockedWebResource);
80 mockClientBuilder = Mockito.mock(RestClientBuilder.class);
81 Mockito.when(mockClientBuilder.getClient()).thenReturn(mockedClient);
85 public void validateConstructors() {
86 RestClient restClient = new RestClient();
87 assertNotNull(restClient);
88 restClient = new RestClient(mockClientBuilder);
89 assertNotNull(restClient);
93 public void validateBasicClientConstruction() throws Exception {
94 Client client = new RestClient(mockClientBuilder).authenticationMode(RestAuthenticationMode.HTTP_NOAUTH)
95 .connectTimeoutMs(1000).readTimeoutMs(500).getClient();
96 assertNotNull(client);
100 public void validateClientWithSslBasicAuthConstruction() throws Exception {
101 Client client = new RestClient(mockClientBuilder).authenticationMode(RestAuthenticationMode.SSL_BASIC)
102 .connectTimeoutMs(1000).readTimeoutMs(500).basicAuthPassword("password").basicAuthUsername("username")
104 assertNotNull(client);
108 public void validateClientWithSslCertConstruction() throws Exception {
109 // This test covers the standard SSL settings, i.e. no validation
110 assertNotNull(buildClient());
112 RestClient restClient = new RestClient(mockClientBuilder);
114 // Test with validation enabled
115 Client client = restClient.authenticationMode(RestAuthenticationMode.SSL_CERT).connectTimeoutMs(1000)
116 .readTimeoutMs(500).clientCertFile("cert").clientCertPassword("password").validateServerCertChain(true)
117 .validateServerHostname(true).getClient();
118 assertNotNull(client);
120 // Test with a trust store
121 client = restClient.authenticationMode(RestAuthenticationMode.SSL_CERT).connectTimeoutMs(1000)
122 .readTimeoutMs(500).clientCertFile("cert").clientCertPassword("password").trustStore("truststore")
124 assertNotNull(client);
128 public void validateSuccessfulPut() throws Exception {
129 RestClient restClient = buildClient();
131 OperationResult result = restClient.put(TEST_URL, "", emptyMap, MediaType.APPLICATION_JSON_TYPE,
132 MediaType.APPLICATION_JSON_TYPE);
134 assertEquals(Response.Status.OK.getStatusCode(), result.getResultCode());
135 assertNotNull(result.getResult());
136 assertNull(result.getFailureCause());
138 // Repeat the PUT operation, this time with a return code of 204
139 setResponseToNoContent();
140 result = restClient.put(TEST_URL, "", emptyMap, MediaType.APPLICATION_JSON_TYPE,
141 MediaType.APPLICATION_JSON_TYPE);
143 assertEquals(Response.Status.NO_CONTENT.getStatusCode(), result.getResultCode());
144 assertNull(result.getResult());
145 assertNull(result.getFailureCause());
149 public void validateSuccessfulPost() throws Exception {
150 RestClient restClient = buildClient();
152 OperationResult result = restClient.post(TEST_URL, "", emptyMap, MediaType.APPLICATION_JSON_TYPE,
153 MediaType.APPLICATION_JSON_TYPE);
155 assertEquals(Response.Status.OK.getStatusCode(), result.getResultCode());
156 assertNotNull(result.getResult());
157 assertNull(result.getFailureCause());
159 // Repeat the POST operation, this time with a return code of 204
160 setResponseToNoContent();
161 result = restClient.post(TEST_URL, "", emptyMap, MediaType.APPLICATION_JSON_TYPE,
162 MediaType.APPLICATION_JSON_TYPE);
164 assertEquals(Response.Status.NO_CONTENT.getStatusCode(), result.getResultCode());
165 assertNull(result.getResult());
166 assertNull(result.getFailureCause());
170 public void validateSuccessfulGet() throws Exception {
171 OperationResult result = buildClient().get(TEST_URL, emptyMap, MediaType.APPLICATION_JSON_TYPE);
173 assertEquals(Response.Status.OK.getStatusCode(), result.getResultCode());
174 assertNotNull(result.getResult());
175 assertNull(result.getFailureCause());
179 public void validateSuccessfulGetWithBasicAuth() throws Exception {
180 RestClient restClient = new RestClient(mockClientBuilder).authenticationMode(RestAuthenticationMode.SSL_BASIC)
181 .connectTimeoutMs(1000).readTimeoutMs(500).basicAuthUsername("username").basicAuthUsername("password");
183 OperationResult result = restClient.get(TEST_URL, emptyMap, MediaType.APPLICATION_JSON_TYPE);
185 assertEquals(Response.Status.OK.getStatusCode(), result.getResultCode());
186 assertNotNull(result.getResult());
187 assertNull(result.getFailureCause());
191 public void validateResourceNotFoundGet() throws Exception {
192 setResponseStatus(Response.Status.NOT_FOUND);
193 Mockito.when(mockedClientResponse.getEntity(String.class)).thenReturn("RNF");
195 OperationResult result = buildClient().get(TEST_URL, emptyMap, MediaType.APPLICATION_JSON_TYPE);
197 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), result.getResultCode());
198 assertNull(result.getResult());
199 assertNotNull(result.getFailureCause());
203 public void validateHealthCheck() throws Exception {
204 boolean targetServiceHealthy =
205 buildClient().healthCheck("http://localhost:9000/aai/util/echo", "startSerice", "targetService");
207 assertEquals(true, targetServiceHealthy);
211 public void validateHealthCheckFailureWith403() throws Exception {
212 Mockito.when(mockedClientResponse.getStatus()).thenReturn(Response.Status.FORBIDDEN.getStatusCode());
214 boolean targetServiceHealthy =
215 buildClient().healthCheck("http://localhost:9000/aai/util/echo", "startSerice", "targetService");
217 assertEquals(false, targetServiceHealthy);
221 public void validateHealthCheckFailureWithThrownException() throws Exception {
222 Mockito.when(mockedBuilder.get(Mockito.any(Class.class))).thenThrow(new IllegalArgumentException("error"));
224 boolean targetServiceHealthy =
225 buildClient().healthCheck("http://localhost:9000/aai/util/echo", "startSerice", "targetService");
227 assertEquals(false, targetServiceHealthy);
231 public void validateSuccessfulGetWithRetries() throws Exception {
232 Mockito.when(mockedClientResponse.getStatus()).thenReturn(408).thenReturn(Response.Status.OK.getStatusCode());
233 Mockito.when(mockedClientResponse.getEntity(String.class)).thenReturn("error").thenReturn("ok");
235 OperationResult result = buildClient().get(TEST_URL, emptyMap, MediaType.APPLICATION_JSON_TYPE, 3);
237 assertEquals(Response.Status.OK.getStatusCode(), result.getResultCode());
238 assertNotNull(result.getResult());
239 assertNull(result.getFailureCause());
244 public void validateFailedGetWithRetriesCausedByResourceNotFound() throws Exception {
245 setResponseStatus(Response.Status.NOT_FOUND);
246 Mockito.when(mockedClientResponse.getEntity(String.class)).thenReturn("error").thenReturn("ok");
248 OperationResult result = buildClient().get(TEST_URL, emptyMap, MediaType.APPLICATION_JSON_TYPE, 3);
250 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), result.getResultCode());
251 assertNull(result.getResult());
252 assertNotNull(result.getFailureCause());
257 public void validateFailedGetAfterMaxRetries() throws Exception {
258 setResponseStatus(Response.Status.INTERNAL_SERVER_ERROR);
259 Mockito.when(mockedClientResponse.getEntity(String.class)).thenReturn("error");
261 OperationResult result = buildClient().get(TEST_URL, emptyMap, MediaType.APPLICATION_JSON_TYPE, 3);
263 assertEquals(504, result.getResultCode());
264 assertNull(result.getResult());
265 assertNotNull(result.getFailureCause());
270 public void validateSuccessfulDelete() throws Exception {
271 RestClient restClient = buildClient();
273 OperationResult result = restClient.delete(TEST_URL, emptyMap, MediaType.APPLICATION_JSON_TYPE);
275 assertEquals(Response.Status.OK.getStatusCode(), result.getResultCode());
276 assertNotNull(result.getResult());
277 assertNull(result.getFailureCause());
279 // Repeat the DELETE operation, this time with a return code of 204
280 setResponseToNoContent();
281 result = restClient.delete(TEST_URL, emptyMap, MediaType.APPLICATION_JSON_TYPE);
283 assertEquals(Response.Status.NO_CONTENT.getStatusCode(), result.getResultCode());
284 assertNull(result.getResult());
285 assertNull(result.getFailureCause());
290 public void validateSuccessfulHead() throws Exception {
291 OperationResult result = buildClient().head(TEST_URL, emptyMap, MediaType.APPLICATION_JSON_TYPE);
293 assertEquals(Response.Status.OK.getStatusCode(), result.getResultCode());
294 assertNotNull(result.getResult());
295 assertNull(result.getFailureCause());
300 public void validateSuccessfulPatch() throws Exception {
301 Mockito.when(mockedBuilder.header("X-HTTP-Method-Override", "PATCH")).thenReturn(mockedBuilder);
302 OperationResult result = buildClient().patch(TEST_URL, "", emptyMap, MediaType.APPLICATION_JSON_TYPE,
303 MediaType.APPLICATION_JSON_TYPE);
305 assertEquals(Response.Status.OK.getStatusCode(), result.getResultCode());
306 assertNotNull(result.getResult());
307 assertNull(result.getFailureCause());
312 * Specify the status code of the response object returned by the mocked client
314 * @param status object storing the status code to mock in the ClientResponse
316 private void setResponseStatus(Status status) {
317 Mockito.when(mockedClientResponse.getStatus()).thenReturn(status.getStatusCode());
321 * Set the mocked client to return a response of "204 No Content"
323 private void setResponseToNoContent() {
324 setResponseStatus(Response.Status.NO_CONTENT);
325 // The Jersey client throws an exception when getEntity() is called following a 204 response
326 UniformInterfaceException uniformInterfaceException = new UniformInterfaceException(mockedClientResponse);
327 Mockito.when(mockedClientResponse.getEntity(String.class)).thenThrow(uniformInterfaceException);
331 * @return a mocked Rest Client object using standard SSL settings
333 private RestClient buildClient() {
334 return new RestClient(mockClientBuilder).authenticationMode(RestAuthenticationMode.SSL_CERT)
335 .connectTimeoutMs(1000).readTimeoutMs(500).clientCertFile("cert").clientCertPassword("password");