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