Initial OpenECOMP policy/engine commit
[policy/engine.git] / ECOMP-PAP-REST / src / test / java / org / openecomp / policy / pap / xacml / rest / XACMLPapServletTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ECOMP-PAP-REST
4  * ================================================================================
5  * Copyright (C) 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
21 package org.openecomp.policy.pap.xacml.rest;
22
23 import static org.junit.Assert.assertTrue;
24 import static org.junit.Assert.fail;
25
26 import java.io.IOException;
27 import java.util.ArrayList;
28 import java.util.Collections;
29 import java.util.List;
30 import java.util.Properties;
31
32 import javax.persistence.EntityManager;
33 import javax.persistence.EntityManagerFactory;
34 import javax.persistence.EntityTransaction;
35 import javax.persistence.Persistence;
36 import javax.servlet.ServletConfig;
37 import javax.servlet.ServletOutputStream;
38 import javax.servlet.http.HttpServletRequest;
39 import javax.servlet.http.HttpServletResponse;
40
41 import junit.framework.TestCase;
42
43 import org.apache.commons.logging.Log;
44 import org.apache.commons.logging.LogFactory;
45
46 import org.junit.Before;
47 import org.junit.Test;
48 import org.mockito.Mockito;
49 import org.openecomp.policy.pap.xacml.rest.XACMLPapServlet;
50 import org.openecomp.policy.rest.XACMLRestProperties;
51 import org.springframework.mock.web.MockHttpServletResponse;
52 import org.springframework.mock.web.MockServletConfig;
53
54 import org.openecomp.policy.common.ia.IntegrityAudit;
55 import org.openecomp.policy.common.logging.flexlogger.FlexLogger; 
56 import org.openecomp.policy.common.logging.flexlogger.Logger; 
57
58 public class XACMLPapServletTest extends TestCase{
59         private static Logger logger    = FlexLogger.getLogger(XACMLPapServletTest.class);
60         
61         private List<String> headers = new ArrayList<String>();
62         
63         private HttpServletRequest httpServletRequest;
64         private HttpServletResponse httpServletResponse;
65         private ServletOutputStream mockOutput;
66         private ServletConfig servletConfig; 
67         private XACMLPapServlet papServlet;
68
69          
70     @Before
71    
72     public void setUp() throws IOException {
73         httpServletRequest = Mockito.mock(HttpServletRequest.class);
74         Mockito.when(httpServletRequest.getMethod()).thenReturn("POST");
75         Mockito.when(httpServletRequest.getParameter("groupId")).thenReturn(null);
76         Mockito.when(httpServletRequest.getHeaderNames()).thenReturn(Collections.enumeration(headers));
77         Mockito.when(httpServletRequest.getAttributeNames()).thenReturn(Collections.enumeration(headers));
78         
79         
80         mockOutput = Mockito.mock(ServletOutputStream.class);
81         
82         //when(httpServletRequest.getPathInfo()).thenReturn("/lineup/world.xml");
83         //HttpServletResponse httpResponse = new HttpServletResponse();
84         httpServletResponse = Mockito.mock(MockHttpServletResponse.class);
85         
86         Mockito.when(httpServletResponse.getOutputStream()).thenReturn(mockOutput);
87
88         
89         //when(httpServletResponse.getOutputStream()).thenReturn(servletOutputStream);
90         servletConfig = Mockito.mock(MockServletConfig.class);
91         //Mockito.when(servletConfig.getInitParameterNames()).thenReturn(Collections.enumeration(headers));
92         //servletConfig
93         Mockito.when(servletConfig.getInitParameterNames()).thenReturn(Collections.enumeration(headers));
94         papServlet = new XACMLPapServlet();
95         
96         Mockito.when(servletConfig.getInitParameter("XACML_PROPERTIES_NAME")).thenReturn("xacml.pap.test.properties");
97         
98                 System.setProperty("xacml.PAP.papEngineFactory", "org.openecomp.policy.xacml.std.pap.StdEngineFactory");
99                 System.setProperty("xacml.pap.pdps", "pdps");
100                 System.setProperty("xacml.rest.pap.url", "http://localhost:8070/pap/");
101                 System.setProperty("xacml.rest.pap.initiate.pdp", "false");
102                 System.setProperty("xacml.rest.pdp.idfile", "testpdp.properties");
103                 System.setProperty("xacml.rest.pep.idfile", "client.properties");
104                 System.setProperty("javax.persistence.jdbc.driver", "org.h2.Driver");
105                 System.setProperty("javax.persistence.jdbc.url", "jdbc:h2:file:./sql/xacmlTest");
106                 System.setProperty("javax.persistence.jdbc.user", "sa");
107                 System.setProperty("javax.persistence.jdbc.password", "");
108                 System.setProperty("xacml.rest.pap.jmx.url", "service:jmx:rmi:///jndi/rmi://localhost:9990/jmxrmi");
109                 System.setProperty("xacml.rest.pap.resource.name", "site_1.pap_1");
110                 System.setProperty("fp_monitor_interval", "30");
111                 System.setProperty("failed_counter_threshold", "3");
112                 System.setProperty("test_trans_interval", "10");
113                 System.setProperty("write_fpc_interval", "5");
114                 System.setProperty("com.sun.management.jmxremote.port", "9999");
115                 System.setProperty("dependency_groups", "site_1.logparser_1;site_1.adminconsole_1;site_1.elk_1");
116                 System.setProperty("site_name", "site_1");
117                 System.setProperty("node_type", "pap"); 
118     }
119         
120     /*
121      * This method initializes and cleans the DB so the XACMLPapServlet will be able to instantiate an
122      * IntegrityAudit object which will use the DB.
123      */
124         public void initializeDb(){
125                 logger.debug("initializeDb: enter");
126         Properties cleanProperties = new Properties();
127         cleanProperties.put(XACMLRestProperties.PROP_PAP_DB_DRIVER,"org.h2.Driver");
128         cleanProperties.put(XACMLRestProperties.PROP_PAP_DB_URL, "jdbc:h2:file:./sql/xacmlTest");
129         cleanProperties.put(XACMLRestProperties.PROP_PAP_DB_USER, "sa");
130         cleanProperties.put(XACMLRestProperties.PROP_PAP_DB_PASSWORD, "");
131         EntityManagerFactory emf = Persistence.createEntityManagerFactory("testPapPU", cleanProperties);
132                 
133                 EntityManager em = emf.createEntityManager();
134                 // Start a transaction
135                 EntityTransaction et = em.getTransaction();
136
137                 et.begin();
138
139                 // Clean up the DB
140                 em.createQuery("Delete from IntegrityAuditEntity").executeUpdate();
141
142                 // commit transaction
143                 et.commit();
144                 em.close();
145                 logger.debug("initializeDb: exit");
146         }
147         
148     @Test
149         public void testInit() throws Exception{
150         System.setProperty("integrity_audit_period_seconds", "0");
151         initializeDb();
152                 try {   
153                         papServlet.init(servletConfig);
154                         IntegrityAudit ia = papServlet.getIa();
155                         if(ia.isThreadInitialized()){
156                                 assertTrue(true);
157                         }else{
158                                 fail();
159                         }
160                         ia.stopAuditThread();
161                         // Allow time for the thread to stop
162                         Thread.sleep(1000);
163                         if(!ia.isThreadInitialized()){
164                                 assertTrue(true);
165                         }else{
166                                 fail();
167                         }
168                 } catch (Exception e) {
169                         // TODO Auto-generated catch block
170                         fail();
171                 }
172         }
173         
174 /*      public void testDoGetPapTest(){
175                 try{
176                         Mockito.when(httpServletRequest.getRequestURI()).thenReturn("/pap/test");
177                         papServlet.init(servletConfig);
178                         IntegrityAudit ia = papServlet.getIa();
179                         ia.stopAuditThread();
180                         papServlet.doGet(httpServletRequest, httpServletResponse);              
181                         logger.info(httpServletResponse.getStatus());
182
183                         //Mockito.verify(httpServletResponse).setStatus(HttpServletResponse.SC_OK);
184                 }catch (Exception e){
185                         logger.info("testDoGetPapTest failed with message: " + e.getMessage());
186                         fail();
187                 }
188                 assertTrue(true);
189         }*/
190
191 /*      
192  * Need to figure a way to get it to match any message string
193  * public void testDoGetPapTestFpcFailure(){
194                 try{
195                         Mockito.when(httpServletRequest.getRequestURI()).thenReturn("/pap/test");
196                         Mockito.when(httpServletRequest.getHeader("THIS-IS-A-TEST")).thenReturn("FPC");
197                         papServlet.init(servletConfig);
198                         IntegrityAudit ia = papServlet.getIa();
199                         ia.stopAuditThread();
200                         papServlet.doGet(httpServletRequest, httpServletResponse);              
201                         Mockito.verify(httpServletResponse).sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, Mockito.anyString());
202                 }catch (Exception e){
203                         logger.info("testDoGetPapTestFpcFailure failed with message: " + e.getMessage());
204                         fail();
205                 }
206                 assertTrue(true);
207         }*/
208         
209         public void testDoGetLocal(){
210                 try{
211                         Mockito.when(httpServletRequest.getRemoteHost()).thenReturn("localhost");
212                         papServlet.init(servletConfig);
213                         IntegrityAudit ia = papServlet.getIa();
214                         ia.stopAuditThread();
215                         papServlet.doGet(httpServletRequest, httpServletResponse);              
216                         
217                         logger.info(httpServletResponse.getStatus());
218                         Mockito.verify(httpServletResponse).setHeader("content-type", "application/json");
219                         Mockito.verify(httpServletResponse).setStatus(HttpServletResponse.SC_OK);
220                 }catch (Exception e){
221                         fail();
222                 }
223
224                 assertTrue(true);
225         }
226         
227         public void testDoGetNonLocal(){
228                 //return non-local host remote address, which is invalid
229                 Mockito.when(httpServletRequest.getRemoteHost()).thenReturn("0.0.0.0"); 
230                 try{
231                         papServlet.init(servletConfig);
232                         IntegrityAudit ia = papServlet.getIa();
233                         ia.stopAuditThread();                   
234                         papServlet.doGet(httpServletRequest, httpServletResponse);              
235                         logger.info(httpServletResponse.getStatus());   
236                         String message = "Unknown PDP:  from 0.0.0.0 us: null";
237                         
238                         Mockito.verify(httpServletResponse).sendError(401, message);
239                         
240                 }catch (Exception e){
241                         fail();
242                 }
243         }
244         
245         public void testDoGetWithGroup() throws Exception{
246                 Mockito.when(httpServletRequest.getParameter("groupId")).thenReturn("default");
247                 //Mockito.when(httpServletRequest.getHeader("X-XACML-PDP-ID")).thenReturn("default");
248                 papServlet.init(servletConfig);
249                 IntegrityAudit ia = papServlet.getIa();
250                 ia.stopAuditThread();           
251                 papServlet.doGet(httpServletRequest, httpServletResponse);
252                 Mockito.verify(httpServletResponse).setStatus(HttpServletResponse.SC_OK);
253         }
254         
255         public void testDoPostWithGroup(){
256                 Mockito.when(httpServletRequest.getParameter("groupId")).thenReturn("default");
257                 Mockito.when(httpServletRequest.getParameter("policyId")).thenReturn("default");
258                 try{
259                         papServlet.init(servletConfig);
260                         IntegrityAudit ia = papServlet.getIa();
261                         ia.stopAuditThread();                   
262                         papServlet.doPost(httpServletRequest, httpServletResponse);
263                         //Mockito.verify(httpServletResponse).sendError(500, "Policy 'default' not copied to group 'default': java.lang.NullPointerException");
264                         //Mockito.verify(httpServletResponse).sendError(500, "Policy 'default' not copied to group 'default': javax.persistence.PersistenceException: Group policy is being added to does not exist with id default");
265                         
266                 }catch (Exception e){
267                         fail();
268                 }
269         }
270         //why is this test trying to send no pdp id and expecting a 200 response?
271         /*
272         public void testDoPost(){
273                 final ByteArrayOutputStream os = new ByteArrayOutputStream ();
274                 ByteArrayOutputStream multiPartResponse = new ByteArrayOutputStream();
275                 Mockito.when(httpServletRequest.getHeader("X-XACML-PDP-JMX-PORT")).thenReturn("0");
276                 
277                 try{
278                         multiPartResponse.writeTo(os);
279                         final ByteArrayInputStream is = new ByteArrayInputStream (os.toByteArray ());
280                         Mockito.when(httpServletRequest.getInputStream()).thenReturn(new ServletInputStream() {
281                         @Override
282                         public int read() throws IOException {
283                             return is.read();
284                         }
285                     });
286                         
287                         papServlet.init(servletConfig);
288                         IntegrityAudit ia = papServlet.getIa();
289                         ia.stopAuditThread();                   
290                         papServlet.doPost(httpServletRequest, httpServletResponse);
291                         Mockito.verify(httpServletResponse).setStatus(HttpServletResponse.SC_OK);
292                 }catch (Exception e){
293                         fail();
294                 }
295         }       
296         */
297                 
298         public void testDoPostPDPId(){
299                 String groupId = "newPDP";
300                 Mockito.when(httpServletRequest.getParameter("groupId")).thenReturn(groupId);           
301                 Mockito.when(httpServletRequest.getHeader("X-XACML-PDP-ID")).thenReturn(groupId);
302                 try{
303                         papServlet.init(servletConfig);
304                         IntegrityAudit ia = papServlet.getIa();
305                         ia.stopAuditThread();                   
306                         papServlet.doPut(httpServletRequest, httpServletResponse);
307                         Mockito.verify(httpServletResponse).sendError(HttpServletResponse.SC_NOT_FOUND, "Unknown groupId '" + groupId +"'");
308                 }catch(Exception e){
309                         fail();
310                 }
311         }
312         
313         public void testDoPutInvalidAdminConsoleURL(){
314                 Mockito.when(httpServletRequest.getParameter("adminConsoleURL")).thenReturn("wwww.adminConsole.com");
315                 //204
316                 try{
317                         papServlet.init(servletConfig);
318                         IntegrityAudit ia = papServlet.getIa();
319                         ia.stopAuditThread();                   
320                         papServlet.doPut(httpServletRequest,  httpServletResponse);
321                         Mockito.verify(httpServletResponse).setStatus(HttpServletResponse.SC_NO_CONTENT);
322                 }catch (Exception e){
323                         fail();
324                 }
325         }
326         
327         public void testDoPutWithGroupIdAndUnimplimentedPipId(){
328                 Mockito.when(httpServletRequest.getParameter("groupId")).thenReturn("default");
329                 Mockito.when(httpServletRequest.getParameter("pipId")).thenReturn("default");
330                 try{
331                         papServlet.init(servletConfig);
332                         IntegrityAudit ia = papServlet.getIa();
333                         ia.stopAuditThread();                   
334                         papServlet.doPut(httpServletRequest,  httpServletResponse);
335                         Mockito.verify(httpServletResponse).sendError(HttpServletResponse.SC_BAD_REQUEST, "UNIMPLEMENTED");
336                 }catch (Exception e){
337                         fail();
338                 }
339         }       
340         
341         public void testDoDeleteNoGroup(){
342                 Mockito.when(httpServletRequest.getParameter("groupdId")).thenReturn(null);
343                 
344                 try{
345                         papServlet.init(servletConfig);
346                         IntegrityAudit ia = papServlet.getIa();
347                         ia.stopAuditThread();                   
348                         papServlet.doDelete(httpServletRequest, httpServletResponse);
349                         Mockito.verify(httpServletResponse).sendError(HttpServletResponse.SC_BAD_REQUEST, "Request does not have groupId");
350                 }catch (Exception e){
351                         fail();                 
352                 }
353         }
354         
355         public void testDoDeleteWithDefaultGroup(){
356                 Mockito.when(httpServletRequest.getParameter("groupId")).thenReturn("default");
357                 
358                 try{
359                         papServlet.init(servletConfig);
360                         IntegrityAudit ia = papServlet.getIa();
361                         ia.stopAuditThread();                   
362                         papServlet.doDelete(httpServletRequest, httpServletResponse);
363                         Mockito.verify(httpServletResponse).sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,"You cannot delete the default group.");
364                 }catch(Exception e){
365                         fail();
366                 }
367         }
368 }