2 * ============LICENSE_START=======================================================
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
20 package org.onap.aai.rest.db;
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;
39 import javax.ws.rs.core.*;
41 import java.io.BufferedReader;
42 import java.io.InputStream;
43 import java.io.InputStreamReader;
44 import java.io.UnsupportedEncodingException;
47 import java.util.stream.Collectors;
49 import com.google.gson.JsonObject;
50 import com.google.gson.JsonParser;
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;
57 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
58 public class HttpEntryTest extends AAISetup {
60 protected static final MediaType APPLICATION_JSON = MediaType.valueOf("application/json");
62 private static final Set<Integer> VALID_HTTP_STATUS_CODES = new HashSet<>();
65 VALID_HTTP_STATUS_CODES.add(200);
66 VALID_HTTP_STATUS_CODES.add(201);
67 VALID_HTTP_STATUS_CODES.add(204);
70 private HttpHeaders httpHeaders;
72 private UriInfo uriInfo;
74 private MultivaluedMap<String, String> headersMultiMap;
75 private MultivaluedMap<String, String> queryParameters;
77 private List<String> aaiRequestContextList;
79 private List<MediaType> outputMediaTypes;
84 httpHeaders = Mockito.mock(HttpHeaders.class);
85 uriInfo = Mockito.mock(UriInfo.class);
87 headersMultiMap = new MultivaluedHashMap<>();
88 queryParameters = Mockito.spy(new MultivaluedHashMap<>());
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", "");
96 outputMediaTypes = new ArrayList<>();
97 outputMediaTypes.add(APPLICATION_JSON);
99 aaiRequestContextList = new ArrayList<>();
100 aaiRequestContextList.add("");
102 when(httpHeaders.getAcceptableMediaTypes()).thenReturn(outputMediaTypes);
103 when(httpHeaders.getRequestHeaders()).thenReturn(headersMultiMap);
105 when(httpHeaders.getRequestHeader("aai-request-context")).thenReturn(aaiRequestContextList);
108 when(uriInfo.getQueryParameters()).thenReturn(queryParameters);
109 when(uriInfo.getQueryParameters(false)).thenReturn(queryParameters);
111 // TODO - Check if this is valid since RemoveDME2QueryParameters seems to be very unreasonable
112 Mockito.doReturn(null).when(queryParameters).remove(anyObject());
114 when(httpHeaders.getMediaType()).thenReturn(APPLICATION_JSON);
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";
124 Introspector obj = null;
125 if (method.equals(HttpMethod.GET)) {
126 obj = loader.introspectorFromName(objType);
128 obj = loader.unmarshal(objType, content, org.onap.aai.restcore.MediaType.getEnum("application/json"));
131 DBRequest dbRequest =
132 new DBRequest.Builder(method, uriObject, uriQuery, obj, httpHeaders, uriInfo, "JUNIT-TRANSACTION")
133 .rawRequestContent(content).build();
135 List<DBRequest> dbRequestList = new ArrayList<>();
136 dbRequestList.add(dbRequest);
138 Pair<Boolean, List<Pair<URI, Response>>> responsesTuple = httpEntry.process(dbRequestList, "JUNIT");
139 return responsesTuple.getValue1().get(0).getValue1();
144 public void test1PutOnPserver() throws UnsupportedEncodingException, AAIException {
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();
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);
155 assertEquals("Expected the pserver to be created", 201, response.getStatus());
159 public void test2PutOnPserverNoPInterface() throws UnsupportedEncodingException, AAIException {
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();
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);
170 assertEquals("Expected the pserver to be created", 201, response.getStatus());
174 public void test3PutOnPInterface() {
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();
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);
185 assertEquals("Expected the p-interface to be created", 201, response.getStatus());
186 } catch (UnsupportedEncodingException | AAIException e) {
187 // TODO Auto-generated catch block
195 public void test4GetOnPserver() throws UnsupportedEncodingException, AAIException {
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();
202 URI uriObject = UriBuilder.fromPath("/cloud-infrastructure/pservers/pserver/junit-test1").build();
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);
208 assertEquals("Expected the pserver to be returned", 200, response.getStatus());
212 public void test5MergePatchOnPserver() throws UnsupportedEncodingException, AAIException {
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();
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);
223 assertEquals("Expected the pserver to be updated", 200, response.getStatus());
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();
233 URI uriObject = UriBuilder.fromPath(uri).build();
235 QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(uriObject);
239 Introspector obj = loader.introspectorFromName(nodeType);
241 DBRequest dbRequest =
242 new DBRequest.Builder(HttpMethod.DELETE, uriObject, uriQuery, obj, httpHeaders, uriInfo, "JUNIT-TRANSACTION")
243 .rawRequestContent(content).build();
245 List<DBRequest> dbRequestList = new ArrayList<>();
246 dbRequestList.add(dbRequest);
248 Pair<Boolean, List<Pair<URI, Response>>> responsesTuple = httpEntry.process(dbRequestList, "JUNIT");
249 Response response = responsesTuple.getValue1().get(0).getValue1();
251 return response.getStatus();
255 public void test6DeleteOnPserver() throws UnsupportedEncodingException, AAIException {
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();
263 URI uriObject = UriBuilder.fromPath("/cloud-infrastructure/pservers/pserver/junit-test1").build();
264 String uri = "/cloud-infrastructure/pservers/pserver/junit-test1";
266 Response response = getResponse(httpEntry, loader, dbEngine, HttpMethod.GET, uri, content);
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();
274 assertEquals("Expected the pserver to be deleted", 204, doDelete(resourceVersion, "/cloud-infrastructure/pservers/pserver/junit-test1", "pserver"));
278 public void test7DeleteOnPserverNoPinterface() throws UnsupportedEncodingException, AAIException {
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();
286 String uri = "/cloud-infrastructure/pservers/pserver/junit-test2";
288 Response response = getResponse(httpEntry, loader, dbEngine, HttpMethod.GET, uri, content);
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();
296 assertEquals("Expected the pserver to be deleted", 204, doDelete(resourceVersion, "/cloud-infrastructure/pservers/pserver/junit-test2", "pserver"));
301 public void test8FailedGetOnPserver() throws UnsupportedEncodingException, AAIException {
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();
308 String uri = "/cloud-infrastructure/pservers/pserver/junit-test2";
310 Response response = getResponse(httpEntry, loader, dbEngine, HttpMethod.GET, uri, content);
313 assertEquals("Expected the pserver to be deleted", 404, response.getStatus());
317 public void putEdgeTest() throws UnsupportedEncodingException, AAIException {
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();
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);
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);
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);
339 //System.out.println(response.getEntity().toString());
340 assertEquals("Expected the pserver to be created", 200, response.getStatus());
344 public void putEdgeWrongLabelTest() throws UnsupportedEncodingException, AAIException {
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();
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);
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);
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);
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"));