Refactor Prov DB handling
[dmaap/datarouter.git] / datarouter-prov / src / test / java / org / onap / dmaap / datarouter / provisioning / ProxyServletTest.java
1 /*-
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
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
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.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.dmaap.datarouter.provisioning;
22
23 import static org.mockito.Matchers.any;
24 import static org.mockito.Mockito.mock;
25 import static org.powermock.api.mockito.PowerMockito.when;
26
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;
62
63 @RunWith(PowerMockRunner.class)
64 @PowerMockIgnore("javax.net.ssl.*")
65 @PrepareForTest({URLUtilities.class, BaseServlet.class, Scheme.class})
66 public class ProxyServletTest {
67     private static ProxyServlet proxyServlet;
68     private static EntityManagerFactory emf;
69     private static EntityManager em;
70
71     @Mock
72     private DefaultHttpClient httpClient;
73     @Mock
74     private HttpServletRequest request;
75     @Mock
76     private HttpServletResponse servletResponse;
77     @Mock
78     private CloseableHttpResponse response;
79     @Mock
80     private StatusLine statusLine;
81
82     @BeforeClass
83     public static void init() {
84         emf = Persistence.createEntityManagerFactory("dr-unit-tests");
85         em = emf.createEntityManager();
86         System.setProperty(
87                 "org.onap.dmaap.datarouter.provserver.properties",
88                 "src/test/resources/h2Database.properties");
89     }
90
91     @AfterClass
92     public static void tearDownClass() {
93         em.clear();
94         em.close();
95         emf.close();
96     }
97
98     @Before
99     public void setUp() throws Exception {
100         proxyServlet = new ProxyServlet();
101         FieldUtils.writeDeclaredField(proxyServlet, "inited", true, true);
102
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);
107
108         PowerMockito.mockStatic(BaseServlet.class);
109         PowerMockito.mockStatic(URLUtilities.class);
110         when(URLUtilities.getPeerPodName()).thenReturn("localhost");
111
112         SynchronizerTask synchronizerTask = SynchronizerTask.getSynchronizer();
113         FieldUtils.writeDeclaredField(synchronizerTask, "podState", 2, true);
114         FieldUtils.writeDeclaredStaticField(BaseServlet.class, "synctask", synchronizerTask, true);
115
116         proxyServlet.init(mock(ServletConfig.class));
117         setHeadersForValidRequest();
118         mockHttpClientForGetRequest();
119     }
120
121     @Test
122     public void Given_Request_Is_HTTP_POST_Exception_Is_Thrown() {
123         proxyServlet.doPost(request, servletResponse);
124     }
125
126     @Test
127     public void Given_Request_Is_HTTP_DELETE_Exception_Is_Thrown() {
128         proxyServlet.doDelete(request, servletResponse);
129     }
130
131     @Test
132     public void Given_Request_Is_HTTP_GET_Exception_Is_Thrown() {
133         proxyServlet.doGet(request, servletResponse);
134     }
135
136     @Test
137     public void Given_Request_Is_HTTP_PUT_Exception_Is_Thrown() {
138         proxyServlet.doPut(request, servletResponse);
139     }
140
141     @Test
142     public void Given_Request_Is_HTTP_GetWithFallBack_Exception_Is_Thrown() {
143         proxyServlet.doGetWithFallback(request, servletResponse);
144     }
145
146     @Test
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);
154     }
155
156     @Test
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);
163     }
164
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);
178     }
179
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);
184     }
185 }