0d4f4f14370fd3f299adcdec0af442ba8b707dbc
[aai/aai-common.git] / aai-core / src / test / java / org / onap / aai / rest / db / HttpEntryTest.java
1 /**
2  * ============LICENSE_START=======================================================
3  * org.onap.aai
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 package org.onap.aai.rest.db;
23
24 import org.javatuples.Pair;
25 import org.junit.Before;
26 import org.junit.FixMethodOrder;
27 import org.junit.runners.MethodSorters;
28 import org.junit.Test;
29 import org.mockito.Mockito;
30 import org.onap.aai.AAISetup;
31 import org.onap.aai.dbmap.DBConnectionType;
32 import org.onap.aai.domain.yang.Pserver;
33 import org.onap.aai.domain.yang.Pservers;
34 import org.onap.aai.exceptions.AAIException;
35 import org.onap.aai.introspection.*;
36 import org.onap.aai.parsers.query.QueryParser;
37 import org.onap.aai.restcore.HttpMethod;
38 import org.onap.aai.serialization.engines.QueryStyle;
39 import org.onap.aai.serialization.engines.TransactionalGraphEngine;
40
41 import javax.ws.rs.core.*;
42
43 import java.io.BufferedReader;
44 import java.io.InputStream;
45 import java.io.InputStreamReader;
46 import java.io.UnsupportedEncodingException;
47 import java.net.URI;
48 import java.util.*;
49 import java.util.stream.Collectors;
50
51 import com.google.gson.JsonObject;
52 import com.google.gson.JsonParser;
53
54 import static org.junit.Assert.assertEquals;
55 import static org.junit.Assert.assertTrue;
56 import static org.mockito.Matchers.anyObject;
57 import static org.mockito.Mockito.when;
58
59 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
60 public class HttpEntryTest extends AAISetup {
61
62     protected static final MediaType APPLICATION_JSON = MediaType.valueOf("application/json");
63
64     private static final Set<Integer> VALID_HTTP_STATUS_CODES = new HashSet<>();
65
66     static {
67         VALID_HTTP_STATUS_CODES.add(200);
68         VALID_HTTP_STATUS_CODES.add(201);
69         VALID_HTTP_STATUS_CODES.add(204);
70     }
71
72     private HttpHeaders httpHeaders;
73
74     private UriInfo uriInfo;
75
76     private MultivaluedMap<String, String> headersMultiMap;
77     private MultivaluedMap<String, String> queryParameters;
78
79     private List<String> aaiRequestContextList;
80
81     private List<MediaType> outputMediaTypes;
82
83     @Before
84     public void setup(){
85
86         httpHeaders         = Mockito.mock(HttpHeaders.class);
87         uriInfo             = Mockito.mock(UriInfo.class);
88
89         headersMultiMap     = new MultivaluedHashMap<>();
90         queryParameters     = Mockito.spy(new MultivaluedHashMap<>());
91
92         headersMultiMap.add("X-FromAppId", "JUNIT");
93         headersMultiMap.add("X-TransactionId", UUID.randomUUID().toString());
94         headersMultiMap.add("Real-Time", "true");
95         headersMultiMap.add("Accept", "application/json");
96         headersMultiMap.add("aai-request-context", "");
97
98         outputMediaTypes = new ArrayList<>();
99         outputMediaTypes.add(APPLICATION_JSON);
100
101         aaiRequestContextList = new ArrayList<>();
102         aaiRequestContextList.add("");
103
104         when(httpHeaders.getAcceptableMediaTypes()).thenReturn(outputMediaTypes);
105         when(httpHeaders.getRequestHeaders()).thenReturn(headersMultiMap);
106
107         when(httpHeaders.getRequestHeader("aai-request-context")).thenReturn(aaiRequestContextList);
108
109
110         when(uriInfo.getQueryParameters()).thenReturn(queryParameters);
111         when(uriInfo.getQueryParameters(false)).thenReturn(queryParameters);
112
113         // TODO - Check if this is valid since RemoveDME2QueryParameters seems to be very unreasonable
114         Mockito.doReturn(null).when(queryParameters).remove(anyObject());
115
116         when(httpHeaders.getMediaType()).thenReturn(APPLICATION_JSON);
117     }
118
119     private Response getResponse(HttpEntry httpEntry, Loader loader, TransactionalGraphEngine dbEngine, HttpMethod method, String uri, String content) throws UnsupportedEncodingException, AAIException {
120         URI uriObject = UriBuilder.fromPath(uri).build();
121         QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(uriObject);
122         String objType = uriQuery.getResultType();
123         if (uri.endsWith("relationship")) {
124             objType = "relationship";
125         }
126         Introspector obj = null;
127         if (method.equals(HttpMethod.GET)) {
128             obj = loader.introspectorFromName(objType);
129         } else {
130             obj = loader.unmarshal(objType, content, org.onap.aai.restcore.MediaType.getEnum("application/json"));
131         }
132
133         DBRequest dbRequest =
134                 new DBRequest.Builder(method, uriObject, uriQuery, obj, httpHeaders, uriInfo, "JUNIT-TRANSACTION")
135                         .rawRequestContent(content).build();
136
137         List<DBRequest> dbRequestList = new ArrayList<>();
138         dbRequestList.add(dbRequest);
139
140         Pair<Boolean, List<Pair<URI, Response>>> responsesTuple  = httpEntry.process(dbRequestList, "JUNIT");
141         return responsesTuple.getValue1().get(0).getValue1();
142     }
143
144     
145     @Test
146     public void test1PutOnPserver() throws UnsupportedEncodingException, AAIException {
147
148         DBConnectionType type = DBConnectionType.REALTIME;
149         HttpEntry httpEntry = new HttpEntry(Version.getLatest(), ModelType.MOXY, QueryStyle.TRAVERSAL, type);
150         Loader loader = httpEntry.getLoader();
151         TransactionalGraphEngine dbEngine = httpEntry.getDbEngine();
152
153         String uri = "/cloud-infrastructure/pservers/pserver/junit-test1";
154         String content = "{\"hostname\":\"junit-test1\"}";
155         Response response = getResponse(httpEntry, loader, dbEngine, HttpMethod.PUT, uri, content);
156         dbEngine.commit();
157         assertEquals("Expected the pserver to be created", 201, response.getStatus());
158     }
159
160     @Test
161     public void test2PutOnPserverNoPInterface() throws UnsupportedEncodingException, AAIException {
162
163         DBConnectionType type = DBConnectionType.REALTIME;
164         HttpEntry httpEntry = new HttpEntry(Version.getLatest(), ModelType.MOXY, QueryStyle.TRAVERSAL, type);
165         Loader loader = httpEntry.getLoader();
166         TransactionalGraphEngine dbEngine = httpEntry.getDbEngine();
167
168         String uri = "/cloud-infrastructure/pservers/pserver/junit-test2";
169         String content = "{\"hostname\":\"junit-test2\"}";
170         Response response = getResponse(httpEntry, loader, dbEngine, HttpMethod.PUT, uri, content);
171         dbEngine.commit();
172         assertEquals("Expected the pserver to be created", 201, response.getStatus());
173     }
174
175     @Test
176     public void test3PutOnPInterface()  {
177         try {
178         DBConnectionType type = DBConnectionType.REALTIME;
179         HttpEntry httpEntry = new HttpEntry(Version.getLatest(), ModelType.MOXY, QueryStyle.TRAVERSAL, type);
180         Loader loader = httpEntry.getLoader();
181         TransactionalGraphEngine dbEngine = httpEntry.getDbEngine();
182
183         String uri = "/cloud-infrastructure/pservers/pserver/junit-test1/p-interfaces/p-interface/p1";
184         String content = "{\"interface-name\":\"p1\"}";
185         Response response = getResponse(httpEntry, loader, dbEngine, HttpMethod.PUT, uri, content);
186         dbEngine.commit();
187         assertEquals("Expected the p-interface to be created", 201, response.getStatus());
188         } catch (UnsupportedEncodingException | AAIException e) {
189                         // TODO Auto-generated catch block
190                         e.printStackTrace();
191                 }
192     }
193
194
195
196     @Test
197     public void test4GetOnPserver() throws UnsupportedEncodingException, AAIException {
198
199         DBConnectionType type = DBConnectionType.REALTIME;
200         HttpEntry httpEntry = new HttpEntry(Version.getLatest(), ModelType.MOXY, QueryStyle.TRAVERSAL, type);
201         Loader loader = httpEntry.getLoader();
202         TransactionalGraphEngine dbEngine = httpEntry.getDbEngine();
203
204         URI uriObject = UriBuilder.fromPath("/cloud-infrastructure/pservers/pserver/junit-test1").build();
205
206         String uri = "/cloud-infrastructure/pservers/pserver/junit-test1";
207         String content = "{\"hostname\":\"junit-test1\", \"equip-type\":\"junit-equip-type\"}";
208         Response response = getResponse(httpEntry, loader, dbEngine, HttpMethod.GET, uri, content);
209         dbEngine.commit();
210         assertEquals("Expected the pserver to be returned", 200, response.getStatus());
211     }
212   
213     @Test
214     public void test5MergePatchOnPserver() throws UnsupportedEncodingException, AAIException {
215
216         DBConnectionType type = DBConnectionType.REALTIME;
217         HttpEntry httpEntry = new HttpEntry(Version.getLatest(), ModelType.MOXY, QueryStyle.TRAVERSAL, type);
218         Loader loader = httpEntry.getLoader();
219         TransactionalGraphEngine dbEngine = httpEntry.getDbEngine();
220
221         String uri = "/cloud-infrastructure/pservers/pserver/junit-test1";
222         String content = "{\"hostname\":\"junit-test1\", \"equip-type\":\"junit-equip-type\"}";
223         Response response = getResponse(httpEntry, loader, dbEngine, HttpMethod.MERGE_PATCH, uri, content);
224         dbEngine.commit();
225         assertEquals("Expected the pserver to be updated", 200, response.getStatus());
226     }
227     
228     private int doDelete(String resourceVersion, String uri, String nodeType) throws UnsupportedEncodingException, AAIException {
229         queryParameters.add("resource-version", resourceVersion);
230         DBConnectionType type = DBConnectionType.REALTIME;
231         HttpEntry httpEntry = new HttpEntry(Version.getLatest(), ModelType.MOXY, QueryStyle.TRAVERSAL, type);
232         Loader loader = httpEntry.getLoader();
233         TransactionalGraphEngine dbEngine = httpEntry.getDbEngine();
234
235         URI uriObject = UriBuilder.fromPath(uri).build();
236
237         QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(uriObject);
238
239         String content = "";
240
241         Introspector obj = loader.introspectorFromName(nodeType);
242
243         DBRequest dbRequest =
244                 new DBRequest.Builder(HttpMethod.DELETE, uriObject, uriQuery, obj, httpHeaders, uriInfo, "JUNIT-TRANSACTION")
245                         .rawRequestContent(content).build();
246
247         List<DBRequest> dbRequestList = new ArrayList<>();
248         dbRequestList.add(dbRequest);
249
250         Pair<Boolean, List<Pair<URI, Response>>> responsesTuple  = httpEntry.process(dbRequestList, "JUNIT");
251         Response response = responsesTuple.getValue1().get(0).getValue1();
252         dbEngine.commit();
253         return response.getStatus();
254     }
255     
256     @Test
257     public void test6DeleteOnPserver() throws UnsupportedEncodingException, AAIException {
258
259
260         DBConnectionType type = DBConnectionType.REALTIME;
261         HttpEntry httpEntry = new HttpEntry(Version.getLatest(), ModelType.MOXY, QueryStyle.TRAVERSAL, type);
262         Loader loader = httpEntry.getLoader();
263         TransactionalGraphEngine dbEngine = httpEntry.getDbEngine();
264
265         URI uriObject = UriBuilder.fromPath("/cloud-infrastructure/pservers/pserver/junit-test1").build();
266         String uri = "/cloud-infrastructure/pservers/pserver/junit-test1";
267         String content = "";
268         Response response = getResponse(httpEntry, loader, dbEngine, HttpMethod.GET, uri, content);
269         dbEngine.commit();
270         String msg = response.getEntity().toString();
271         JsonObject jsonObj = new JsonParser().parse(msg).getAsJsonObject();
272         String resourceVersion = "";
273         if ( jsonObj.isJsonObject()) {
274                 resourceVersion = jsonObj.get("resource-version").getAsString();
275         }
276         assertEquals("Expected the pserver to be deleted", 204, doDelete(resourceVersion, "/cloud-infrastructure/pservers/pserver/junit-test1", "pserver"));
277     }
278
279     @Test
280     public void test7DeleteOnPserverNoPinterface() throws UnsupportedEncodingException, AAIException {
281
282         
283         DBConnectionType type = DBConnectionType.REALTIME;
284         HttpEntry httpEntry = new HttpEntry(Version.getLatest(), ModelType.MOXY, QueryStyle.TRAVERSAL, type);
285         Loader loader = httpEntry.getLoader();
286         TransactionalGraphEngine dbEngine = httpEntry.getDbEngine();
287
288         String uri = "/cloud-infrastructure/pservers/pserver/junit-test2";
289         String content = "";
290         Response response = getResponse(httpEntry, loader, dbEngine, HttpMethod.GET, uri, content);
291         dbEngine.commit();
292         String msg = response.getEntity().toString();
293         JsonObject jsonObj = new JsonParser().parse(msg).getAsJsonObject();
294         String resourceVersion = "";
295         if ( jsonObj.isJsonObject()) {
296                 resourceVersion = jsonObj.get("resource-version").getAsString();
297         }
298         assertEquals("Expected the pserver to be deleted", 204, doDelete(resourceVersion, "/cloud-infrastructure/pservers/pserver/junit-test2", "pserver"));
299     }
300
301
302     @Test
303     public void test8FailedGetOnPserver() throws UnsupportedEncodingException, AAIException {
304
305         DBConnectionType type = DBConnectionType.REALTIME;
306         HttpEntry httpEntry = new HttpEntry(Version.getLatest(), ModelType.MOXY, QueryStyle.TRAVERSAL, type);
307         Loader loader = httpEntry.getLoader();
308         TransactionalGraphEngine dbEngine = httpEntry.getDbEngine();
309
310         String uri = "/cloud-infrastructure/pservers/pserver/junit-test2";
311         String content = "";
312         Response response = getResponse(httpEntry, loader, dbEngine, HttpMethod.GET, uri, content);
313         dbEngine.commit();
314
315         assertEquals("Expected the pserver to be deleted", 404, response.getStatus());
316     }
317
318     @Test
319     public void putEdgeTest() throws UnsupportedEncodingException, AAIException {
320
321         DBConnectionType type = DBConnectionType.REALTIME;
322         HttpEntry httpEntry = new HttpEntry(Version.getLatest(), ModelType.MOXY, QueryStyle.TRAVERSAL, type);
323         Loader loader = httpEntry.getLoader();
324         TransactionalGraphEngine dbEngine = httpEntry.getDbEngine();
325
326         //Put pserver
327         String uri = "/cloud-infrastructure/pservers/pserver/junit-edge-test-pserver";
328         String content = "{\"hostname\":\"junit-edge-test-pserver\"}";
329         getResponse(httpEntry, loader, dbEngine, HttpMethod.PUT, uri, content);
330         //Put complex
331         uri = "/cloud-infrastructure/complexes/complex/junit-edge-test-complex";
332         content = "{\"physical-location-id\":\"junit-edge-test-complex\",\"physical-location-type\":\"AAIDefault\",\"street1\":\"AAIDefault\",\"city\":\"AAIDefault\",\"state\":\"NJ\",\"postal-code\":\"07748\",\"country\":\"USA\",\"region\":\"US\"}";
333         getResponse(httpEntry, loader, dbEngine, HttpMethod.PUT, uri, content);
334
335         //PutEdge
336         uri = "/cloud-infrastructure/complexes/complex/junit-edge-test-complex/relationship-list/relationship";
337         content = "{\"related-to\":\"pserver\",\"related-link\":\"/aai/" + Version.getLatest().toString() + "/cloud-infrastructure/pservers/pserver/junit-edge-test-pserver\",\"relationship-label\":\"org.onap.relationships.inventory.LocatedIn\"}";
338         Response response = getResponse(httpEntry, loader, dbEngine, HttpMethod.PUT_EDGE, uri, content);
339
340         dbEngine.rollback();
341         //System.out.println(response.getEntity().toString());
342         assertEquals("Expected the pserver to be created", 200, response.getStatus());
343     }
344
345     @Test
346     public void putEdgeWrongLabelTest() throws UnsupportedEncodingException, AAIException {
347
348         DBConnectionType type = DBConnectionType.REALTIME;
349         HttpEntry httpEntry = new HttpEntry(Version.getLatest(), ModelType.MOXY, QueryStyle.TRAVERSAL, type);
350         Loader loader = httpEntry.getLoader();
351         TransactionalGraphEngine dbEngine = httpEntry.getDbEngine();
352
353         //Put pserver
354         String uri = "/cloud-infrastructure/pservers/pserver/junit-edge-test-pserver";
355         String content = "{\"hostname\":\"junit-edge-test-pserver\"}";
356         getResponse(httpEntry, loader, dbEngine, HttpMethod.PUT, uri, content);
357         //Put complex
358         uri = "/cloud-infrastructure/complexes/complex/junit-edge-test-complex";
359         content = "{\"physical-location-id\":\"junit-edge-test-complex\",\"physical-location-type\":\"AAIDefault\",\"street1\":\"AAIDefault\",\"city\":\"AAIDefault\",\"state\":\"NJ\",\"postal-code\":\"07748\",\"country\":\"USA\",\"region\":\"US\"}";
360         getResponse(httpEntry, loader, dbEngine, HttpMethod.PUT, uri, content);
361
362         //PutEdge
363         uri = "/cloud-infrastructure/complexes/complex/junit-edge-test-complex/relationship-list/relationship";
364         content = "{\"related-to\":\"pserver\",\"related-link\":\"/aai/" + Version.getLatest().toString() + "/cloud-infrastructure/pservers/pserver/junit-edge-test-pserver\",\"relationship-label\":\"junk\"}";
365         Response response = getResponse(httpEntry, loader, dbEngine, HttpMethod.PUT_EDGE, uri, content);
366
367         dbEngine.rollback();
368         String msg = response.getEntity().toString();
369         assertEquals("Expected the pserver to be created", 400, response.getStatus());
370         assertTrue(msg.contains("ERR.5.4.6107"));
371         assertTrue(msg.contains("Required Edge-property not found in input data:no COUSIN edge rule between complex and pserver with label junk"));
372     }
373 }