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 com.google.common.collect.Sets.newHashSet;
24 import static java.util.Arrays.asList;
25 import static org.assertj.core.api.Assertions.assertThat;
26 import static org.junit.Assert.assertEquals;
27 import static org.junit.Assert.assertTrue;
29 import java.util.Iterator;
30 import java.util.List;
31 import java.util.stream.Stream;
33 import org.apache.commons.lang.StringUtils;
34 import org.apache.commons.lang3.tuple.ImmutablePair;
35 import org.junit.Before;
36 import org.junit.BeforeClass;
37 import org.junit.Test;
38 import org.junit.runner.RunWith;
39 import org.openecomp.sdc.be.dao.graph.datatype.GraphEdge;
40 import org.openecomp.sdc.be.dao.neo4j.GraphEdgeLabels;
41 import org.openecomp.sdc.be.dao.titan.TitanGenericDao;
42 import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
43 import org.openecomp.sdc.be.datatypes.elements.PolicyTypeDataDefinition;
44 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
45 import org.openecomp.sdc.be.model.ModelTestBase;
46 import org.openecomp.sdc.be.model.PolicyTypeDefinition;
47 import org.openecomp.sdc.be.model.PropertyDefinition;
48 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
49 import org.openecomp.sdc.be.resources.data.PolicyTypeData;
50 import org.springframework.beans.factory.annotation.Autowired;
51 import org.springframework.test.context.ContextConfiguration;
52 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
54 import com.thinkaurelius.titan.core.TitanGraph;
55 import com.thinkaurelius.titan.core.TitanVertex;
57 import fj.data.Either;
59 @RunWith(SpringJUnit4ClassRunner.class)
60 @ContextConfiguration("classpath:application-context-test.xml")
61 public class PolicyTypeOperationTest extends ModelTestBase {
63 private static final String NULL_STRING = null;
65 private PolicyTypeOperation policyTypeOperation;
68 private TitanGenericDao titanGenericDao;
71 public static void setupBeforeClass() {
77 public void cleanUp() {
78 TitanGenericDao titanGenericDao = policyTypeOperation.titanGenericDao;
79 Either<TitanGraph, TitanOperationStatus> graphResult = titanGenericDao.getGraph();
80 TitanGraph graph = graphResult.left().value();
82 Iterable<TitanVertex> vertices = graph.query().vertices();
83 if (vertices != null) {
84 Iterator<TitanVertex> iterator = vertices.iterator();
85 while (iterator.hasNext()) {
86 TitanVertex vertex = iterator.next();
91 titanGenericDao.commit();
95 public void testAddPolicyType() {
97 PolicyTypeDefinition policyTypePreCreate = createPolicyTypeDef();
98 assertTrue(StringUtils.isEmpty(policyTypePreCreate.getUniqueId()));
99 Either<PolicyTypeDefinition, StorageOperationStatus> addPolicyType = policyTypeOperation.addPolicyType(policyTypePreCreate);
100 assertTrue(addPolicyType.isLeft());
101 PolicyTypeDefinition policyTypePostCreate = addPolicyType.left().value();
102 assertEquals(policyTypePostCreate.getType(), policyTypePreCreate.getType());
103 assertEquals(policyTypePostCreate.getDescription(), policyTypePreCreate.getDescription());
105 assertTrue(!StringUtils.isEmpty(policyTypePostCreate.getUniqueId()));
109 public void testGetLatestPolicyTypeByType() {
110 PolicyTypeDefinition policyTypeCreated = policyTypeOperation.addPolicyType(createPolicyTypeDef()).left().value();
111 Either<PolicyTypeDefinition, StorageOperationStatus> eitherPolicyTypeFetched = policyTypeOperation.getLatestPolicyTypeByType(policyTypeCreated.getType());
112 assertTrue(eitherPolicyTypeFetched.isLeft());
113 PolicyTypeDefinition policyTypeFetched = eitherPolicyTypeFetched.left().value();
114 assertEquals(policyTypeFetched.toString(), policyTypeCreated.toString());
118 public void testGetLatestPolicyTypeByType_derivedFromFetchedCorrectly() {
119 PolicyTypeDefinition rootPolicyType = createRootPolicyTypeOnGraph();
120 String derivedFromRootType = rootPolicyType.getType();
121 PolicyTypeDefinition policyType1 = createPolicyTypeDef("tosca.policies.type1", "desc1", derivedFromRootType);
122 policyTypeOperation.addPolicyType(policyType1);
123 Either<PolicyTypeDefinition, StorageOperationStatus> eitherPolicyTypeFetched = policyTypeOperation.getLatestPolicyTypeByType(policyType1.getType());
124 assertThat(eitherPolicyTypeFetched.left().value().getDerivedFrom()).isEqualTo(rootPolicyType.getType());
128 public void testGetLatestPolicyTypeByType_whenGettingTypeGetPropertiesFromAllDerivedFromChain_policyTypeHasNoDirectProps() {
129 PropertyDefinition prop1 = createSimpleProperty("val1", "prop1", "string");
130 PropertyDefinition prop2 = createSimpleProperty("val2", "prop2", "string");
131 PolicyTypeDefinition policyType1 = createPolicyTypeDef("tosca.policies.type1", null, prop1, prop2);
132 PolicyTypeDefinition policyType2 = createPolicyTypeDef("tosca.policies.type2", "desc3", policyType1.getType(), null);
133 addPolicyTypesToDB(policyType1, policyType2);
134 Either<PolicyTypeDefinition, StorageOperationStatus> latestPolicyType2 = policyTypeOperation.getLatestPolicyTypeByType(policyType2.getType());
135 assertThat(latestPolicyType2.isLeft());
136 assertThat(latestPolicyType2.left().value().getProperties())
137 .usingElementComparatorOnFields("defaultValue", "name", "type")
138 .containsExactlyInAnyOrder(prop1, prop2);
142 public void testGetLatestPolicyTypeByType_whenGettingTypeGetPropertiesFromAllDerivedFromChain() {
143 PropertyDefinition prop1 = createSimpleProperty("val1", "prop1", "string");
144 PropertyDefinition prop2 = createSimpleProperty("val2", "prop2", "string");
145 PropertyDefinition prop3 = createSimpleProperty("val3", "prop3", "string");
147 PolicyTypeDefinition rootPolicyType = createPolicyTypeDef(prop1);
148 PolicyTypeDefinition policyType1 = createPolicyTypeDef("tosca.policies.type1", "desc1", rootPolicyType.getType(), null);
149 PolicyTypeDefinition policyType2 = createPolicyTypeDef("tosca.policies.type2", "desc2", policyType1.getType(), prop2);
150 PolicyTypeDefinition policyType3 = createPolicyTypeDef("tosca.policies.type3", "desc3", policyType2.getType(), null);
151 PolicyTypeDefinition policyType4 = createPolicyTypeDef("tosca.policies.type4", "desc4", policyType3.getType(), prop3);
153 addPolicyTypesToDB(rootPolicyType, policyType1, policyType2, policyType3, policyType4);
155 Either<PolicyTypeDefinition, StorageOperationStatus> latestPolicyType3 = policyTypeOperation.getLatestPolicyTypeByType(policyType4.getType());
156 assertThat(latestPolicyType3.isLeft());
157 assertThat(latestPolicyType3.left().value().getProperties())
158 .usingElementComparatorOnFields("defaultValue", "name", "type")
159 .containsExactlyInAnyOrder(prop1, prop2, prop3);
163 public void getAllPolicyTypes_noPolicies() {
164 Either<List<PolicyTypeDefinition>, StorageOperationStatus> allPolicyTypes = policyTypeOperation.getAllPolicyTypes(null);
165 assertThat(allPolicyTypes.isRight());
166 assertThat(allPolicyTypes.right().value()).isEqualTo(StorageOperationStatus.NOT_FOUND);
170 public void getAllPolicyTypes() {
171 PolicyTypeDefinition policyType1 = createPolicyTypeDef();
172 PolicyTypeDefinition policyType2 = createPolicyTypeDef("tosca.policies.test1", "desc1", "tosca.policies.Root");
173 addPolicyTypesToDB(policyType1, policyType2);
174 Either<List<PolicyTypeDefinition>, StorageOperationStatus> allPolicyTypesWithNoExcluded = policyTypeOperation.getAllPolicyTypes(null);
175 assertThat(allPolicyTypesWithNoExcluded.left().value()).hasSize(2);
176 assertThat(allPolicyTypesWithNoExcluded.left().value()).usingElementComparatorOnFields("uniqueId", "description", "version", "type")
177 .containsExactlyInAnyOrder(policyType1, policyType2);
181 public void getAllPolicyTypes_whenPassingExcludedTypeList_dontReturnExcludedTypes() {
182 PolicyTypeDefinition policyType1 = createPolicyTypeDef();
183 PolicyTypeDefinition policyType2 = createPolicyTypeDef("tosca.policies.test1", "desc1", "tosca.policies.Root");
184 PolicyTypeDefinition policyType3 = createPolicyTypeDef("tosca.policies.test2", "desc2", "tosca.policies.Root");
185 policyTypeOperation.addPolicyType(policyType1);
186 policyTypeOperation.addPolicyType(policyType2);
187 policyTypeOperation.addPolicyType(policyType3);
188 Either<List<PolicyTypeDefinition>, StorageOperationStatus> allPolicyTypes = policyTypeOperation.getAllPolicyTypes(newHashSet("tosca.policies.test1", "tosca.policies.test2"));
189 assertThat(allPolicyTypes.left().value()).hasSize(1);
190 assertThat(allPolicyTypes.left().value()).usingElementComparatorOnFields("type")
191 .containsExactly(policyType1);
195 public void addPolicyType_whenDerivedFromNodeNotExist_returnNotFound() {
196 PolicyTypeDefinition type1 = createPolicyTypeDef("tosca.policies.type1", "desc1", "derivedFrom");
197 Either<PolicyTypeDefinition, StorageOperationStatus> addedPolicyTypeResult = policyTypeOperation.addPolicyType(type1);
198 assertThat(addedPolicyTypeResult.right().value()).isEqualTo(StorageOperationStatus.NOT_FOUND);
202 public void addPolicyType_derivedFromAddedCorrectly() {
203 PolicyTypeDefinition rootPolicyType = createRootPolicyTypeOnGraph();
204 String derivedFromRootType = rootPolicyType.getType();
205 PolicyTypeDefinition policyType1 = createPolicyTypeDef("tosca.policies.type1", "desc1", derivedFromRootType);
206 Either<PolicyTypeDefinition, StorageOperationStatus> addedPolicyTypeResult = policyTypeOperation.addPolicyType(policyType1);
207 assertThat(addedPolicyTypeResult.isLeft()).isTrue();
209 Either<PolicyTypeDefinition, StorageOperationStatus> fetchedPolicyType = policyTypeOperation.getLatestPolicyTypeByType(policyType1.getType());
210 PolicyTypeDefinition fetchedPolicyTypeVal = fetchedPolicyType.left().value();
211 assertThat(fetchedPolicyTypeVal.getDerivedFrom()).isEqualTo(derivedFromRootType);
212 verifyDerivedFromNodeEqualsToRootPolicyType(rootPolicyType, fetchedPolicyTypeVal.getUniqueId());
217 public void updatePolicyType_returnNotFoundErrorIfTryingToUpdateANonExistingType() {
218 PolicyTypeDefinition currType = createPolicyTypeDef();
219 PolicyTypeDefinition updatedType = createPolicyTypeDef();
220 Either<PolicyTypeDefinition, StorageOperationStatus> updatePolicyTypeRes = policyTypeOperation.updatePolicyType(updatedType, currType);
221 assertThat(updatePolicyTypeRes.right().value()).isEqualTo(StorageOperationStatus.NOT_FOUND);
225 public void updatePolicyType_basicFields() {
226 PolicyTypeDefinition createdType = createPolicyTypeDef("type1", "description1", NULL_STRING);
227 Either<PolicyTypeDefinition, StorageOperationStatus> currPolicyType = policyTypeOperation.addPolicyType(createdType);
229 PolicyTypeDefinition updatedType = createPolicyTypeDef("type1", "description2", NULL_STRING);
230 policyTypeOperation.updatePolicyType(updatedType, currPolicyType.left().value());
232 Either<PolicyTypeDefinition, StorageOperationStatus> fetchedUpdatedType = policyTypeOperation.getLatestPolicyTypeByType(createdType.getType());
233 PolicyTypeDefinition fetchedPolicyType = fetchedUpdatedType.left().value();
234 assertThat(fetchedPolicyType.getProperties()).isEmpty();
235 assertThat(fetchedPolicyType)
236 .isEqualToIgnoringGivenFields(updatedType, "properties");
241 public void updatePolicyType_updateProperties() {
242 PropertyDefinition prop1 = createSimpleProperty("val1", "prop1", "string");
243 PolicyTypeDefinition policyType = createPolicyTypeDef(prop1);
244 Either<PolicyTypeDefinition, StorageOperationStatus> currPolicyType = policyTypeOperation.addPolicyType(policyType);
246 PropertyDefinition updatedProp1 = duplicateProperty(prop1, "newVal1", "int");
247 PropertyDefinition prop2 = createSimpleProperty("val2", "prop2", "string");
248 PolicyTypeDefinition updatedPolicyType = createPolicyTypeDef(updatedProp1, prop2);
250 policyTypeOperation.updatePolicyType(updatedPolicyType, currPolicyType.left().value());
252 Either<PolicyTypeDefinition, StorageOperationStatus> fetchedUpdatedType = policyTypeOperation.getLatestPolicyTypeByType(policyType.getType());
253 assertThat(fetchedUpdatedType.left().value().getProperties())
254 .usingElementComparatorOnFields("name", "defaultValue", "type")
255 .containsExactlyInAnyOrder(updatedProp1, prop2);
260 public void updatePolicyType_derivedFrom_whenNoPrevDerivedFrom_updateToNewDerivedFrom() {
261 PolicyTypeDefinition rootPolicyType = createPolicyTypeDef();
262 PolicyTypeDefinition policyType1 = createPolicyTypeDef("type1", "descr", NULL_STRING);
263 PolicyTypeDefinition updatedPolicyType = createPolicyTypeDef("type1", "descr", rootPolicyType.getType());
264 policyTypeOperation.addPolicyType(rootPolicyType);
265 Either<PolicyTypeDefinition, StorageOperationStatus> currPolicyType = policyTypeOperation.addPolicyType(policyType1);
266 policyTypeOperation.updatePolicyType(updatedPolicyType, currPolicyType.left().value());
268 Either<PolicyTypeDefinition, StorageOperationStatus> latestPolicyType = policyTypeOperation.getLatestPolicyTypeByType(policyType1.getType());
269 assertThat(latestPolicyType.left().value().getDerivedFrom()).isEqualTo(rootPolicyType.getType());
270 verifyDerivedFromNodeEqualsToRootPolicyType(rootPolicyType, latestPolicyType.left().value().getUniqueId());
274 public void updatePolicyType_derivedFrom_updateToNullDerivedFrom_derivedFromDeleted() {
275 PolicyTypeDefinition rootPolicyType = createPolicyTypeDef();
276 PolicyTypeDefinition policyType1 = createPolicyTypeDef("type1", "descr", rootPolicyType.getType());
277 PolicyTypeDefinition updatedPolicyType = createPolicyTypeDef("type1", "descr", null, new PropertyDefinition[]{});
278 policyTypeOperation.addPolicyType(rootPolicyType);
279 Either<PolicyTypeDefinition, StorageOperationStatus> currPolicyType = policyTypeOperation.addPolicyType(policyType1);
281 policyTypeOperation.updatePolicyType(updatedPolicyType, currPolicyType.left().value());
283 Either<PolicyTypeDefinition, StorageOperationStatus> latestPolicyType = policyTypeOperation.getLatestPolicyTypeByType(policyType1.getType());
284 assertThat(latestPolicyType.left().value().getDerivedFrom()).isNull();
285 verifyDerivedFromRelationDoesntExist(latestPolicyType.left().value().getUniqueId());
289 public void updatePolicyType_updateDerivedFrom() {
290 PolicyTypeDefinition rootPolicyType = createPolicyTypeDef();
291 PolicyTypeDefinition derivedType1 = createPolicyTypeDef("derivedType1", "descr", NULL_STRING);
292 PolicyTypeDefinition policyType1 = createPolicyTypeDef("type1", "descr", derivedType1.getType());
293 PolicyTypeDefinition updatedPolicyType = createPolicyTypeDef("type1", "descr", rootPolicyType.getType());
295 policyTypeOperation.addPolicyType(rootPolicyType);
296 policyTypeOperation.addPolicyType(derivedType1);
297 Either<PolicyTypeDefinition, StorageOperationStatus> currPolicyType = policyTypeOperation.addPolicyType(policyType1);
299 policyTypeOperation.updatePolicyType(updatedPolicyType, currPolicyType.left().value());
301 Either<PolicyTypeDefinition, StorageOperationStatus> latestPolicyType = policyTypeOperation.getLatestPolicyTypeByType(policyType1.getType());
302 assertThat(latestPolicyType.left().value().getDerivedFrom()).isEqualTo(rootPolicyType.getType());
303 verifyDerivedFromNodeEqualsToRootPolicyType(rootPolicyType, latestPolicyType.left().value().getUniqueId());
306 private PropertyDefinition duplicateProperty(PropertyDefinition prop1, String updatedValue, String updatedType) {
307 PropertyDefinition updatedProp1 = new PropertyDefinition(prop1);
308 updatedProp1.setUniqueId(null);
309 updatedProp1.setDefaultValue(updatedValue);
310 updatedProp1.setType(updatedType);
314 private PropertyDefinition createSimpleProperty(String defaultValue, String name, String type) {
315 PropertyDefinition prop1 = new PropertyDefinition();
316 prop1.setDefaultValue(defaultValue);
322 private void verifyDerivedFromNodeEqualsToRootPolicyType(PolicyTypeDefinition rootPolicyType, String parentPolicyId) {
323 Either<ImmutablePair<PolicyTypeData, GraphEdge>, TitanOperationStatus> derivedFromRelation = titanGenericDao.getChild(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.PolicyType), parentPolicyId, GraphEdgeLabels.DERIVED_FROM,
324 NodeTypeEnum.PolicyType, PolicyTypeData.class);
325 assertThat(derivedFromRelation.left().value().getLeft().getPolicyTypeDataDefinition())
326 .isEqualToComparingFieldByField(rootPolicyType);
329 private void verifyDerivedFromRelationDoesntExist(String parentPolicyId) {
330 Either<ImmutablePair<PolicyTypeData, GraphEdge>, TitanOperationStatus> derivedFromRelation = titanGenericDao.getChild(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.PolicyType), parentPolicyId, GraphEdgeLabels.DERIVED_FROM,
331 NodeTypeEnum.PolicyType, PolicyTypeData.class);
332 assertThat(derivedFromRelation.right().value())
333 .isEqualTo(TitanOperationStatus.NOT_FOUND);
336 private PolicyTypeDefinition createRootPolicyTypeOnGraph() {
337 PolicyTypeDefinition rootPolicyType = createPolicyTypeDef();
338 policyTypeOperation.addPolicyType(rootPolicyType);
339 return rootPolicyType;
343 private PolicyTypeDefinition createPolicyTypeDef() {
344 return createPolicyTypeDef("tosca.policies.Root", "description: The TOSCA Policy Type all other TOSCA Policy Types derive from", null, new PropertyDefinition[]{});
347 private PolicyTypeDefinition createPolicyTypeDef(PropertyDefinition ... props) {
348 return createPolicyTypeDef("tosca.policies.Root", null, props);
351 private PolicyTypeDefinition createPolicyTypeDef(String type, String derivedFrom, PropertyDefinition ... props) {
352 PolicyTypeDefinition policyType = createPolicyTypeDef(type, "description: The TOSCA Policy Type all other TOSCA Policy Types derive from", derivedFrom);
353 policyType.setProperties(asList(props));
357 private PolicyTypeDefinition createPolicyTypeDef(String type, String description, String derivedFrom) {
358 return createPolicyTypeDef(type, description, derivedFrom, null);
361 private PolicyTypeDefinition createPolicyTypeDef(String type, String description, String derivedFrom, PropertyDefinition ... props) {
362 PolicyTypeDataDefinition policyTypeDataDefinition = new PolicyTypeDataDefinition();
363 policyTypeDataDefinition.setDescription(description);
364 policyTypeDataDefinition.setType(type);
365 policyTypeDataDefinition.setDerivedFrom(derivedFrom);
366 PolicyTypeDefinition policyTypeDefinition = new PolicyTypeDefinition(policyTypeDataDefinition);
367 policyTypeDefinition.setHighestVersion(true);
368 policyTypeDefinition.setVersion("1.0");
370 policyTypeDefinition.setProperties(asList(props));
372 return policyTypeDefinition;
375 private void addPolicyTypesToDB(PolicyTypeDefinition ... policyTypeDefinitions) {
376 Stream.of(policyTypeDefinitions).forEach(policyTypeOperation::addPolicyType);