preliminary AAF changes for DR
[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         routeServlet.doPut(request, response);
277         verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class)));
278     }
279
280     @Test
281     public void Given_Request_Is_HTTP_PUT_And_Contains_Bad_URL() throws Exception {
282         RouteServlet routeServlet = new RouteServlet() {
283             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
284                 return true;
285             }
286         };
287         routeServlet.doPut(request, response);
288         verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class)));
289     }
290
291
292     @Test
293     public void Given_Request_Is_HTTP_POST_And_Is_Not_Authorized() throws Exception {
294         routeServlet.doPost(request, response);
295         FieldUtils.writeDeclaredStaticField(BaseServlet.class, "isAddressAuthEnabled", "true", true);
296         verify(response).sendError(eq(HttpServletResponse.SC_FORBIDDEN), argThat(notNullValue(String.class)));
297     }
298
299     @Test
300     public void Given_Request_Is_HTTP_POST_And_Ingress_Path_Starts_With_Ingress_And_Contains_Invalid_Arguments() throws Exception {
301         when(request.getPathInfo()).thenReturn("/ingress/");
302         when(request.getRemoteAddr()).thenReturn("stub_addr");
303         when(request.getParameter("feed")).thenReturn("3");
304         when(request.getParameter("user")).thenReturn(null);
305         when(request.getParameter("subnet")).thenReturn(null);
306         when(request.getParameter("nodepatt")).thenReturn(null);
307         when(request.getParameter("seq")).thenReturn(null);
308         RouteServlet routeServlet = new RouteServlet() {
309             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
310                 return true;
311             }
312         };
313         routeServlet.doPost(request, response);
314         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
315     }
316
317     @Test
318     public void Given_Request_Is_HTTP_POST_And_Path_Starts_With_Egress_And_EgressRoute_Already_Exists() throws Exception {
319         when(request.getPathInfo()).thenReturn("/egress/");
320         when(request.getRemoteAddr()).thenReturn("stub_addr");
321         when(request.getParameter("sub")).thenReturn("3");
322         EgressRoute e = mock(EgressRoute.class);
323         PowerMockito.when(EgressRoute.getEgressRoute(anyInt())).thenReturn(e);
324         RouteServlet routeServlet = new RouteServlet() {
325             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
326                 return true;
327             }
328         };
329         routeServlet.doPost(request, response);
330         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
331     }
332
333     @Test
334     public void Given_Request_Is_HTTP_POST_And_Path_Starts_With_Egress_And_Contains_Invalid_Arguments() throws Exception {
335         when(request.getPathInfo()).thenReturn("/egress/");
336         when(request.getRemoteAddr()).thenReturn("stub_addr");
337         when(request.getParameter("sub")).thenReturn("3");
338         RouteServlet routeServlet = new RouteServlet() {
339             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
340                 return true;
341             }
342         };
343         routeServlet.doPost(request, response);
344         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
345     }
346
347     @Test
348     public void Given_Request_Is_HTTP_POST_And_Path_Starts_With_Network_And_Is_Missing_Arguments() throws Exception {
349         when(request.getPathInfo()).thenReturn("/network/");
350         when(request.getRemoteAddr()).thenReturn("stub_addr");
351         RouteServlet routeServlet = new RouteServlet() {
352             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
353                 return true;
354             }
355         };
356         routeServlet.doPost(request, response);
357         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
358     }
359
360     @Test
361     public void Given_Request_Is_HTTP_POST_And_Path_Starts_With_Network_And_Route_Already_Exists() throws Exception {
362         when(request.getPathInfo()).thenReturn("/network/");
363         when(request.getRemoteAddr()).thenReturn("stub_addr");
364         when(request.getParameter("from")).thenReturn("stub_from");
365         when(request.getParameter("to")).thenReturn("stub_to");
366         when(request.getParameter("via")).thenReturn("stub_via");
367         PowerMockito.mockStatic(NodeClass.class);
368         PowerMockito.when(NodeClass.normalizeNodename(anyString())).thenReturn("stub_val");
369         SortedSet<NetworkRoute> networkSet = new TreeSet();
370         networkSet.add(mock(NetworkRoute.class));
371         PowerMockito.when(NetworkRoute.getAllNetworkRoutes()).thenReturn(networkSet);
372         RouteServlet routeServlet = new RouteServlet() {
373             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
374                 return true;
375             }
376         };
377         routeServlet.doPost(request, response);
378         verify(response).sendError(eq(HttpServletResponse.SC_BAD_REQUEST), argThat(notNullValue(String.class)));
379     }
380
381     @Test
382     public void Given_Request_Is_HTTP_POST_And_Path_URL_Is_Null() throws Exception {
383         when(request.getPathInfo()).thenReturn("/route/");
384         when(request.getRemoteAddr()).thenReturn("stub_addr");
385         when(request.getParameter("from")).thenReturn("stub_from");
386         when(request.getParameter("to")).thenReturn("stub_to");
387         when(request.getParameter("via")).thenReturn("stub_via");
388         PowerMockito.mockStatic(NodeClass.class);
389         PowerMockito.when(NodeClass.normalizeNodename(anyString())).thenReturn("stub_val");
390         RouteServlet routeServlet = new RouteServlet() {
391             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
392                 return true;
393             }
394         };
395         routeServlet.doPost(request, response);
396         verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), argThat(notNullValue(String.class)));
397     }
398
399     @Test
400     public void Given_Request_Is_HTTP_POST_And_Fails() throws Exception {
401         when(request.getPathInfo()).thenReturn("/network/");
402         when(request.getRemoteAddr()).thenReturn("stub_addr");
403         when(request.getParameter("from")).thenReturn("stub_from");
404         when(request.getParameter("to")).thenReturn("stub_to");
405         when(request.getParameter("via")).thenReturn("stub_via");
406         PowerMockito.mockStatic(NodeClass.class);
407         PowerMockito.when(NodeClass.normalizeNodename(anyString())).thenReturn("stub_val");
408         RouteServlet routeServlet = new RouteServlet() {
409             protected boolean isAuthorizedForInternal(HttpServletRequest req) {
410                 return true;
411             }
412
413             @Override
414             protected boolean doInsert(Insertable bean) {
415                 return false;
416             }
417         };
418         routeServlet.doPost(request, response);
419         verify(response).sendError(eq(HttpServletResponse.SC_INTERNAL_SERVER_ERROR), argThat(notNullValue(String.class)));
420     }
421
422     private void setRouteToReturnValid() throws IllegalAccessException {
423         PowerMockito.mockStatic(IngressRoute.class);
424         PowerMockito.when(IngressRoute.getIngressRoute(anyInt(), anyString(), anyString())).thenReturn(null);
425         SortedSet<IngressRoute> ingressSet = new TreeSet();
426         IngressRoute ingressRoute = mock(IngressRoute.class);
427         JSONObject joIngress = mock(JSONObject.class);
428         when(joIngress.toString()).thenReturn("{}");
429         when(ingressRoute.asJSONObject()).thenReturn(joIngress);
430         ingressSet.add(ingressRoute);
431         PowerMockito.when(IngressRoute.getAllIngressRoutes()).thenReturn(ingressSet);
432
433         PowerMockito.mockStatic(EgressRoute.class);
434         PowerMockito.when(EgressRoute.getEgressRoute(anyInt())).thenReturn(null);
435         SortedSet<EgressRoute> egressSet = new TreeSet();
436         EgressRoute egressRoute = mock(EgressRoute.class);
437         JSONObject joEgress = mock(JSONObject.class);
438         when(joEgress.toString()).thenReturn("{}");
439         when(egressRoute.asJSONObject()).thenReturn(joEgress);
440         egressSet.add(egressRoute);
441         PowerMockito.when(EgressRoute.getAllEgressRoutes()).thenReturn(egressSet);
442
443         PowerMockito.mockStatic(NetworkRoute.class);
444         SortedSet<NetworkRoute> networkSet = new TreeSet();
445         PowerMockito.when(NetworkRoute.getAllNetworkRoutes()).thenReturn(networkSet);
446
447     }
448
449     private void setPokerToNotCreateTimersWhenDeleteFeedIsCalled() throws Exception {
450         Poker poker = mock(Poker.class);
451         FieldUtils.writeDeclaredStaticField(Poker.class, "poker", poker, true);
452     }
453 }