Merge "Fixed Sonar issues"
[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.jetbrains.annotations.NotNull;
27 import org.json.JSONArray;
28 import org.json.JSONObject;
29 import org.junit.Before;
30 import org.junit.Test;
31 import org.junit.runner.RunWith;
32 import org.mockito.Mock;
33 import org.onap.dmaap.datarouter.authz.AuthorizationResponse;
34 import org.onap.dmaap.datarouter.authz.Authorizer;
35 import org.onap.dmaap.datarouter.provisioning.beans.Feed;
36 import org.onap.dmaap.datarouter.provisioning.beans.Updateable;
37 import org.powermock.api.mockito.PowerMockito;
38 import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor;
39 import org.powermock.modules.junit4.PowerMockRunner;
40
41 import javax.servlet.ServletInputStream;
42 import javax.servlet.ServletOutputStream;
43 import javax.servlet.http.HttpServletRequest;
44 import javax.servlet.http.HttpServletResponse;
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 extends DrServletTestBase {
56
57     private static FeedServlet feedServlet;
58
59     @Mock
60     private HttpServletRequest request;
61     @Mock
62     private HttpServletResponse response;
63
64     @Before
65     public void setUp() throws Exception {
66         super.setUp();
67         feedServlet = new FeedServlet();
68         setAuthoriserToReturnRequestIsAuthorized();
69         setPokerToNotCreateTimersWhenDeleteFeedIsCalled();
70         setUpValidAuthorisedRequest();
71         setUpValidSecurityOnHttpRequest();
72         setUpValidContentHeadersAndJSONOnHttpRequest();
73     }
74
75     @Test
76     public void Given_Request_Is_HTTP_DELETE_And_Is_Not_Secure_When_HTTPS_Is_Required_Then_Forbidden_Response_Is_Generated()
77         throws Exception {
78         when(request.isSecure()).thenReturn(false);
79         feedServlet.doDelete(request, response);
80         verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class)));
81     }
82
83
84     @Test
85     public void Given_Request_Is_HTTP_DELETE_And_BEHALF_HEADER_Is_Not_Set_In_Request_Then_Bad_Request_Response_Is_Generated()
86         throws Exception {
87         setBehalfHeader(null);
88         feedServlet.doDelete(request, response);
89         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
90     }
91
92
93     @Test
94     public void Given_Request_Is_HTTP_DELETE_And_Path_Header_Is_Not_Set_In_Request_With_Valid_Path_Then_Bad_Request_Response_Is_Generated()
95         throws Exception {
96         when(request.getPathInfo()).thenReturn(null);
97         feedServlet.doDelete(request, response);
98         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
99     }
100
101
102     @Test
103     public void Given_Request_Is_HTTP_DELETE_And_Feed_Id_Is_Invalid_Then_Not_Found_Response_Is_Generated()
104         throws Exception {
105         setFeedToReturnInvalidFeedIdSupplied();
106         feedServlet.doDelete(request, response);
107         verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class)));
108     }
109
110
111     @Test
112     public void Given_Request_Is_HTTP_DELETE_And_Request_Is_Not_Authorized_Then_Forbidden_Response_Is_Generated()
113         throws Exception {
114         setAuthoriserToReturnRequestNotAuthorized();
115         feedServlet.doDelete(request, response);
116         verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class)));
117     }
118
119
120     @Test
121     public void Given_Request_Is_HTTP_DELETE_And_Delete_On_Database_Fails_An_Internal_Server_Error_Is_Reported()
122         throws Exception {
123         FeedServlet feedServlet = new FeedServlet() {
124             protected boolean doUpdate(Updateable bean) {
125                 return false;
126             }
127         };
128         feedServlet.doDelete(request, response);
129         verify(response)
130             .sendError(eq(HttpServletResponse.SC_INTERNAL_SERVER_ERROR), argThat(notNullValue(String.class)));
131     }
132
133
134     @Test
135     public void Given_Request_Is_HTTP_DELETE_And_Delete_On_Database_Succeeds_A_NO_CONTENT_Response_Is_Generated()
136         throws Exception {
137         FeedServlet feedServlet = new FeedServlet() {
138             protected boolean doUpdate(Updateable bean) {
139                 return true;
140             }
141         };
142         feedServlet.doDelete(request, response);
143         verify(response).setStatus(eq(HttpServletResponse.SC_NO_CONTENT));
144     }
145
146     @Test
147     public void Given_Request_Is_HTTP_GET_And_Is_Not_Secure_When_HTTPS_Is_Required_Then_Forbidden_Response_Is_Generated()
148         throws Exception {
149         when(request.isSecure()).thenReturn(false);
150         feedServlet.doGet(request, response);
151         verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class)));
152     }
153
154     @Test
155     public void Given_Request_Is_HTTP_GET_And_BEHALF_HEADER_Is_Not_Set_In_Request_Then_Bad_Request_Response_Is_Generated()
156         throws Exception {
157         setBehalfHeader(null);
158         feedServlet.doGet(request, response);
159         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
160     }
161
162
163     @Test
164     public void Given_Request_Is_HTTP_GET_And_Path_Header_Is_Not_Set_In_Request_With_Valid_Path_Then_Bad_Request_Response_Is_Generated()
165         throws Exception {
166         when(request.getPathInfo()).thenReturn(null);
167         feedServlet.doGet(request, response);
168         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
169     }
170
171
172     @Test
173     public void Given_Request_Is_HTTP_GET_And_Feed_Id_Is_Invalid_Then_Not_Found_Response_Is_Generated()
174         throws Exception {
175         setFeedToReturnInvalidFeedIdSupplied();
176         feedServlet.doGet(request, response);
177         verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class)));
178     }
179
180
181     @Test
182     public void Given_Request_Is_HTTP_GET_And_Request_Is_Not_Authorized_Then_Forbidden_Response_Is_Generated()
183         throws Exception {
184         setAuthoriserToReturnRequestNotAuthorized();
185         feedServlet.doGet(request, response);
186         verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class)));
187     }
188
189
190     @Test
191     public void Given_Request_Is_HTTP_GET_And_Request_Succeeds() throws Exception {
192         ServletOutputStream outStream = mock(ServletOutputStream.class);
193         when(response.getOutputStream()).thenReturn(outStream);
194         feedServlet.doGet(request, response);
195         verify(response).setStatus(eq(HttpServletResponse.SC_OK));
196     }
197
198
199     @Test
200     public void Given_Request_Is_HTTP_PUT_And_Is_Not_Secure_When_HTTPS_Is_Required_Then_Forbidden_Response_Is_Generated()
201         throws Exception {
202         when(request.isSecure()).thenReturn(false);
203         feedServlet.doPut(request, response);
204         verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class)));
205     }
206
207     @Test
208     public void Given_Request_Is_HTTP_PUT_And_BEHALF_HEADER_Is_Not_Set_In_Request_Then_Bad_Request_Response_Is_Generated()
209         throws Exception {
210         setBehalfHeader(null);
211         feedServlet.doPut(request, response);
212         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
213     }
214
215
216     @Test
217     public void Given_Request_Is_HTTP_PUT_And_Path_Header_Is_Not_Set_In_Request_With_Valid_Path_Then_Bad_Request_Response_Is_Generated()
218         throws Exception {
219         when(request.getPathInfo()).thenReturn(null);
220         feedServlet.doPut(request, response);
221         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
222     }
223
224
225     @Test
226     public void Given_Request_Is_HTTP_PUT_And_Feed_Id_Is_Invalid_Then_Not_Found_Response_Is_Generated()
227         throws Exception {
228         setFeedToReturnInvalidFeedIdSupplied();
229         feedServlet.doPut(request, response);
230         verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class)));
231     }
232
233     @Test
234     public void Given_Request_Is_HTTP_PUT_And_Content_Header_Is_Not_Supported_Type_Then_Unsupported_Media_Type_Response_Is_Generated()
235         throws Exception {
236         when(request.getHeader("Content-Type")).thenReturn("application/vnd.att-dr.feed-fail; version=2.0");
237         when(request.getContentType()).thenReturn("stub_contentType");
238         feedServlet.doPut(request, response);
239         verify(response)
240             .sendError(eq(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE), argThat(notNullValue(String.class)));
241     }
242
243     @Test
244     public void Given_Request_Is_HTTP_PUT_And_Request_Contains_Badly_Formed_JSON_Then_Bad_Request_Response_Is_Generated()
245         throws Exception {
246         ServletInputStream inStream = mock(ServletInputStream.class);
247         when(request.getInputStream()).thenReturn(inStream);
248         feedServlet.doPut(request, response);
249         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
250     }
251
252     @Test
253     public void Given_Request_Is_HTTP_PUT_And_Request_Contains_Invalid_JSON_Then_Bad_Request_Response_Is_Generated() throws Exception {
254         FeedServlet feedServlet = new FeedServlet() {
255             protected JSONObject getJSONfromInput(HttpServletRequest req) {
256                 return new JSONObject();
257             }
258         };
259         feedServlet.doPut(request, response);
260         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
261     }
262
263     @Test
264     public void Given_Request_Is_HTTP_PUT_And_Feed_Change_Is_Not_Publisher_Who_Requested_Feed_Bad_Request_Response_Is_Generated() throws Exception {
265         when(request.getHeader("X-ATT-DR-ON-BEHALF-OF-GROUP")).thenReturn(null);
266         JSONObject JSObject = buildRequestJsonObject();
267         FeedServlet feedServlet = new FeedServlet() {
268             protected JSONObject getJSONfromInput(HttpServletRequest req) {
269                 JSONObject jo = new JSONObject();
270                 jo.put("name", "stub_name");
271                 jo.put("version", "1.0");
272                 jo.put("authorization", JSObject);
273                 return jo;
274             }
275         };
276
277         feedServlet.doPut(request, response);
278         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
279     }
280
281     @Test
282     public void Given_Request_Is_HTTP_PUT_And_Feed_Name_Change_is_Requested_Bad_Request_Response_Is_Generated() throws Exception {
283         JSONObject JSObject = buildRequestJsonObject();
284         FeedServlet feedServlet = new FeedServlet() {
285             protected JSONObject getJSONfromInput(HttpServletRequest req) {
286                 JSONObject jo = new JSONObject();
287                 jo.put("name", "not_stub_name");
288                 jo.put("version", "1.0");
289                 jo.put("authorization", JSObject);
290                 return jo;
291             }
292         };
293         feedServlet.doPut(request, response);
294         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
295     }
296
297     @Test
298     public void Given_Request_Is_HTTP_PUT_And_Feed_Version_Change_is_Requested_Bad_Request_Response_Is_Generated() throws Exception {
299         JSONObject JSObject = buildRequestJsonObject();
300         FeedServlet feedServlet = new FeedServlet() {
301             protected JSONObject getJSONfromInput(HttpServletRequest req) {
302                 JSONObject jo = new JSONObject();
303                 jo.put("name", "stub_name");
304                 jo.put("version", "2.0");
305                 jo.put("authorization", JSObject);
306                 return jo;
307             }
308         };
309         feedServlet.doPut(request, response);
310         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
311     }
312
313     @Test
314     public void Given_Request_Is_HTTP_PUT_And_Request_Is_Not_Authorized_Then_Forbidden_Response_Is_Generated() throws Exception {
315         JSONObject JSObject = buildRequestJsonObject();
316         FeedServlet feedServlet = new FeedServlet() {
317             protected JSONObject getJSONfromInput(HttpServletRequest req) {
318                 JSONObject jo = new JSONObject();
319                 jo.put("name", "stub_name");
320                 jo.put("version", "1.0");
321                 jo.put("authorization", JSObject);
322                 return jo;
323             }
324         };
325         setAuthoriserToReturnRequestNotAuthorized();
326         feedServlet.doPut(request, response);
327         verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class)));
328     }
329
330     @Test
331     public void Given_Request_Is_HTTP_PUT_And_Change_On_Feeds_Fails_A_STATUS_OK_Response_Is_Generated() throws Exception {
332         ServletOutputStream outStream = mock(ServletOutputStream.class);
333         when(response.getOutputStream()).thenReturn(outStream);
334
335         JSONObject JSObject = buildRequestJsonObject();
336         FeedServlet feedServlet = new FeedServlet() {
337             protected JSONObject getJSONfromInput(HttpServletRequest req) {
338                 JSONObject jo = new JSONObject();
339                 jo.put("name", "stub_name");
340                 jo.put("version", "1.0");
341                 jo.put("authorization", JSObject);
342                 return jo;
343             }
344
345             @Override
346             protected boolean doUpdate(Updateable bean) {
347                 return false;
348             }
349         };
350         feedServlet.doPut(request, response);
351         verify(response).sendError(eq(HttpServletResponse.SC_INTERNAL_SERVER_ERROR), argThat(notNullValue(String.class)));
352     }
353
354     @Test
355     public void Given_Request_Is_HTTP_PUT_And_Change_On_Feeds_Suceeds_A_STATUS_OK_Response_Is_Generated() throws Exception {
356         ServletOutputStream outStream = mock(ServletOutputStream.class);
357         when(response.getOutputStream()).thenReturn(outStream);
358         JSONObject JSObject = buildRequestJsonObject();
359         FeedServlet feedServlet = new FeedServlet() {
360             protected JSONObject getJSONfromInput(HttpServletRequest req) {
361                 JSONObject jo = new JSONObject();
362                 jo.put("name", "stub_name");
363                 jo.put("version", "1.0");
364                 jo.put("authorization", JSObject);
365                 return jo;
366             }
367
368             @Override
369             protected boolean doUpdate(Updateable bean) {
370                 return true;
371             }
372         };
373         feedServlet.doPut(request, response);
374         verify(response).setStatus(eq(HttpServletResponse.SC_OK));
375     }
376
377     @Test
378     public void Given_Request_Is_HTTP_POST_SC_METHOD_NOT_ALLOWED_Response_Is_Generated() throws Exception {
379         feedServlet.doPost(request, response);
380         verify(response).sendError(eq(HttpServletResponse.SC_METHOD_NOT_ALLOWED), argThat(notNullValue(String.class)));
381     }
382
383     @NotNull
384     private JSONObject buildRequestJsonObject() {
385         JSONObject JSObject = new JSONObject();
386         JSONArray endpointIDs = new JSONArray();
387         JSONObject JOEndpointIDs = new JSONObject();
388         JOEndpointIDs.put("id", "stub_endpoint_id");
389         JOEndpointIDs.put("password", "stub_endpoint_password");
390         endpointIDs.put(JOEndpointIDs);
391
392         JSONArray endpointAddresses = new JSONArray();
393         endpointAddresses.put("127.0.0.1");
394
395         JSObject.put("classification", "stub_classification");
396         JSObject.put("endpoint_ids", endpointIDs);
397         JSObject.put("endpoint_addrs", endpointAddresses);
398         return JSObject;
399     }
400
401     private void setUpValidSecurityOnHttpRequest() throws Exception {
402         when(request.isSecure()).thenReturn(true);
403         Set<String> authAddressesAndNetworks = new HashSet<String>();
404         authAddressesAndNetworks.add(("127.0.0.1"));
405         FieldUtils
406             .writeDeclaredStaticField(BaseServlet.class, "authorizedAddressesAndNetworks", authAddressesAndNetworks,
407                 true);
408         FieldUtils.writeDeclaredStaticField(BaseServlet.class, "requireCert", false, true);
409     }
410
411     private void setBehalfHeader(String headerValue) {
412         when(request.getHeader(BEHALF_HEADER)).thenReturn(headerValue);
413     }
414
415     private void setValidPathInfoInHttpHeader() {
416         when(request.getPathInfo()).thenReturn("/123");
417     }
418
419     private void setFeedToReturnInvalidFeedIdSupplied() {
420         PowerMockito.mockStatic(Feed.class);
421         PowerMockito.when(Feed.getFeedById(anyInt())).thenReturn(null);
422     }
423
424     private void setFeedToReturnValidFeedForSuppliedId() {
425         PowerMockito.mockStatic(Feed.class);
426         Feed feed = mock(Feed.class);
427         PowerMockito.when(Feed.getFeedById(anyInt())).thenReturn(feed);
428         when(feed.isDeleted()).thenReturn(false);
429         when(feed.asJSONObject(true)).thenReturn(mock(JSONObject.class));
430         when(feed.getPublisher()).thenReturn("Stub_Value");
431         when(feed.getName()).thenReturn("stub_name");
432         when(feed.getVersion()).thenReturn("1.0");
433         when(feed.asLimitedJSONObject()).thenReturn(mock(JSONObject.class));
434     }
435
436     private void setAuthoriserToReturnRequestNotAuthorized() throws IllegalAccessException {
437         AuthorizationResponse authResponse = mock(AuthorizationResponse.class);
438         Authorizer authorizer = mock(Authorizer.class);
439         FieldUtils.writeDeclaredStaticField(BaseServlet.class, "authz", authorizer, true);
440         when(authorizer.decide(request)).thenReturn(authResponse);
441         when(authResponse.isAuthorized()).thenReturn(false);
442     }
443
444     private void setAuthoriserToReturnRequestIsAuthorized() throws IllegalAccessException {
445         AuthorizationResponse authResponse = mock(AuthorizationResponse.class);
446         Authorizer authorizer = mock(Authorizer.class);
447         FieldUtils.writeDeclaredStaticField(BaseServlet.class, "authz", authorizer, true);
448         when(authorizer.decide(request)).thenReturn(authResponse);
449         when(authResponse.isAuthorized()).thenReturn(true);
450     }
451
452     private void setPokerToNotCreateTimersWhenDeleteFeedIsCalled() throws Exception {
453         Poker poker = mock(Poker.class);
454         FieldUtils.writeDeclaredStaticField(Poker.class, "poker", poker, true);
455     }
456
457     private void setUpValidAuthorisedRequest() throws Exception {
458         setUpValidSecurityOnHttpRequest();
459         setBehalfHeader("Stub_Value");
460         setValidPathInfoInHttpHeader();
461         setFeedToReturnValidFeedForSuppliedId();
462     }
463
464     private void setUpValidContentHeadersAndJSONOnHttpRequest() {
465         when(request.getHeader("Content-Type")).thenReturn("application/vnd.att-dr.feed; version=1.0");
466         when(request.getHeader("X-ATT-DR-ON-BEHALF-OF-GROUP")).thenReturn("stub_subjectGroup");
467     }
468 }