2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 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=========================================================
21 package org.openecomp.sdc.be.model.operations.impl;
23 import static org.junit.Assert.assertEquals;
24 import static org.junit.Assert.assertNotNull;
25 import static org.junit.Assert.assertTrue;
27 import java.util.ArrayList;
28 import java.util.Collections;
29 import java.util.HashMap;
30 import java.util.List;
32 import java.util.Map.Entry;
34 import fj.data.Either;
35 import org.apache.commons.collections4.MapUtils;
36 import org.apache.commons.lang3.tuple.ImmutablePair;
37 import org.junit.Before;
38 import org.junit.BeforeClass;
39 import org.junit.Test;
40 import org.junit.runner.RunWith;
41 import org.mockito.InjectMocks;
42 import org.mockito.Mock;
43 import org.mockito.Mockito;
44 import org.mockito.MockitoAnnotations;
45 import org.mockito.Spy;
46 import org.openecomp.sdc.be.dao.graph.datatype.GraphRelation;
47 import org.openecomp.sdc.be.dao.janusgraph.HealingJanusGraphGenericDao;
48 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
49 import org.openecomp.sdc.be.datatypes.elements.RelationshipInstDataDefinition;
50 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
51 import org.openecomp.sdc.be.model.ModelTestBase;
52 import org.openecomp.sdc.be.model.PropertyConstraint;
53 import org.openecomp.sdc.be.model.PropertyDefinition;
54 import org.openecomp.sdc.be.model.RelationshipTypeDefinition;
55 import org.openecomp.sdc.be.model.operations.api.DerivedFromOperation;
56 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
57 import org.openecomp.sdc.be.model.tosca.ToscaType;
58 import org.openecomp.sdc.be.model.tosca.constraints.GreaterThanConstraint;
59 import org.openecomp.sdc.be.model.tosca.constraints.InRangeConstraint;
60 import org.openecomp.sdc.be.model.tosca.constraints.LessOrEqualConstraint;
61 import org.openecomp.sdc.be.resources.data.RelationshipTypeData;
62 import org.springframework.test.context.ContextConfiguration;
63 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
65 @RunWith(SpringJUnit4ClassRunner.class)
66 @ContextConfiguration("classpath:application-context-test.xml")
67 public class RelationshipTypeOperationTest extends ModelTestBase {
69 private static final String PROP = "prop";
72 HealingJanusGraphGenericDao janusGraphGenericDao;
75 PropertyOperation propertyOperation;
78 DerivedFromOperation derivedFromOperation;
82 private RelationshipTypeOperation relationshipTypeOperation;
84 private RelationshipTypeDefinition relationshipTypeDefinition = new RelationshipTypeDefinition();
87 relationshipTypeDefinition.setDescription("desc1");
88 relationshipTypeDefinition.setType("tosca.relationships.Container1");
89 relationshipTypeDefinition.setDerivedFrom("tosca.relationships.Root");
90 relationshipTypeDefinition.setProperties(createPropertyData("prop1"));
91 relationshipTypeDefinition.setUniqueId("tosca.relationships.Container1");
95 public static void setupBeforeClass() {
100 public void setUp() throws Exception {
101 MockitoAnnotations.initMocks(this);
103 Mockito.doReturn(JanusGraphOperationStatus.OK).when(janusGraphGenericDao).commit();
104 Mockito.doReturn(JanusGraphOperationStatus.OK).when(janusGraphGenericDao).rollback();
108 public void getRelationshipTypeByNameNotCreated() {
109 Mockito.doReturn(Either.right(JanusGraphOperationStatus.NOT_CREATED))
110 .when(relationshipTypeOperation).getRelationshipTypeByUid(Mockito.anyString());
112 Either<RelationshipTypeDefinition, JanusGraphOperationStatus> either =
113 relationshipTypeOperation.getRelationshipTypeByName("name");
114 assertTrue(either.isRight());
118 public void testDummy() {
119 assertNotNull(relationshipTypeOperation);
123 public void testAddRelationshipTypeValidationFailStatusNullInTransactionFalse() {
124 Mockito.doReturn(Either.right(JanusGraphOperationStatus.NOT_CONNECTED))
125 .when(propertyOperation)
126 .getAllTypePropertiesFromAllDerivedFrom(Mockito.anyString(), Mockito.any(), Mockito.any());
129 Either<RelationshipTypeDefinition, StorageOperationStatus> addRelationshipType =
130 relationshipTypeOperation.addRelationshipType(relationshipTypeDefinition, false);
132 assertTrue(addRelationshipType.isRight());
136 public void testAddRelationshipTypeValidationFailStatusPropertiesReturnedInTransactionFalse() {
137 Mockito.doReturn(Either.left(Collections.singletonMap("prop1", new PropertyDefinition()))).when(propertyOperation)
138 .getAllTypePropertiesFromAllDerivedFrom(Mockito.anyString(), Mockito.any(), Mockito.any());
139 Mockito.doReturn(Either.right(JanusGraphOperationStatus.NOT_FOUND)).when(propertyOperation)
140 .validatePropertiesUniqueness(Mockito.any(), Mockito.any());
142 Either<RelationshipTypeDefinition, StorageOperationStatus> addRelationshipType =
143 relationshipTypeOperation.addRelationshipType(relationshipTypeDefinition, false);
145 assertTrue(addRelationshipType.isRight());
149 public void testGetAllRelationshipTypesNotFound() {
150 Mockito.doReturn(Either.right(JanusGraphOperationStatus.NOT_FOUND)).when(
151 janusGraphGenericDao).getByCriteria(NodeTypeEnum.RelationshipType, null,
152 RelationshipTypeData.class);
153 Either<Map<String, RelationshipTypeDefinition>, JanusGraphOperationStatus> either = relationshipTypeOperation.getAllRelationshipTypes();
155 assertTrue(either.isLeft() && MapUtils.isEmpty(either.left().value()));
159 public void testGetAllRelationshipTypesNotConnnected() {
160 Mockito.doReturn(Either.right(JanusGraphOperationStatus.NOT_CONNECTED)).when(
161 janusGraphGenericDao).getByCriteria(NodeTypeEnum.RelationshipType, null,
162 RelationshipTypeData.class);
163 Either<Map<String, RelationshipTypeDefinition>, JanusGraphOperationStatus> either = relationshipTypeOperation.getAllRelationshipTypes();
165 assertTrue(either.isRight() && JanusGraphOperationStatus.NOT_CONNECTED == either.right().value());
169 public void testGetAllRelationshipTypesSuccess() {
170 List<RelationshipTypeData> relationshipTypeDataList = new ArrayList<>();
172 RelationshipTypeData relationshipTypeData1 = new RelationshipTypeData();
173 RelationshipInstDataDefinition relationshipInstDataDefinition1 = new RelationshipInstDataDefinition();
174 relationshipInstDataDefinition1.setUniqueId("tosca.relationships.Root1");
175 relationshipInstDataDefinition1.setType("tosca.relationships.Root1");
176 relationshipTypeData1.setRelationshipTypeDataDefinition(relationshipInstDataDefinition1);
178 relationshipTypeDataList.add(relationshipTypeData1);
180 Mockito.doReturn(Either.left(relationshipTypeDataList))
181 .when(janusGraphGenericDao).getByCriteria(NodeTypeEnum.RelationshipType, null,
182 RelationshipTypeData.class);
184 Mockito.doReturn(Either.left(relationshipTypeData1)).when(janusGraphGenericDao)
185 .getNode(Mockito.anyString(), Mockito.anyString(), Mockito.eq(RelationshipTypeData.class));
187 Mockito.doReturn(Either.left(createPropertyData("prop1"))).when(propertyOperation)
188 .findPropertiesOfNode(NodeTypeEnum.RelationshipType, "tosca.relationships.Root1");
190 RelationshipInstDataDefinition derivedFromRelationshipTypeDefinition = new RelationshipInstDataDefinition();
191 derivedFromRelationshipTypeDefinition.setUniqueId("tosca.relationships.Root1");
192 derivedFromRelationshipTypeDefinition.setType("tosca.relationships.Parent");
194 Mockito.doReturn(Either.left(new RelationshipTypeData(derivedFromRelationshipTypeDefinition)))
195 .when(derivedFromOperation)
196 .getDerivedFromChild("tosca.relationships.Root1", NodeTypeEnum.RelationshipType, RelationshipTypeData.class);
198 Either<Map<String, RelationshipTypeDefinition>, JanusGraphOperationStatus> either =
199 relationshipTypeOperation.getAllRelationshipTypes();
201 assertTrue(either.isLeft());
202 RelationshipTypeDefinition relationshipTypeDefinition = either.left().value().get("tosca.relationships.Root1");
203 assertEquals("tosca.relationships.Parent", relationshipTypeDefinition.getDerivedFrom());
206 public RelationshipTypeDefinition createRelationship(String relationshipTypeName) {
208 RelationshipTypeDefinition relationshipTypeDefinition = new RelationshipTypeDefinition();
209 relationshipTypeDefinition.setDescription("desc1");
210 relationshipTypeDefinition.setType(relationshipTypeName);
212 Map<String, PropertyDefinition> properties = new HashMap<>();
214 String propName1 = "disk_size";
215 String propName2 = "num_cpus";
217 PropertyDefinition property1 = buildProperty1();
219 properties.put(propName1, property1);
221 PropertyDefinition property2 = buildProperty2();
223 properties.put(propName2, property2);
225 relationshipTypeDefinition.setProperties(properties);
227 Either<RelationshipTypeDefinition, StorageOperationStatus> addRelationshipType1 =
228 relationshipTypeOperation.addRelationshipType(relationshipTypeDefinition, true);
230 RelationshipTypeDefinition relationshipTypeDefinitionCreated = addRelationshipType1.left().value();
231 Either<RelationshipTypeDefinition, StorageOperationStatus> relationshipType =
232 relationshipTypeOperation.getRelationshipType(relationshipTypeDefinitionCreated.getUniqueId(), true);
233 assertTrue("check relationship type fetched", relationshipType.isLeft());
234 RelationshipTypeDefinition fetchedCTD = relationshipType.left().value();
236 Map<String, PropertyDefinition> fetchedProps = fetchedCTD.getProperties();
238 compareProperties(fetchedProps, properties);
244 private void compareProperties(Map<String, PropertyDefinition> first, Map<String, PropertyDefinition> second) {
246 assertTrue("check properties are full or empty",
247 ((first == null && second == null) || (first != null && second != null)));
249 assertEquals("check properties size", first.size(), second.size());
251 for (Entry<String, PropertyDefinition> entry : first.entrySet()) {
253 String propName = entry.getKey();
254 PropertyDefinition secondPD = second.get(propName);
255 assertNotNull("Cannot find property " + propName + " in " + second, secondPD);
257 PropertyDefinition firstPD = entry.getValue();
259 comparePropertyDefinition(firstPD, secondPD);
266 private void comparePropertyDefinition(PropertyDefinition first, PropertyDefinition second) {
268 assertTrue("check objects are full or empty",
269 ((first == null && second == null) || (first != null && second != null)));
271 assertTrue("check property description", compareValue(first.getDescription(), second.getDescription()));
272 assertTrue("check property default value", compareValue((String) first.getDefaultValue(),
273 (String) second.getDefaultValue()));
274 assertTrue("check property type", compareValue(first.getType(), second.getType()));
275 compareList(first.getConstraints(), second.getConstraints());
280 private void compareList(List<PropertyConstraint> first, List<PropertyConstraint> second) {
282 assertTrue("check lists are full or empty",
283 ((first == null && second == null) || (first != null && second != null)));
285 assertEquals("check list size", first.size(), second.size());
289 private PropertyDefinition buildProperty2() {
290 PropertyDefinition property2 = new PropertyDefinition();
291 property2.setDefaultValue("2");
292 property2.setDescription("Number of (actual or virtual) CPUs associated with the Compute node.");
293 property2.setType(ToscaType.INTEGER.name().toLowerCase());
294 List<PropertyConstraint> constraints3 = new ArrayList<>();
295 List<String> range = new ArrayList<>();
298 InRangeConstraint propertyConstraint3 = new InRangeConstraint(range);
299 constraints3.add(propertyConstraint3);
300 property2.setConstraints(constraints3);
304 private PropertyDefinition buildProperty1() {
305 PropertyDefinition property1 = new PropertyDefinition();
306 property1.setDefaultValue("10");
307 property1.setDescription("Size of the local disk, in Gigabytes (GB), "
308 + "available to applications running on the Compute node.");
309 property1.setType(ToscaType.INTEGER.name().toLowerCase());
310 List<PropertyConstraint> constraints = new ArrayList<>();
311 GreaterThanConstraint propertyConstraint1 = new GreaterThanConstraint("0");
312 constraints.add(propertyConstraint1);
314 LessOrEqualConstraint propertyConstraint2 = new LessOrEqualConstraint("10");
315 constraints.add(propertyConstraint2);
317 property1.setConstraints(constraints);
321 private boolean compareValue(String first, String second) {
323 if (first == null && second == null) {
327 return first.equals(second);
333 public void setOperations(RelationshipTypeOperation relationshipTypeOperation) {
334 this.relationshipTypeOperation = relationshipTypeOperation;
338 public void testAddRelationshipType() {
340 RelationshipTypeData relationshipTypeData = new RelationshipTypeData();
341 RelationshipInstDataDefinition relationshipInstDataDefinition1 = new RelationshipInstDataDefinition();
342 relationshipInstDataDefinition1.setUniqueId("tosca.relationships.Root");
343 relationshipInstDataDefinition1.setType("tosca.relationships.Root");
344 relationshipTypeData.setRelationshipTypeDataDefinition(relationshipInstDataDefinition1);
346 RelationshipTypeDefinition relationshipTypeDefinition = new RelationshipTypeDefinition(relationshipTypeData);
347 relationshipTypeDefinition.setProperties(createPropertyData("prop1"));
348 relationshipTypeDefinition.setDerivedFrom("tosca.relationships.Root");
350 Mockito.doReturn(Either.left(Collections.singletonMap("prop1", new PropertyDefinition()))).when(propertyOperation)
351 .getAllTypePropertiesFromAllDerivedFrom(Mockito.anyString(), Mockito.any(), Mockito.any());
353 Mockito.doReturn(Either.left(new ArrayList<>(relationshipTypeDefinition.getProperties().values()))).when(propertyOperation)
354 .validatePropertiesUniqueness(Mockito.any(), Mockito.any());
356 Mockito.doReturn(Either.left(relationshipTypeData)).when(janusGraphGenericDao)
357 .createNode(Mockito.any(), Mockito.eq(RelationshipTypeData.class));
359 Mockito.doReturn(Either.left(new HashMap())).when(propertyOperation)
360 .addPropertiesToElementType(Mockito.anyString(), Mockito.any(), Mockito.anyMap());
362 Mockito.doReturn(Either.left(relationshipTypeDefinition))
363 .when(relationshipTypeOperation).getRelationshipTypeByUid(Mockito.anyString());
365 Mockito.doReturn(Either.left(new GraphRelation()))
366 .when(derivedFromOperation)
367 .addDerivedFromRelation(Mockito.anyString(), Mockito.anyString(), Mockito.any());
369 Mockito.doReturn(Either.left(relationshipTypeDefinition))
370 .when(relationshipTypeOperation).getRelationshipType(Mockito.anyString(), Mockito.anyBoolean());
372 Either<RelationshipTypeDefinition, StorageOperationStatus> either =
373 relationshipTypeOperation.addRelationshipType(relationshipTypeDefinition, true);
375 assertTrue(either.isLeft());
379 public void testGetRelationshipTypeNotConnected() {
380 Mockito.doReturn(Either.right(JanusGraphOperationStatus.NOT_CONNECTED))
381 .when(relationshipTypeOperation).getRelationshipTypeByUid(Mockito.anyString());
383 Either<RelationshipTypeDefinition, StorageOperationStatus> either =
384 relationshipTypeOperation.getRelationshipType(Mockito.anyString(), Mockito.anyBoolean());
386 assertTrue(either.isRight());
390 public void testGetRelationshipTypeSuccess() {
391 Mockito.doReturn(Either.left(relationshipTypeDefinition))
392 .when(relationshipTypeOperation).getRelationshipTypeByUid(Mockito.anyString());
394 Either<RelationshipTypeDefinition, StorageOperationStatus> either =
395 relationshipTypeOperation.getRelationshipType(Mockito.anyString(), Mockito.anyBoolean());
397 assertTrue(either.isLeft());
401 public void testUpdateRelationshipType() {
402 RelationshipTypeDefinition newRelationshipTypeDefinition = new RelationshipTypeDefinition();
403 newRelationshipTypeDefinition.setUniqueId("tosca.relationships.Container2");
404 newRelationshipTypeDefinition.setDescription("desc2");
405 newRelationshipTypeDefinition.setType("tosca.relationships.Container2");
406 newRelationshipTypeDefinition.setDerivedFrom("tosca.relationships.Root");
407 newRelationshipTypeDefinition.setProperties(createPropertyData("prop1"));
409 Mockito.doReturn(Either.left(new RelationshipTypeData(newRelationshipTypeDefinition))).when(
410 janusGraphGenericDao)
411 .updateNode(Mockito.any(), Mockito.eq(RelationshipTypeData.class));
413 Mockito.doReturn(Either.left(newRelationshipTypeDefinition.getProperties()))
414 .when(propertyOperation).deletePropertiesAssociatedToNode(Mockito.any(), Mockito.anyString());
416 Mockito.doReturn(Either.left(newRelationshipTypeDefinition.getProperties()))
417 .when(propertyOperation).addPropertiesToElementType(Mockito.anyString(), Mockito.any(), Mockito.anyMap());
419 Mockito.doReturn(Either.left(newRelationshipTypeDefinition)).when(relationshipTypeOperation)
420 .getRelationshipTypeByUid(Mockito.anyString());
422 Mockito.doReturn(StorageOperationStatus.OK).when(derivedFromOperation)
423 .removeDerivedFromRelation(Mockito.anyString(), Mockito.anyString(), Mockito.any());
425 Mockito.doReturn(Either.left(new GraphRelation()))
426 .when(derivedFromOperation)
427 .addDerivedFromRelation(Mockito.anyString(), Mockito.anyString(), Mockito.any());
429 Either<RelationshipTypeDefinition, StorageOperationStatus> either =
430 relationshipTypeOperation.updateRelationshipType(relationshipTypeDefinition,
431 newRelationshipTypeDefinition, false);
433 assertTrue(either.isLeft());
437 public void testGetRelationshipTypeByUid() {
438 RelationshipTypeData relationshipTypeData = new RelationshipTypeData(relationshipTypeDefinition);
440 Mockito.doReturn(Either.left(relationshipTypeData)).when(janusGraphGenericDao)
441 .getNode(Mockito.anyString(), Mockito.any(), Mockito.eq(RelationshipTypeData.class));
443 Mockito.doReturn(Either.left(relationshipTypeDefinition.getProperties()))
444 .when(propertyOperation).findPropertiesOfNode(Mockito.any(), Mockito.anyString());
446 RelationshipTypeDefinition childRelationshipTypeDefinition = new RelationshipTypeDefinition();
447 childRelationshipTypeDefinition.setType("tosca.relationships.ContainerChild");
449 Mockito.doReturn(Either.left(new ImmutablePair(new RelationshipTypeData(childRelationshipTypeDefinition), null))).when(
450 janusGraphGenericDao)
451 .getChild(Mockito.anyString(), Mockito.anyString(), Mockito.any(), Mockito.any(),
452 Mockito.eq(RelationshipTypeData.class));
454 Either<RelationshipTypeDefinition, JanusGraphOperationStatus> either =
455 relationshipTypeOperation.getRelationshipTypeByUid("tosca.relationships.Container1");
457 assertTrue(either.isLeft()
458 && "tosca.relationships.ContainerChild".equals(either.left().value().getDerivedFrom()));
461 private Map<String, PropertyDefinition> createPropertyData(String value) {
462 PropertyDefinition propertyDefinition = new PropertyDefinition();
463 propertyDefinition.setDefaultValue(value);
464 propertyDefinition.setDescription(PROP + "_" + value);
465 propertyDefinition.setType(ToscaType.INTEGER.name().toLowerCase());
466 List<PropertyConstraint> constraints = new ArrayList<>();
467 List<String> range = new ArrayList<>();
470 InRangeConstraint propertyConstraint = new InRangeConstraint(range);
471 constraints.add(propertyConstraint);
472 propertyDefinition.setConstraints(constraints);
473 Map<String, PropertyDefinition> propertiesMap = new HashMap<>();
474 propertiesMap.put(PROP, propertyDefinition);
475 return propertiesMap;