f1082ba31fa091edfe8554801f1e254087b13981
[dmaap/datarouter.git] / datarouter-prov / src / test / java / org / onap / dmaap / datarouter / provisioning / RouteServletTest.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
24 package org.onap.dmaap.datarouter.provisioning;
25
26 import org.apache.commons.lang3.reflect.FieldUtils;
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.provisioning.beans.*;
33 import org.powermock.api.mockito.PowerMockito;
34 import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor;
35 import org.powermock.modules.junit4.PowerMockRunner;
36 import javax.servlet.ServletOutputStream;
37 import javax.servlet.http.HttpServletRequest;
38 import javax.servlet.http.HttpServletResponse;
39 import java.util.SortedSet;
40 import java.util.TreeSet;
41 import static org.hamcrest.Matchers.notNullValue;
42 import static org.mockito.Matchers.*;
43 import static org.mockito.Mockito.mock;
44 import static org.mockito.Mockito.verify;
45 import static org.mockito.Mockito.when;
46
47 @RunWith(PowerMockRunner.class)
48 @SuppressStaticInitializationFor({"org.onap.dmaap.datarouter.provisioning.beans.IngressRoute",
49         "org.onap.dmaap.datarouter.provisioning.beans.EgressRoute",
50         "org.onap.dmaap.datarouter.provisioning.beans.NodeClass",
51         "org.onap.dmaap.datarouter.provisioning.beans.NetworkRoute"})
52 public class RouteServletTest extends DrServletTestBase
53 {
54     private RouteServlet routeServlet;
55
56     @Mock
57     private HttpServletRequest request;
58
59     @Mock
60     private HttpServletResponse response;
61
62     @Before
63     public void setUp() throws Exception {
64         super.setUp();
65         setPokerToNotCreateTimersWhenDeleteFeedIsCalled();
66         setRouteToReturnValid();
67         routeServlet = new RouteServlet();
68     }
69
70     @Test
71     public void Given_Request_Is_HTTP_DELETE_And_Is_Not_Authorized() throws Exception {
72         FieldUtils.writeDeclaredStaticField(BaseServlet.class, "isAddressAuthEnabled", "true", true);
73         routeServlet.doDelete(request, response);
74         verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class)));
75     }
76
77     @Test
78     public void Given_Request_Is_HTTP_DELETE_And_Ingress_Route_Does_Not_Exist_In_Path() throws Exception {
79         when(request.getPathInfo()).thenReturn("/ingress/3/internal/route/");
80         RouteServlet routeServlet = new RouteServlet() {
81             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
82                 return true;
83             }
84         };
85         routeServlet.doDelete(request, response);
86         verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class)));
87     }
88
89     @Test
90     public void Given_Request_Is_HTTP_DELETE_And_Ingress_Path_Contains_Invalid_FeedID() throws Exception {
91         when(request.getPathInfo()).thenReturn("/ingress/feedID/internal/route/");
92         RouteServlet routeServlet = new RouteServlet() {
93             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
94                 return true;
95             }
96         };
97         routeServlet.doDelete(request, response);
98         verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class)));
99     }
100
101     @Test
102     public void Given_Request_Is_HTTP_DELETE_And_Ingress_Path_Contains_Invalid_Sequence_Number() throws Exception {
103         when(request.getPathInfo()).thenReturn("/ingress/feedID/");
104         RouteServlet routeServlet = new RouteServlet() {
105             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
106                 return true;
107             }
108         };
109         routeServlet.doDelete(request, response);
110         verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class)));
111     }
112
113     @Test
114     public void Given_Request_Is_HTTP_DELETE_And_Ingress_Path_Contains_Invalid_Number_Of_Arguments() throws Exception {
115         when(request.getPathInfo()).thenReturn("/ingress/");
116         RouteServlet routeServlet = new RouteServlet() {
117             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
118                 return true;
119             }
120         };
121         routeServlet.doDelete(request, response);
122         verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class)));
123     }
124
125     @Test
126     public void Given_Request_Is_HTTP_DELETE_And_Egress_Route_Does_Not_Exist_In_Path() throws Exception {
127         when(request.getPathInfo()).thenReturn("/egress/3");
128         RouteServlet routeServlet = new RouteServlet() {
129             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
130                 return true;
131             }
132         };
133         routeServlet.doDelete(request, response);
134         verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class)));
135     }
136
137     @Test
138     public void Given_Request_Is_HTTP_DELETE_And_Egress_Path_Contains_Invalid_SubID() throws Exception {
139         when(request.getPathInfo()).thenReturn("/egress/subID");
140         RouteServlet routeServlet = new RouteServlet() {
141             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
142                 return true;
143             }
144         };
145         routeServlet.doDelete(request, response);
146         verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class)));
147     }
148
149     @Test
150     public void Given_Request_Is_HTTP_DELETE_And_Egress_Path_Contains_Invalid_Number_Of_Arguments() throws Exception {
151         when(request.getPathInfo()).thenReturn("/egress/");
152         RouteServlet routeServlet = new RouteServlet() {
153             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
154                 return true;
155             }
156         };
157         routeServlet.doDelete(request, response);
158         verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class)));
159     }
160
161     @Test
162     public void Given_Request_Is_HTTP_DELETE_And_Network_Path_Contains_Invalid_Number_Of_Arguments() throws Exception {
163         when(request.getPathInfo()).thenReturn("/network/");
164         RouteServlet routeServlet = new RouteServlet() {
165             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
166                 return true;
167             }
168         };
169         routeServlet.doDelete(request, response);
170         verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class)));
171     }
172
173     @Test
174     public void Given_Request_Is_HTTP_DELETE_And_Deletable_Is_Null() throws Exception {
175         when(request.getPathInfo()).thenReturn("/route/");
176         RouteServlet routeServlet = new RouteServlet() {
177             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
178                 return true;
179             }
180
181             @Override
182             protected boolean doDelete(Deleteable bean) {
183                 return true;
184             }
185         };
186         routeServlet.doDelete(request, response);
187         verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class)));
188     }
189
190     @Test
191     public void Given_Request_Is_HTTP_DELETE_And_Fails() throws Exception {
192         when(request.getPathInfo()).thenReturn("/network/subID/route");
193         PowerMockito.mockStatic(NodeClass.class);
194         PowerMockito.when(NodeClass.normalizeNodename(anyString())).thenReturn("stub_val");
195         RouteServlet routeServlet = new RouteServlet() {
196             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
197                 return true;
198             }
199
200             @Override
201             protected boolean doDelete(Deleteable bean) {
202                 return false;
203             }
204         };
205         routeServlet.doDelete(request, response);
206         verify(response).sendError(eq(HttpServletResponse.SC_INTERNAL_SERVER_ERROR), argThat(notNullValue(String.class)));
207     }
208
209     @Test
210     public void Given_Request_Is_HTTP_GET_And_Is_Not_Authorized() throws Exception {
211         FieldUtils.writeDeclaredStaticField(BaseServlet.class, "isAddressAuthEnabled", "true", true);
212         routeServlet.doGet(request, response);
213         verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class)));
214     }
215
216     @Test
217     public void Given_Request_Is_HTTP_GET_And_Path_Does_Not_Start_With_Valid_Route() throws Exception {
218         when(request.getPathInfo()).thenReturn("/route/");
219         RouteServlet routeServlet = new RouteServlet() {
220             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
221                 return true;
222             }
223         };
224         routeServlet.doGet(request, response);
225         verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class)));
226     }
227
228
229     @Test
230     public void Given_Request_Is_HTTP_GET_And_Path_Equals_Ingress_And_Get_Succeeds() throws Exception {
231         when(request.getPathInfo()).thenReturn("/ingress/");
232         when(request.getRemoteAddr()).thenReturn("stub_addr");
233         ServletOutputStream outStream = mock(ServletOutputStream.class);
234         when(response.getOutputStream()).thenReturn(outStream);
235         RouteServlet routeServlet = new RouteServlet() {
236             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
237                 return true;
238             }
239         };
240         routeServlet.doGet(request, response);
241         verify(response).setStatus(eq(HttpServletResponse.SC_OK));
242     }
243
244     @Test
245     public void Given_Request_Is_HTTP_GET_And_Path_Equals_Egress_And_Get_Succeeds() throws Exception {
246         when(request.getPathInfo()).thenReturn("/egress/");
247         when(request.getRemoteAddr()).thenReturn("stub_addr");
248         ServletOutputStream outStream = mock(ServletOutputStream.class);
249         when(response.getOutputStream()).thenReturn(outStream);
250         RouteServlet routeServlet = new RouteServlet() {
251             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
252                 return true;
253             }
254         };
255         routeServlet.doGet(request, response);
256         verify(response).setStatus(eq(HttpServletResponse.SC_OK));
257     }
258
259     @Test
260     public void Given_Request_Is_HTTP_GET_And_Ingress_Path_Equals_Network_And_Get_Succeeds() throws Exception {
261         when(request.getPathInfo()).thenReturn("/network/");
262         when(request.getRemoteAddr()).thenReturn("stub_addr");
263         ServletOutputStream outStream = mock(ServletOutputStream.class);
264         when(response.getOutputStream()).thenReturn(outStream);
265         RouteServlet routeServlet = new RouteServlet() {
266             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
267                 return true;
268             }
269         };
270         routeServlet.doGet(request, response);
271         verify(response).setStatus(eq(HttpServletResponse.SC_OK));
272     }
273
274     @Test
275     public void Given_Request_Is_HTTP_PUT_And_Is_Not_Authorized() throws Exception {
276         FieldUtils.writeDeclaredStaticField(BaseServlet.class, "isAddressAuthEnabled", "true", true);
277         routeServlet.doPut(request, response);
278         verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class)));
279     }
280
281     @Test
282     public void Given_Request_Is_HTTP_PUT_And_Contains_Bad_URL() throws Exception {
283         RouteServlet routeServlet = new RouteServlet() {
284             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
285                 return true;
286             }
287         };
288         routeServlet.doPut(request, response);
289         verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class)));
290     }
291
292
293     @Test
294     public void Given_Request_Is_HTTP_POST_And_Is_Not_Authorized() throws Exception {
295         FieldUtils.writeDeclaredStaticField(BaseServlet.class, "isAddressAuthEnabled", "true", true);
296         routeServlet.doPost(request, response);
297         verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class)));
298     }
299
300     @Test
301     public void Given_Request_Is_HTTP_POST_And_Ingress_Path_Starts_With_Ingress_And_Contains_Invalid_Arguments() throws Exception {
302         when(request.getPathInfo()).thenReturn("/ingress/");
303         when(request.getRemoteAddr()).thenReturn("stub_addr");
304         when(request.getParameter("feed")).thenReturn("3");
305         when(request.getParameter("user")).thenReturn(null);
306         when(request.getParameter("subnet")).thenReturn(null);
307         when(request.getParameter("nodepatt")).thenReturn(null);
308         when(request.getParameter("seq")).thenReturn(null);
309         RouteServlet routeServlet = new RouteServlet() {
310             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
311                 return true;
312             }
313         };
314         routeServlet.doPost(request, response);
315         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
316     }
317
318     @Test
319     public void Given_Request_Is_HTTP_POST_And_Path_Starts_With_Egress_And_EgressRoute_Already_Exists() throws Exception {
320         when(request.getPathInfo()).thenReturn("/egress/");
321         when(request.getRemoteAddr()).thenReturn("stub_addr");
322         when(request.getParameter("sub")).thenReturn("3");
323         EgressRoute e = mock(EgressRoute.class);
324         PowerMockito.when(EgressRoute.getEgressRoute(anyInt())).thenReturn(e);
325         RouteServlet routeServlet = new RouteServlet() {
326             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
327                 return true;
328             }
329         };
330         routeServlet.doPost(request, response);
331         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
332     }
333
334     @Test
335     public void Given_Request_Is_HTTP_POST_And_Path_Starts_With_Egress_And_Contains_Invalid_Arguments() throws Exception {
336         when(request.getPathInfo()).thenReturn("/egress/");
337         when(request.getRemoteAddr()).thenReturn("stub_addr");
338         when(request.getParameter("sub")).thenReturn("3");
339         RouteServlet routeServlet = new RouteServlet() {
340             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
341                 return true;
342             }
343         };
344         routeServlet.doPost(request, response);
345         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
346     }
347
348     @Test
349     public void Given_Request_Is_HTTP_POST_And_Path_Starts_With_Network_And_Is_Missing_Arguments() throws Exception {
350         when(request.getPathInfo()).thenReturn("/network/");
351         when(request.getRemoteAddr()).thenReturn("stub_addr");
352         RouteServlet routeServlet = new RouteServlet() {
353             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
354                 return true;
355             }
356         };
357         routeServlet.doPost(request, response);
358         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
359     }
360
361     @Test
362     public void Given_Request_Is_HTTP_POST_And_Path_Starts_With_Network_And_Route_Already_Exists() throws Exception {
363         when(request.getPathInfo()).thenReturn("/network/");
364         when(request.getRemoteAddr()).thenReturn("stub_addr");
365         when(request.getParameter("from")).thenReturn("stub_from");
366         when(request.getParameter("to")).thenReturn("stub_to");
367         when(request.getParameter("via")).thenReturn("stub_via");
368         PowerMockito.mockStatic(NodeClass.class);
369         PowerMockito.when(NodeClass.normalizeNodename(anyString())).thenReturn("stub_val");
370         SortedSet<NetworkRoute> networkSet = new TreeSet();
371         networkSet.add(mock(NetworkRoute.class));
372         PowerMockito.when(NetworkRoute.getAllNetworkRoutes()).thenReturn(networkSet);
373         RouteServlet routeServlet = new RouteServlet() {
374             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
375                 return true;
376             }
377         };
378         routeServlet.doPost(request, response);
379         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
380     }
381
382     @Test
383     public void Given_Request_Is_HTTP_POST_And_Path_URL_Is_Null() throws Exception {
384         when(request.getPathInfo()).thenReturn("/route/");
385         when(request.getRemoteAddr()).thenReturn("stub_addr");
386         when(request.getParameter("from")).thenReturn("stub_from");
387         when(request.getParameter("to")).thenReturn("stub_to");
388         when(request.getParameter("via")).thenReturn("stub_via");
389         PowerMockito.mockStatic(NodeClass.class);
390         PowerMockito.when(NodeClass.normalizeNodename(anyString())).thenReturn("stub_val");
391         RouteServlet routeServlet = new RouteServlet() {
392             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
393                 return true;
394             }
395         };
396         routeServlet.doPost(request, response);
397         verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class)));
398     }
399
400     @Test
401     public void Given_Request_Is_HTTP_POST_And_Fails() throws Exception {
402         when(request.getPathInfo()).thenReturn("/network/");
403         when(request.getRemoteAddr()).thenReturn("stub_addr");
404         when(request.getParameter("from")).thenReturn("stub_from");
405         when(request.getParameter("to")).thenReturn("stub_to");
406         when(request.getParameter("via")).thenReturn("stub_via");
407         PowerMockito.mockStatic(NodeClass.class);
408         PowerMockito.when(NodeClass.normalizeNodename(anyString())).thenReturn("stub_val");
409         RouteServlet routeServlet = new RouteServlet() {
410             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
411                 return true;
412             }
413
414             @Override
415             protected boolean doInsert(Insertable bean) {
416                 return false;
417             }
418         };
419         routeServlet.doPost(request, response);
420         verify(response).sendError(eq(HttpServletResponse.SC_INTERNAL_SERVER_ERROR), argThat(notNullValue(String.class)));
421     }
422
423     private void setRouteToReturnValid() throws IllegalAccessException {
424         PowerMockito.mockStatic(IngressRoute.class);
425         PowerMockito.when(IngressRoute.getIngressRoute(anyInt(), anyString(), anyString())).thenReturn(null);
426         SortedSet<IngressRoute> ingressSet = new TreeSet();
427         IngressRoute ingressRoute = mock(IngressRoute.class);
428         JSONObject joIngress = mock(JSONObject.class);
429         when(joIngress.toString()).thenReturn("{}");
430         when(ingressRoute.asJSONObject()).thenReturn(joIngress);
431         ingressSet.add(ingressRoute);
432         PowerMockito.when(IngressRoute.getAllIngressRoutes()).thenReturn(ingressSet);
433
434         PowerMockito.mockStatic(EgressRoute.class);
435         PowerMockito.when(EgressRoute.getEgressRoute(anyInt())).thenReturn(null);
436         SortedSet<EgressRoute> egressSet = new TreeSet();
437         EgressRoute egressRoute = mock(EgressRoute.class);
438         JSONObject joEgress = mock(JSONObject.class);
439         when(joEgress.toString()).thenReturn("{}");
440         when(egressRoute.asJSONObject()).thenReturn(joEgress);
441         egressSet.add(egressRoute);
442         PowerMockito.when(EgressRoute.getAllEgressRoutes()).thenReturn(egressSet);
443
444         PowerMockito.mockStatic(NetworkRoute.class);
445         SortedSet<NetworkRoute> networkSet = new TreeSet();
446         PowerMockito.when(NetworkRoute.getAllNetworkRoutes()).thenReturn(networkSet);
447
448     }
449
450     private void setPokerToNotCreateTimersWhenDeleteFeedIsCalled() throws Exception {
451         Poker poker = mock(Poker.class);
452         FieldUtils.writeDeclaredStaticField(Poker.class, "poker", poker, true);
453     }
454 }