2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2019 Nordix Foundation.
4 * ================================================================================
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.dmaap.datarouter.provisioning;
23 import static org.mockito.Matchers.any;
24 import static org.mockito.Mockito.mock;
25 import static org.powermock.api.mockito.PowerMockito.when;
27 import java.io.ByteArrayInputStream;
28 import java.io.IOException;
29 import java.util.ArrayList;
30 import java.util.Collections;
31 import java.util.Enumeration;
32 import java.util.List;
33 import javax.persistence.EntityManager;
34 import javax.persistence.EntityManagerFactory;
35 import javax.persistence.Persistence;
36 import javax.servlet.ServletConfig;
37 import javax.servlet.http.HttpServletRequest;
38 import javax.servlet.http.HttpServletResponse;
39 import org.apache.commons.lang3.reflect.FieldUtils;
40 import org.apache.http.Header;
41 import org.apache.http.HttpEntity;
42 import org.apache.http.HttpResponse;
43 import org.apache.http.StatusLine;
44 import org.apache.http.client.methods.CloseableHttpResponse;
45 import org.apache.http.client.methods.HttpUriRequest;
46 import org.apache.http.conn.scheme.Scheme;
47 import org.apache.http.impl.client.DefaultHttpClient;
48 import org.apache.http.message.BasicHeader;
49 import org.junit.AfterClass;
50 import org.junit.Before;
51 import org.junit.BeforeClass;
52 import org.junit.Test;
53 import org.junit.runner.RunWith;
54 import org.mockito.Mock;
55 import org.mockito.Mockito;
56 import org.onap.dmaap.datarouter.provisioning.utils.SynchronizerTask;
57 import org.onap.dmaap.datarouter.provisioning.utils.URLUtilities;
58 import org.powermock.api.mockito.PowerMockito;
59 import org.powermock.core.classloader.annotations.PowerMockIgnore;
60 import org.powermock.core.classloader.annotations.PrepareForTest;
61 import org.powermock.modules.junit4.PowerMockRunner;
63 @RunWith(PowerMockRunner.class)
64 @PrepareForTest({URLUtilities.class, BaseServlet.class, Scheme.class})
65 @PowerMockIgnore({"javax.net.ssl.*", "com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.w3c.*"})
66 public class ProxyServletTest {
67 private static ProxyServlet proxyServlet;
68 private static EntityManagerFactory emf;
69 private static EntityManager em;
72 private DefaultHttpClient httpClient;
74 private HttpServletRequest request;
76 private HttpServletResponse servletResponse;
78 private CloseableHttpResponse response;
80 private StatusLine statusLine;
83 public static void init() {
84 emf = Persistence.createEntityManagerFactory("dr-unit-tests");
85 em = emf.createEntityManager();
87 "org.onap.dmaap.datarouter.provserver.properties",
88 "src/test/resources/h2Database.properties");
92 public static void tearDownClass() {
99 public void setUp() throws Exception {
100 proxyServlet = new ProxyServlet();
101 FieldUtils.writeDeclaredField(proxyServlet, "inited", true, true);
103 org.apache.http.conn.ssl.SSLSocketFactory sslSocketFactory = PowerMockito.mock(org.apache.http.conn.ssl.SSLSocketFactory.class);
104 Mockito.doNothing().when(sslSocketFactory).setHostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
105 Scheme scheme = new Scheme("http", 80, sslSocketFactory);
106 FieldUtils.writeDeclaredField(proxyServlet, "sch", scheme, true);
108 PowerMockito.mockStatic(BaseServlet.class);
109 PowerMockito.mockStatic(URLUtilities.class);
110 when(URLUtilities.getPeerPodName()).thenReturn("localhost");
112 SynchronizerTask synchronizerTask = SynchronizerTask.getSynchronizer();
113 FieldUtils.writeDeclaredField(synchronizerTask, "podState", 2, true);
114 FieldUtils.writeDeclaredStaticField(BaseServlet.class, "synctask", synchronizerTask, true);
116 proxyServlet.init(mock(ServletConfig.class));
117 setHeadersForValidRequest();
118 mockHttpClientForGetRequest();
122 public void Given_Request_Is_HTTP_POST_Exception_Is_Thrown() {
123 proxyServlet.doPost(request, servletResponse);
127 public void Given_Request_Is_HTTP_DELETE_Exception_Is_Thrown() {
128 proxyServlet.doDelete(request, servletResponse);
132 public void Given_Request_Is_HTTP_GET_Exception_Is_Thrown() {
133 proxyServlet.doGet(request, servletResponse);
137 public void Given_Request_Is_HTTP_PUT_Exception_Is_Thrown() {
138 proxyServlet.doPut(request, servletResponse);
142 public void Given_Request_Is_HTTP_GetWithFallBack_Exception_Is_Thrown() {
143 proxyServlet.doGetWithFallback(request, servletResponse);
147 public void Veirfy_Headers_Are_Copied() {
148 HttpResponse proxyResponse = PowerMockito.mock(HttpResponse.class);
149 Header[] headersArray = new Header[2];
150 headersArray[0] = new BasicHeader("cache-control", "public, max-age=86400");
151 headersArray[1] = new BasicHeader("content-type", "text/plain");
152 PowerMockito.when(proxyResponse.getAllHeaders()).thenReturn(headersArray);
153 proxyServlet.copyResponseHeaders(proxyResponse, servletResponse);
157 public void Veirfy_EntitiyContent_Copied() throws IOException {
158 HttpResponse proxyResponse = PowerMockito.mock(HttpResponse.class);
159 HttpEntity entity = PowerMockito.mock(HttpEntity.class);
160 PowerMockito.when(proxyResponse.getEntity()).thenReturn(entity);
161 PowerMockito.when(entity.getContent()).thenReturn(new ByteArrayInputStream("blah".getBytes()));
162 proxyServlet.copyEntityContent(proxyResponse, servletResponse);
165 private void setHeadersForValidRequest() {
166 List<String> headers = new ArrayList<>();
167 headers.add("Content-Type");
168 headers.add("X-DMAAP-DR-ON-BEHALF-OF");
169 headers.add("X-DMAAP-DR-META");
170 Enumeration<String> headerNames = Collections.enumeration(headers);
171 Mockito.when(request.getHeaderNames()).thenReturn(headerNames);
172 Enumeration<String> contentTypeHeader = Collections.enumeration(Collections.singletonList("text/plain"));
173 Enumeration<String> behalfHeader = Collections.enumeration(Collections.singletonList("User1"));
174 Enumeration<String> metaDataHeader = Collections.enumeration(Collections.singletonList("?#@><"));
175 Mockito.when(request.getHeaders("Content-Type")).thenReturn(contentTypeHeader);
176 Mockito.when(request.getHeaders("X-DMAAP-DR-ON-BEHALF-OF")).thenReturn(behalfHeader);
177 Mockito.when(request.getHeaders("X-DMAAP-DR-META")).thenReturn(metaDataHeader);
180 private void mockHttpClientForGetRequest() throws Exception {
181 PowerMockito.when(httpClient.execute(any(HttpUriRequest.class))).thenReturn(response);
182 Mockito.when(request.getRequestURI()).thenReturn("/api");
183 Mockito.when(response.getStatusLine()).thenReturn(statusLine);