2 * ============LICENSE_START=======================================================
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
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 * ECOMP is a trademark and service mark of AT&T Intellectual Property.
22 package org.onap.aai.rest.db;
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;
41 import javax.ws.rs.core.*;
43 import java.io.BufferedReader;
44 import java.io.InputStream;
45 import java.io.InputStreamReader;
46 import java.io.UnsupportedEncodingException;
49 import java.util.stream.Collectors;
51 import com.google.gson.JsonObject;
52 import com.google.gson.JsonParser;
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;
59 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
60 public class HttpEntryTest extends AAISetup {
62 protected static final MediaType APPLICATION_JSON = MediaType.valueOf("application/json");
64 private static final Set<Integer> VALID_HTTP_STATUS_CODES = new HashSet<>();
67 VALID_HTTP_STATUS_CODES.add(200);
68 VALID_HTTP_STATUS_CODES.add(201);
69 VALID_HTTP_STATUS_CODES.add(204);
72 private HttpHeaders httpHeaders;
74 private UriInfo uriInfo;
76 private MultivaluedMap<String, String> headersMultiMap;
77 private MultivaluedMap<String, String> queryParameters;
79 private List<String> aaiRequestContextList;
81 private List<MediaType> outputMediaTypes;
86 httpHeaders = Mockito.mock(HttpHeaders.class);
87 uriInfo = Mockito.mock(UriInfo.class);
89 headersMultiMap = new MultivaluedHashMap<>();
90 queryParameters = Mockito.spy(new MultivaluedHashMap<>());
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", "");
98 outputMediaTypes = new ArrayList<>();
99 outputMediaTypes.add(APPLICATION_JSON);
101 aaiRequestContextList = new ArrayList<>();
102 aaiRequestContextList.add("");
104 when(httpHeaders.getAcceptableMediaTypes()).thenReturn(outputMediaTypes);
105 when(httpHeaders.getRequestHeaders()).thenReturn(headersMultiMap);
107 when(httpHeaders.getRequestHeader("aai-request-context")).thenReturn(aaiRequestContextList);
110 when(uriInfo.getQueryParameters()).thenReturn(queryParameters);
111 when(uriInfo.getQueryParameters(false)).thenReturn(queryParameters);
113 // TODO - Check if this is valid since RemoveDME2QueryParameters seems to be very unreasonable
114 Mockito.doReturn(null).when(queryParameters).remove(anyObject());
116 when(httpHeaders.getMediaType()).thenReturn(APPLICATION_JSON);
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";
126 Introspector obj = null;
127 if (method.equals(HttpMethod.GET)) {
128 obj = loader.introspectorFromName(objType);
130 obj = loader.unmarshal(objType, content, org.onap.aai.restcore.MediaType.getEnum("application/json"));
133 DBRequest dbRequest =
134 new DBRequest.Builder(method, uriObject, uriQuery, obj, httpHeaders, uriInfo, "JUNIT-TRANSACTION")
135 .rawRequestContent(content).build();
137 List<DBRequest> dbRequestList = new ArrayList<>();
138 dbRequestList.add(dbRequest);
140 Pair<Boolean, List<Pair<URI, Response>>> responsesTuple = httpEntry.process(dbRequestList, "JUNIT");
141 return responsesTuple.getValue1().get(0).getValue1();
146 public void test1PutOnPserver() throws UnsupportedEncodingException, AAIException {
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();
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);
157 assertEquals("Expected the pserver to be created", 201, response.getStatus());
161 public void test2PutOnPserverNoPInterface() throws UnsupportedEncodingException, AAIException {
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();
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);
172 assertEquals("Expected the pserver to be created", 201, response.getStatus());
176 public void test3PutOnPInterface() {
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();
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);
187 assertEquals("Expected the p-interface to be created", 201, response.getStatus());
188 } catch (UnsupportedEncodingException | AAIException e) {
189 // TODO Auto-generated catch block
197 public void test4GetOnPserver() throws UnsupportedEncodingException, AAIException {
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();
204 URI uriObject = UriBuilder.fromPath("/cloud-infrastructure/pservers/pserver/junit-test1").build();
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);
210 assertEquals("Expected the pserver to be returned", 200, response.getStatus());
214 public void test5MergePatchOnPserver() throws UnsupportedEncodingException, AAIException {
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();
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);
225 assertEquals("Expected the pserver to be updated", 200, response.getStatus());
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();
235 URI uriObject = UriBuilder.fromPath(uri).build();
237 QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(uriObject);
241 Introspector obj = loader.introspectorFromName(nodeType);
243 DBRequest dbRequest =
244 new DBRequest.Builder(HttpMethod.DELETE, uriObject, uriQuery, obj, httpHeaders, uriInfo, "JUNIT-TRANSACTION")
245 .rawRequestContent(content).build();
247 List<DBRequest> dbRequestList = new ArrayList<>();
248 dbRequestList.add(dbRequest);
250 Pair<Boolean, List<Pair<URI, Response>>> responsesTuple = httpEntry.process(dbRequestList, "JUNIT");
251 Response response = responsesTuple.getValue1().get(0).getValue1();
253 return response.getStatus();
257 public void test6DeleteOnPserver() throws UnsupportedEncodingException, AAIException {
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();
265 URI uriObject = UriBuilder.fromPath("/cloud-infrastructure/pservers/pserver/junit-test1").build();
266 String uri = "/cloud-infrastructure/pservers/pserver/junit-test1";
268 Response response = getResponse(httpEntry, loader, dbEngine, HttpMethod.GET, uri, content);
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();
276 assertEquals("Expected the pserver to be deleted", 204, doDelete(resourceVersion, "/cloud-infrastructure/pservers/pserver/junit-test1", "pserver"));
280 public void test7DeleteOnPserverNoPinterface() throws UnsupportedEncodingException, AAIException {
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();
288 String uri = "/cloud-infrastructure/pservers/pserver/junit-test2";
290 Response response = getResponse(httpEntry, loader, dbEngine, HttpMethod.GET, uri, content);
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();
298 assertEquals("Expected the pserver to be deleted", 204, doDelete(resourceVersion, "/cloud-infrastructure/pservers/pserver/junit-test2", "pserver"));
303 public void test8FailedGetOnPserver() throws UnsupportedEncodingException, AAIException {
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();
310 String uri = "/cloud-infrastructure/pservers/pserver/junit-test2";
312 Response response = getResponse(httpEntry, loader, dbEngine, HttpMethod.GET, uri, content);
315 assertEquals("Expected the pserver to be deleted", 404, response.getStatus());
319 public void putEdgeTest() throws UnsupportedEncodingException, AAIException {
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();
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);
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);
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);
341 //System.out.println(response.getEntity().toString());
342 assertEquals("Expected the pserver to be created", 200, response.getStatus());
346 public void putEdgeWrongLabelTest() throws UnsupportedEncodingException, AAIException {
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();
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);
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);
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);
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"));