Unit test base
[dmaap/datarouter.git] / datarouter-prov / src / test / java / org / onap / dmaap / datarouter / provisioning / FeedServletTest.java
1 /*******************************************************************************
2  * ============LICENSE_START==================================================
3  * * org.onap.dmaap
4  * * ===========================================================================
5  * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
6  * * ===========================================================================
7  * * Licensed under the Apache License, Version 2.0 (the "License");
8  * * you may not use this file except in compliance with the License.
9  * * You may obtain a copy of the License at
10  * *
11  *  *      http://www.apache.org/licenses/LICENSE-2.0
12  * *
13  *  * Unless required by applicable law or agreed to in writing, software
14  * * distributed under the License is distributed on an "AS IS" BASIS,
15  * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * * See the License for the specific language governing permissions and
17  * * limitations under the License.
18  * * ============LICENSE_END====================================================
19  * *
20  * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
21  * *
22  ******************************************************************************/
23 package org.onap.dmaap.datarouter.provisioning;
24
25 import org.apache.commons.lang3.reflect.FieldUtils;
26 import org.apache.log4j.Logger;
27 import org.json.JSONObject;
28 import org.junit.Before;
29 import org.junit.Test;
30 import org.junit.runner.RunWith;
31 import org.mockito.Mock;
32 import org.onap.dmaap.datarouter.authz.AuthorizationResponse;
33 import org.onap.dmaap.datarouter.authz.Authorizer;
34 import org.onap.dmaap.datarouter.provisioning.beans.Feed;
35 import org.onap.dmaap.datarouter.provisioning.beans.Updateable;
36 import org.powermock.api.mockito.PowerMockito;
37 import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor;
38 import org.powermock.modules.junit4.PowerMockRunner;
39
40 import javax.servlet.ServletInputStream;
41 import javax.servlet.ServletOutputStream;
42 import javax.servlet.http.HttpServletRequest;
43 import javax.servlet.http.HttpServletResponse;
44 import java.io.OutputStream;
45 import java.util.HashSet;
46 import java.util.Set;
47
48 import static org.hamcrest.Matchers.notNullValue;
49 import static org.mockito.Mockito.*;
50 import static org.onap.dmaap.datarouter.provisioning.BaseServlet.BEHALF_HEADER;
51
52
53 @RunWith(PowerMockRunner.class)
54 @SuppressStaticInitializationFor("org.onap.dmaap.datarouter.provisioning.beans.Feed")
55 public class FeedServletTest {
56     private static FeedServlet feedServlet;
57
58     @Mock
59     private HttpServletRequest request;
60     @Mock
61     private HttpServletResponse response;
62
63     @Before
64     public void setUp() throws Exception {
65         initialiseBaseServletToBypassRetreiviingInitialisationParametersFromDatabase();
66         feedServlet = new FeedServlet();
67         setAuthoriserToReturnRequestIsAuthorized();
68         setPokerToNotCreateTimersWhenDeleteFeedIsCalled();
69         setupValidAuthorisedRequest();
70         setUpValidSecurityOnHttpRequest();
71     }
72
73     @Test
74     public void Given_Request_Is_HTTP_DELETE_And_Is_Not_Secure_When_HTTPS_Is_Required_Then_Forbidden_Response_Is_Generated() throws Exception {
75         when(request.isSecure()).thenReturn(false);
76         feedServlet.doDelete(request, response);
77         verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class)));
78     }
79
80
81     @Test
82     public void Given_Request_Is_HTTP_DELETE_And_BEHALF_HEADER_Is_Not_Set_In_Request_Then_Bad_Request_Response_Is_Generated() throws Exception {
83         setBehalfHeader(null);
84         feedServlet.doDelete(request, response);
85         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
86     }
87
88
89     @Test
90     public void Given_Request_Is_HTTP_DELETE_And_Path_Header_Is_Not_Set_In_Request_With_Valid_Path_Then_Bad_Request_Response_Is_Generated() throws Exception {
91         when(request.getPathInfo()).thenReturn(null);
92         feedServlet.doDelete(request, response);
93         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
94     }
95
96
97     @Test
98     public void Given_Request_Is_HTTP_DELETE_And_Feed_Id_Is_Invalid_Then_Not_Found_Response_Is_Generated() throws Exception {
99         setFeedToReturnInvalidFeedIdSupplied();
100         feedServlet.doDelete(request, response);
101         verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class)));
102     }
103
104
105     @Test
106     public void Given_Request_Is_HTTP_DELETE_And_Request_Is_Not_Authorized_Then_Forbidden_Response_Is_Generated() throws Exception {
107         setAuthoriserToReturnRequestNotAuthorized();
108         feedServlet.doDelete(request, response);
109         verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class)));
110     }
111
112
113     @Test
114     public void Given_Request_Is_HTTP_DELETE_And_Delete_On_Database_Fails_An_Internal_Server_Error_Is_Reported() throws Exception {
115         FeedServlet feedServlet = new FeedServlet() {
116             protected boolean doUpdate(Updateable bean) {
117                 return false;
118             }
119         };
120         feedServlet.doDelete(request, response);
121         verify(response).sendError(eq(HttpServletResponse.SC_INTERNAL_SERVER_ERROR), argThat(notNullValue(String.class)));
122     }
123
124
125     @Test
126     public void Given_Request_Is_HTTP_DELETE_And_Delete_On_Database_Succeeds_A_NO_CONTENT_Response_Is_Generated() throws Exception {
127         FeedServlet feedServlet = new FeedServlet() {
128             protected boolean doUpdate(Updateable bean) {
129                 return true;
130             }
131         };
132         feedServlet.doDelete(request, response);
133         verify(response).setStatus(eq(HttpServletResponse.SC_NO_CONTENT));
134     }
135
136     @Test
137     public void Given_Request_Is_HTTP_GET_And_Is_Not_Secure_When_HTTPS_Is_Required_Then_Forbidden_Response_Is_Generated() throws Exception {
138         when(request.isSecure()).thenReturn(false);
139         feedServlet.doGet(request, response);
140         verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class)));
141     }
142
143     @Test
144     public void Given_Request_Is_HTTP_GET_And_BEHALF_HEADER_Is_Not_Set_In_Request_Then_Bad_Request_Response_Is_Generated() throws Exception {
145         setBehalfHeader(null);
146         feedServlet.doGet(request, response);
147         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
148     }
149
150
151     @Test
152     public void Given_Request_Is_HTTP_GET_And_Path_Header_Is_Not_Set_In_Request_With_Valid_Path_Then_Bad_Request_Response_Is_Generated() throws Exception {
153         when(request.getPathInfo()).thenReturn(null);
154         feedServlet.doGet(request, response);
155         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
156     }
157
158
159     @Test
160     public void Given_Request_Is_HTTP_GET_And_Feed_Id_Is_Invalid_Then_Not_Found_Response_Is_Generated() throws Exception {
161         setFeedToReturnInvalidFeedIdSupplied();
162         feedServlet.doGet(request, response);
163         verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class)));
164     }
165
166
167     @Test
168     public void Given_Request_Is_HTTP_GET_And_Request_Is_Not_Authorized_Then_Forbidden_Response_Is_Generated() throws Exception {
169         setAuthoriserToReturnRequestNotAuthorized();
170         feedServlet.doGet(request, response);
171         verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class)));
172     }
173
174
175     @Test
176     public void Given_Request_Is_HTTP_GET_And_Request_Succeeds() throws Exception {
177         ServletOutputStream outStream = mock(ServletOutputStream.class);
178         when(response.getOutputStream()).thenReturn(outStream);
179         feedServlet.doGet(request, response);
180         verify(response).setStatus(eq(HttpServletResponse.SC_OK));
181     }
182
183
184     @Test
185     public void Given_Request_Is_HTTP_PUT_And_Is_Not_Secure_When_HTTPS_Is_Required_Then_Forbidden_Response_Is_Generated() throws Exception {
186         when(request.isSecure()).thenReturn(false);
187         feedServlet.doPut(request, response);
188         verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class)));
189     }
190
191     @Test
192     public void Given_Request_Is_HTTP_PUT_And_BEHALF_HEADER_Is_Not_Set_In_Request_Then_Bad_Request_Response_Is_Generated() throws Exception {
193         setBehalfHeader(null);
194         feedServlet.doPut(request, response);
195         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
196     }
197
198
199     @Test
200     public void Given_Request_Is_HTTP_PUT_And_Path_Header_Is_Not_Set_In_Request_With_Valid_Path_Then_Bad_Request_Response_Is_Generated() throws Exception {
201         when(request.getPathInfo()).thenReturn(null);
202         feedServlet.doPut(request, response);
203         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
204     }
205
206
207     @Test
208     public void Given_Request_Is_HTTP_PUT_And_Feed_Id_Is_Invalid_Then_Not_Found_Response_Is_Generated() throws Exception {
209         setFeedToReturnInvalidFeedIdSupplied();
210         feedServlet.doPut(request, response);
211         verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class)));
212     }
213
214     @Test
215     public void Given_Request_Is_HTTP_PUT_And_Content_Header_Is_Not_Supported_Type_Then_Unsupported_Media_Type_Response_Is_Generated() throws Exception {
216         when(request.getContentType()).thenReturn("stub_contentType");
217         feedServlet.doPut(request, response);
218         verify(response).sendError(eq(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE), argThat(notNullValue(String.class)));
219     }
220
221     @Test
222     public void Given_Request_Is_HTTP_PUT_And_Request_Contains_Badly_Formed_JSON_Then_Bad_Request_Response_Is_Generated() throws Exception {
223         when(request.getHeader("Content-Type")).thenReturn("application/vnd.att-dr.feed; version=1.0");
224         ServletInputStream inStream = mock(ServletInputStream.class);
225         when(request.getInputStream()).thenReturn(inStream);
226         feedServlet.doPut(request, response);
227         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
228     }
229
230
231     private void initialiseBaseServletToBypassRetreiviingInitialisationParametersFromDatabase() throws IllegalAccessException {
232         FieldUtils.writeDeclaredStaticField(BaseServlet.class, "startmsg_flag", false, true);
233         SynchronizerTask synchronizerTask = mock(SynchronizerTask.class);
234         when(synchronizerTask.getState()).thenReturn(SynchronizerTask.UNKNOWN);
235         FieldUtils.writeDeclaredStaticField(SynchronizerTask.class, "synctask", synchronizerTask, true);
236     }
237
238     private void setUpValidSecurityOnHttpRequest() throws Exception {
239         when(request.isSecure()).thenReturn(true);
240         Set<String> authAddressesAndNetworks = new HashSet<String>();
241         authAddressesAndNetworks.add(("127.0.0.1"));
242         FieldUtils.writeDeclaredStaticField(BaseServlet.class, "authorizedAddressesAndNetworks", authAddressesAndNetworks, true);
243         FieldUtils.writeDeclaredStaticField(BaseServlet.class, "require_cert", false, true);
244     }
245
246     private void setBehalfHeader(String headerValue) {
247         when(request.getHeader(BEHALF_HEADER)).thenReturn(headerValue);
248     }
249
250     private void setValidPathInfoInHttpHeader() {
251         when(request.getPathInfo()).thenReturn("/123");
252     }
253
254     private void setFeedToReturnInvalidFeedIdSupplied() {
255         PowerMockito.mockStatic(Feed.class);
256         PowerMockito.when(Feed.getFeedById(anyInt())).thenReturn(null);
257     }
258
259     private void setFeedToReturnValidFeedForSuppliedId() {
260         PowerMockito.mockStatic(Feed.class);
261         Feed feed = mock(Feed.class);
262         PowerMockito.when(Feed.getFeedById(anyInt())).thenReturn(feed);
263         when(feed.isDeleted()).thenReturn(false);
264         when(feed.asJSONObject(true)).thenReturn(mock(JSONObject.class));
265     }
266
267     private void setAuthoriserToReturnRequestNotAuthorized() throws IllegalAccessException {
268         AuthorizationResponse authResponse = mock(AuthorizationResponse.class);
269         Authorizer authorizer = mock(Authorizer.class);
270         FieldUtils.writeDeclaredStaticField(BaseServlet.class, "authz", authorizer, true);
271         when(authorizer.decide(request)).thenReturn(authResponse);
272         when(authResponse.isAuthorized()).thenReturn(false);
273     }
274
275     private void setAuthoriserToReturnRequestIsAuthorized() throws IllegalAccessException {
276         AuthorizationResponse authResponse = mock(AuthorizationResponse.class);
277         Authorizer authorizer = mock(Authorizer.class);
278         FieldUtils.writeDeclaredStaticField(BaseServlet.class, "authz", authorizer, true);
279         when(authorizer.decide(request)).thenReturn(authResponse);
280         when(authResponse.isAuthorized()).thenReturn(true);
281     }
282
283     private void setPokerToNotCreateTimersWhenDeleteFeedIsCalled() throws Exception {
284         Poker poker = mock(Poker.class);
285         FieldUtils.writeDeclaredStaticField(Poker.class, "p", poker, true);
286     }
287
288     private void setupValidAuthorisedRequest() throws Exception {
289         setUpValidSecurityOnHttpRequest();
290         setBehalfHeader("Stub_Value");
291         setValidPathInfoInHttpHeader();
292         setFeedToReturnValidFeedForSuppliedId();
293     }
294 }