Create authentication interface
[music.git] / src / test / java / org / onap / music / unittests / TstRestMusicAdminAPI.java
1 /*
2  * ============LICENSE_START========================================== org.onap.music
3  * =================================================================== Copyright (c) 2017 AT&T
4  * Intellectual Property ===================================================================
5  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
6  * in compliance with the License. You may obtain a copy of the License at
7  * 
8  * http://www.apache.org/licenses/LICENSE-2.0
9  * 
10  * Unless required by applicable law or agreed to in writing, software distributed under the License
11  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12  * or implied. See the License for the specific language governing permissions and limitations under
13  * the License.
14  * 
15  * ============LICENSE_END=============================================
16  * ====================================================================
17  */
18
19 package org.onap.music.unittests;
20
21 import static org.junit.Assert.assertEquals;
22 import static org.junit.Assert.assertFalse;
23 import static org.junit.Assert.assertNotEquals;
24 import static org.junit.Assert.assertNotNull;
25 import static org.junit.Assert.assertTrue;
26
27
28 import java.util.HashMap;
29 import java.util.List;
30 import java.util.Map;
31 import java.util.UUID;
32
33 import javax.servlet.http.HttpServletResponse;
34 import javax.ws.rs.core.MultivaluedMap;
35 import javax.ws.rs.core.Response;
36 import javax.ws.rs.core.UriInfo;
37
38 import org.apache.curator.test.TestingServer;
39 import org.junit.AfterClass;
40 import org.junit.BeforeClass;
41 import org.junit.FixMethodOrder;
42 import org.junit.Ignore;
43 import org.junit.Test;
44 import org.junit.runner.RunWith;
45 import org.junit.runners.MethodSorters;
46 import org.mindrot.jbcrypt.BCrypt;
47 import org.mockito.InjectMocks;
48 import org.mockito.Mock;
49 import org.mockito.Mockito;
50 import org.mockito.MockitoAnnotations;
51 import org.onap.music.authentication.MusicAuthentication;
52 import org.onap.music.conductor.conditionals.JsonConditional;
53 import org.onap.music.conductor.conditionals.RestMusicConditionalAPI;
54 import org.onap.music.datastore.MusicDataStoreHandle;
55 import org.onap.music.datastore.PreparedQueryObject;
56 import org.onap.music.datastore.jsonobjects.JsonDelete;
57 import org.onap.music.datastore.jsonobjects.JsonInsert;
58 import org.onap.music.datastore.jsonobjects.JsonKeySpace;
59 import org.onap.music.datastore.jsonobjects.JsonLeasedLock;
60 import org.onap.music.datastore.jsonobjects.JsonOnboard;
61 import org.onap.music.datastore.jsonobjects.JsonTable;
62 import org.onap.music.main.MusicCore;
63 import org.onap.music.main.MusicUtil;
64 import org.onap.music.rest.RestMusicAdminAPI;
65 import org.onap.music.rest.RestMusicHealthCheckAPI;
66
67 import com.datastax.driver.core.DataType;
68 import com.datastax.driver.core.ResultSet;
69 import com.datastax.driver.core.Row;
70 import com.sun.jersey.core.util.Base64;
71
72 public class TstRestMusicAdminAPI {
73
74     RestMusicAdminAPI admin = new RestMusicAdminAPI();
75     static PreparedQueryObject testObject;
76
77     @Mock
78     HttpServletResponse http;
79
80     @Mock
81     UriInfo info;
82     
83     static String appName = "TestApp";
84     static String userId = "TestUser";
85     static String password = "TestPassword";
86     static String adminName = "username";
87     static String adminPassword = "password";
88     static String adminAuthData = adminName +":"+adminPassword;
89     static String wrongAdminAuthData = adminName+"123"+":"+adminPassword;
90     static String authData = userId+":"+password;
91     static String wrongAuthData = userId+":"+"pass";
92     static String authorization = new String(Base64.encode(authData.getBytes()));
93     static String wrongAuthorization = new String(Base64.encode(wrongAuthData.getBytes()));
94     static String adminAuthorization = new String(Base64.encode(adminAuthData.getBytes()));
95     static String worngAdminAuthorization = new String(Base64.encode(wrongAdminAuthData.getBytes()));
96     
97     static boolean isAAF = false;
98     static UUID uuid = UUID.fromString("abc66ccc-d857-4e90-b1e5-df98a3d40ce6");
99     static String keyspaceName = "testCassa";
100     static String tableName = "employees";
101     static String tableNameConditional = "Conductor";
102     static String xLatestVersion = "X-latestVersion";
103     static String onboardUUID = null;
104     static String lockId = null;
105     static String lockName = "testCassa.employees.sample3";
106
107     @BeforeClass
108     public static void init() throws Exception {
109                 System.out.println("Testing RestMusicAdmin class");
110                 //PowerMockito.mockStatic(MusicAuthentication.class);
111         try {
112                 MusicDataStoreHandle.mDstoreHandle = CassandraCQL.connectToEmbeddedCassandra();
113                         createAdminTable();
114                 } catch (Exception e) {
115                         e.printStackTrace();
116                         throw new Exception("Unable to initialize before TestRestMusicData test class. " + e.getMessage());
117                 }
118     }
119
120     @AfterClass
121     public static void tearDownAfterClass() throws Exception {
122         testObject = new PreparedQueryObject();
123         testObject.appendQueryString("DROP KEYSPACE IF EXISTS " + keyspaceName);
124         MusicCore.eventualPut(testObject);
125     }    
126
127     @Ignore
128     @Test
129     public void test6_onboard() throws Exception {
130         System.out.println("Testing application onboarding");
131                 
132         JsonOnboard jsonOnboard = new JsonOnboard();
133         jsonOnboard.setAppname("TestApp2");
134         jsonOnboard.setIsAAF("false"); jsonOnboard.setUserId("TestUser2");
135         jsonOnboard.setPassword("TestPassword2");
136
137         Response response = admin.onboardAppWithMusic(jsonOnboard,adminAuthorization);
138         System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
139         /*resultMap.containsKey("success"); onboardUUID =
140                         resultMap.get("Generated AID").toString();
141         assertEquals("Your application TestApp2 has been onboarded with MUSIC.",
142                         resultMap.get("Success")); */
143         assertEquals(200, response.getStatus());
144     }
145     
146     @Test
147     public void test6_onboardCantReachAAF() throws Exception {
148         System.out.println("Testing application onboarding without reaching aaf");        
149         JsonOnboard jsonOnboard = new JsonOnboard();
150         jsonOnboard.setAppname("TestApp2");
151         jsonOnboard.setIsAAF("false"); jsonOnboard.setUserId("TestUser2");
152         jsonOnboard.setPassword("TestPassword2");
153
154         Response response = admin.onboardAppWithMusic(jsonOnboard,adminAuthorization);
155         System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
156         //TODO FIX when we can authenticate
157         assertEquals(401, response.getStatus());
158     }
159
160     @Ignore
161         @Test
162     public void test6_onboard_duplicate() throws Exception {
163         JsonOnboard jsonOnboard = new JsonOnboard();
164         jsonOnboard.setAppname("TestApp2");
165         jsonOnboard.setIsAAF("false");
166         jsonOnboard.setUserId("TestUser2");
167         jsonOnboard.setPassword("TestPassword2");
168         Response response = admin.onboardAppWithMusic(jsonOnboard,adminAuthorization);
169         assertEquals(204, response.getStatus());
170     }
171
172     // Missing appname
173         @Ignore
174     @Test
175     public void test6_onboard1() throws Exception {
176         JsonOnboard jsonOnboard = new JsonOnboard();
177         jsonOnboard.setIsAAF("false");
178         jsonOnboard.setUserId("TestUser2");
179         jsonOnboard.setPassword("TestPassword2");
180         Map<String, Object> resultMap = (Map<String, Object>) admin.onboardAppWithMusic(jsonOnboard,adminAuthorization).getEntity();
181 //        assertTrue(resultMap.containsKey("error"));
182         //System.out.println("--->" + resultMap.toString());
183         //assertEquals("Unauthorized: Please check the request parameters. Some of the required values appName(ns), userId, password, isAAF are missing.", resultMap.get("Exception"));
184     }
185
186
187     @Test
188     public void test7_onboardSearch() throws Exception {
189         System.out.println("Testing application onboarding search w/o reaching aaf");        
190         JsonOnboard jsonOnboard = new JsonOnboard();
191         jsonOnboard.setAppname("TestApp2");
192         jsonOnboard.setIsAAF("false");
193         jsonOnboard.setAid(onboardUUID);
194         Response response = admin.getOnboardedInfoSearch(jsonOnboard,adminAuthorization);
195         System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
196         //TODO FIX when we can authenticate
197         assertEquals(401, response.getStatus());
198     }
199
200     // Missing appname
201     @Ignore
202     @Test
203     public void test7_onboardSearch1() throws Exception {
204         JsonOnboard jsonOnboard = new JsonOnboard();
205         jsonOnboard.setIsAAF("false");
206         jsonOnboard.setAid(onboardUUID);
207         Map<String, Object> resultMap = (Map<String, Object>) admin.getOnboardedInfoSearch(jsonOnboard,adminAuthorization).getEntity();
208         System.out.println("--->" + resultMap.toString());
209         resultMap.containsKey("success");
210         assertEquals(null, resultMap.get(onboardUUID));
211     }
212     
213     @Ignore
214     @Test
215     public void test7_onboardSearch_empty() throws Exception {
216         JsonOnboard jsonOnboard = new JsonOnboard();
217         Response response =  admin.getOnboardedInfoSearch(jsonOnboard,adminAuthorization);
218       //  assertEquals(400, response.getStatus());
219     }
220
221     @Ignore
222     @Test
223     public void test7_onboardSearch_invalidAid() throws Exception {
224         JsonOnboard jsonOnboard = new JsonOnboard();
225         jsonOnboard.setAppname("TestApp2");
226         jsonOnboard.setIsAAF("false");
227         jsonOnboard.setAid("abc66ccc-d857-4e90-b1e5-df98a3d40ce6");
228         Response response = admin.getOnboardedInfoSearch(jsonOnboard,adminAuthorization);
229        // assertEquals(400, response.getStatus());
230     }
231
232     @Ignore
233     @Test
234     public void test8_onboardUpdate() throws Exception {
235         JsonOnboard jsonOnboard = new JsonOnboard();
236         jsonOnboard.setIsAAF("false");
237         jsonOnboard.setUserId("TestUser3");
238         jsonOnboard.setPassword("TestPassword3");
239         jsonOnboard.setAid(onboardUUID);
240         Map<String, Object> resultMap = (Map<String, Object>) admin.updateOnboardApp(jsonOnboard,adminAuthorization).getEntity();
241         System.out.println("--->" + resultMap.toString());
242         resultMap.containsKey("success");
243         assertNotNull(resultMap);
244     }
245     
246     @Test
247     public void test8_onboardUpdateNoAAF() throws Exception {
248         System.out.println("Testing update application onboarding search w/o reaching aaf");
249         JsonOnboard jsonOnboard = new JsonOnboard();
250         jsonOnboard.setIsAAF("false");
251         jsonOnboard.setUserId("TestUser3");
252         jsonOnboard.setPassword("TestPassword3");
253         jsonOnboard.setAid(onboardUUID);
254         Response response = admin.updateOnboardApp(jsonOnboard,adminAuthorization);
255         
256         System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
257         assertEquals(401, response.getStatus());
258     }
259
260     // Aid null
261     @Ignore
262     @Test
263     public void test8_onboardUpdate1() throws Exception {
264         JsonOnboard jsonOnboard = new JsonOnboard();
265         jsonOnboard.setIsAAF("false");
266         jsonOnboard.setUserId("TestUser3");
267         jsonOnboard.setPassword("TestPassword3");
268         Map<String, Object> resultMap = (Map<String, Object>) admin.updateOnboardApp(jsonOnboard,adminAuthorization).getEntity();
269         System.out.println("--->" + resultMap.toString());
270         assertNotNull(resultMap);
271     }
272
273     // Appname not null
274     @Ignore
275     @Test
276     public void test8_onboardUpdate2() throws Exception {
277         JsonOnboard jsonOnboard = new JsonOnboard();
278         jsonOnboard.setAppname("TestApp2");
279         jsonOnboard.setIsAAF("false");
280         jsonOnboard.setUserId("TestUser3");
281         jsonOnboard.setPassword("TestPassword3");
282         jsonOnboard.setAid(onboardUUID);
283         Map<String, Object> resultMap = (Map<String, Object>) admin.updateOnboardApp(jsonOnboard,adminAuthorization).getEntity();
284         assertNotNull(resultMap);
285     }
286
287     // All null
288     @Ignore
289     @Test
290     public void test8_onboardUpdate3() throws Exception {
291         JsonOnboard jsonOnboard = new JsonOnboard();
292         jsonOnboard.setAid(onboardUUID);
293         Map<String, Object> resultMap = (Map<String, Object>) admin.updateOnboardApp(jsonOnboard,adminAuthorization).getEntity();
294         assertNotNull(resultMap);
295     }
296
297     @Ignore
298     @Test
299     public void test9_onboardDelete() throws Exception {
300         JsonOnboard jsonOnboard = new JsonOnboard();
301         jsonOnboard.setAppname("TestApp2");
302         jsonOnboard.setAid(onboardUUID);
303         Map<String, Object> resultMap = (Map<String, Object>) admin.deleteOnboardApp(jsonOnboard,adminAuthorization).getEntity();
304         resultMap.containsKey("success");
305         assertNotNull(resultMap);
306     }
307     
308     @Test
309     public void test9_onboardDeleteNoAAF() throws Exception {
310         System.out.println("Testing onboard delete without aaf");
311         JsonOnboard jsonOnboard = new JsonOnboard();
312         jsonOnboard.setAppname("TestApp2");
313         jsonOnboard.setAid(onboardUUID);
314         Response response = admin.deleteOnboardApp(jsonOnboard,adminAuthorization);
315         
316         System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
317         assertEquals(401, response.getStatus());
318     }
319
320     @Ignore
321     @Test
322     public void test9_onboardDelete1() throws Exception {
323         JsonOnboard jsonOnboard = new JsonOnboard();
324         Map<String, Object> resultMap = (Map<String, Object>) admin.deleteOnboardApp(jsonOnboard,adminAuthorization).getEntity();
325         assertNotNull(resultMap);
326     }
327     
328     
329     private static void createAdminTable() throws Exception {
330                 testObject = new PreparedQueryObject();
331                 testObject.appendQueryString(CassandraCQL.createAdminKeyspace);
332                 MusicCore.eventualPut(testObject);
333                 testObject = new PreparedQueryObject();
334                 testObject.appendQueryString(CassandraCQL.createAdminTable);
335                 MusicCore.eventualPut(testObject);
336
337                 testObject = new PreparedQueryObject();
338                 testObject.appendQueryString(
339                                 "INSERT INTO admin.keyspace_master (uuid, keyspace_name, application_name, is_api, "
340                                                 + "password, username, is_aaf) VALUES (?,?,?,?,?,?,?)");
341                 testObject.addValue(MusicUtil.convertToActualDataType(DataType.uuid(), uuid));
342                 testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(),
343                                 MusicUtil.DEFAULTKEYSPACENAME));
344                 testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), appName));
345                 testObject.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), "True"));
346                 testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), BCrypt.hashpw(password, BCrypt.gensalt())));
347                 testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), userId));
348                 testObject.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), isAAF));
349                 MusicCore.eventualPut(testObject);
350
351                 testObject = new PreparedQueryObject();
352                 testObject.appendQueryString(
353                                 "select uuid from admin.keyspace_master where application_name = ? allow filtering");
354                 testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), appName));
355                 ResultSet rs = MusicCore.get(testObject);
356                 List<Row> rows = rs.all();
357                 if (rows.size() > 0) {
358                         System.out.println("#######UUID is:" + rows.get(0).getUUID("uuid"));
359                 }
360         }
361    
362 }