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.URLUtilities;
57 import org.powermock.api.mockito.PowerMockito;
58 import org.powermock.core.classloader.annotations.PowerMockIgnore;
59 import org.powermock.core.classloader.annotations.PrepareForTest;
60 import org.powermock.modules.junit4.PowerMockRunner;
62 @RunWith(PowerMockRunner.class)
63 @PowerMockIgnore("javax.net.ssl.*")
64 @PrepareForTest({URLUtilities.class, BaseServlet.class, Scheme.class})
65 public class ProxyServletTest {
66 private static ProxyServlet proxyServlet;
67 private static EntityManagerFactory emf;
68 private static EntityManager em;
71 private DefaultHttpClient httpClient;
73 private HttpServletRequest request;
75 private HttpServletResponse servletResponse;
77 private CloseableHttpResponse response;
79 private StatusLine statusLine;
82 public static void init() {
83 emf = Persistence.createEntityManagerFactory("dr-unit-tests");
84 em = emf.createEntityManager();
86 "org.onap.dmaap.datarouter.provserver.properties",
87 "src/test/resources/h2Database.properties");
91 public static void tearDownClass() {
98 public void setUp() throws Exception {
99 proxyServlet = new ProxyServlet();
100 FieldUtils.writeDeclaredField(proxyServlet, "inited", true, true);
102 org.apache.http.conn.ssl.SSLSocketFactory sslSocketFactory = PowerMockito.mock(org.apache.http.conn.ssl.SSLSocketFactory.class);
103 Mockito.doNothing().when(sslSocketFactory).setHostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
104 Scheme scheme = new Scheme("http", 80, sslSocketFactory);
105 FieldUtils.writeDeclaredField(proxyServlet, "sch", scheme, true);
107 PowerMockito.mockStatic(BaseServlet.class);
108 PowerMockito.mockStatic(URLUtilities.class);
109 when(URLUtilities.getPeerPodName()).thenReturn("localhost");
111 SynchronizerTask synchronizerTask = SynchronizerTask.getSynchronizer();
112 FieldUtils.writeDeclaredField(synchronizerTask, "podState", 2, true);
113 FieldUtils.writeDeclaredStaticField(BaseServlet.class, "synctask", synchronizerTask, true);
115 proxyServlet.init(mock(ServletConfig.class));
116 setHeadersForValidRequest();
117 mockHttpClientForGetRequest();
121 public void Given_Request_Is_HTTP_POST_Exception_Is_Thrown() {
122 proxyServlet.doPost(request, servletResponse);
126 public void Given_Request_Is_HTTP_DELETE_Exception_Is_Thrown() {
127 proxyServlet.doDelete(request, servletResponse);
131 public void Given_Request_Is_HTTP_GET_Exception_Is_Thrown() {
132 proxyServlet.doGet(request, servletResponse);
136 public void Given_Request_Is_HTTP_PUT_Exception_Is_Thrown() {
137 proxyServlet.doPut(request, servletResponse);
141 public void Given_Request_Is_HTTP_GetWithFallBack_Exception_Is_Thrown() {
142 proxyServlet.doGetWithFallback(request, servletResponse);
146 public void Veirfy_Headers_Are_Copied() {
147 HttpResponse proxyResponse = PowerMockito.mock(HttpResponse.class);
148 Header[] headersArray = new Header[2];
149 headersArray[0] = new BasicHeader("cache-control", "public, max-age=86400");
150 headersArray[1] = new BasicHeader("content-type", "text/plain");
151 PowerMockito.when(proxyResponse.getAllHeaders()).thenReturn(headersArray);
152 proxyServlet.copyResponseHeaders(proxyResponse, servletResponse);
156 public void Veirfy_EntitiyContent_Copied() throws IOException {
157 HttpResponse proxyResponse = PowerMockito.mock(HttpResponse.class);
158 HttpEntity entity = PowerMockito.mock(HttpEntity.class);
159 PowerMockito.when(proxyResponse.getEntity()).thenReturn(entity);
160 PowerMockito.when(entity.getContent()).thenReturn(new ByteArrayInputStream("blah".getBytes()));
161 proxyServlet.copyEntityContent(proxyResponse, servletResponse);
164 private void setHeadersForValidRequest() {
165 List<String> headers = new ArrayList<>();
166 headers.add("Content-Type");
167 headers.add("X-DMAAP-DR-ON-BEHALF-OF");
168 headers.add("X-DMAAP-DR-META");
169 Enumeration<String> headerNames = Collections.enumeration(headers);
170 Mockito.when(request.getHeaderNames()).thenReturn(headerNames);
171 Enumeration<String> contentTypeHeader = Collections.enumeration(Collections.singletonList("text/plain"));
172 Enumeration<String> behalfHeader = Collections.enumeration(Collections.singletonList("User1"));
173 Enumeration<String> metaDataHeader = Collections.enumeration(Collections.singletonList("?#@><"));
174 Mockito.when(request.getHeaders("Content-Type")).thenReturn(contentTypeHeader);
175 Mockito.when(request.getHeaders("X-DMAAP-DR-ON-BEHALF-OF")).thenReturn(behalfHeader);
176 Mockito.when(request.getHeaders("X-DMAAP-DR-META")).thenReturn(metaDataHeader);
179 private void mockHttpClientForGetRequest() throws Exception {
180 PowerMockito.when(httpClient.execute(any(HttpUriRequest.class))).thenReturn(response);
181 Mockito.when(request.getRequestURI()).thenReturn("/api");
182 Mockito.when(response.getStatusLine()).thenReturn(statusLine);