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.aai.introspection.sideeffect;
23 import static org.junit.Assert.assertEquals;
24 import static org.mockito.Mockito.spy;
25 import static org.mockito.Mockito.when;
27 import java.io.UnsupportedEncodingException;
28 import java.lang.reflect.InvocationTargetException;
29 import java.net.MalformedURLException;
30 import java.net.URISyntaxException;
31 import java.util.List;
33 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
34 import org.apache.tinkerpop.gremlin.structure.Vertex;
35 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
36 import org.junit.AfterClass;
37 import org.junit.Before;
38 import org.junit.BeforeClass;
39 import org.junit.Rule;
40 import org.junit.Test;
41 import org.junit.rules.ExpectedException;
42 import org.mockito.Mock;
43 import org.mockito.MockitoAnnotations;
45 import org.openecomp.aai.db.props.AAIProperties;
46 import org.openecomp.aai.dbmap.DBConnectionType;
47 import org.openecomp.aai.exceptions.AAIException;
48 import org.openecomp.aai.introspection.Introspector;
49 import org.openecomp.aai.introspection.Loader;
50 import org.openecomp.aai.introspection.LoaderFactory;
51 import org.openecomp.aai.introspection.ModelType;
52 import org.openecomp.aai.introspection.Version;
53 import org.openecomp.aai.parsers.query.QueryParser;
54 import org.openecomp.aai.serialization.db.DBSerializer;
55 import org.openecomp.aai.serialization.engines.QueryStyle;
56 import org.openecomp.aai.serialization.engines.TitanDBEngine;
57 import org.openecomp.aai.serialization.engines.TransactionalGraphEngine;
58 import org.openecomp.aai.serialization.queryformats.QueryFormatTestHelper;
59 import org.openecomp.aai.util.AAIConstants;
60 import com.thinkaurelius.titan.core.TitanFactory;
61 import com.thinkaurelius.titan.core.TitanGraph;
62 import com.thinkaurelius.titan.core.TitanTransaction;
64 public class DataLinkTest {
66 private static TitanGraph graph;
67 private final static Version version = Version.v10;
68 private final static ModelType introspectorFactoryType = ModelType.MOXY;
69 private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
70 private final static DBConnectionType type = DBConnectionType.REALTIME;
71 private static Loader loader;
72 private static TransactionalGraphEngine dbEngine;
73 @Mock private QueryParser parser;
74 @Mock private Vertex self;
75 @Mock private VertexProperty<String> prop;
77 public ExpectedException thrown = ExpectedException.none();
81 public static void setup() throws NoSuchFieldException, SecurityException, Exception {
82 graph = TitanFactory.build().set("storage.backend","inmemory").open();
83 System.setProperty("AJSC_HOME", "./src/test/resources/");
84 System.setProperty("BUNDLECONFIG_DIR", "bundleconfig-local");
85 QueryFormatTestHelper.setFinalStatic(AAIConstants.class.getField("AAI_HOME_ETC_OXM"), "src/test/resources/org/openecomp/aai/introspection/");
86 loader = LoaderFactory.createLoaderForVersion(introspectorFactoryType, version);
87 dbEngine = new TitanDBEngine(
92 graph.traversal().addV("aai-node-type", "vpn-binding", "vpn-id", "addKey").as("v1")
93 .addV("aai-node-type", "vpn-binding", "vpn-id", "modifyKey").as("v2")
94 .addV("aai-node-type", "route-target", "global-route-target", "modifyTargetKey", "route-target-role", "modifyRoleKey", "linked", true).addInE("has", "v2", "isParent", true)
95 .addV("aai-node-type", "vpn-binding", "vpn-id", "deleteKey").as("v3")
96 .addV("aai-node-type", "route-target", "global-route-target", "deleteTargetKey", "route-target-role", "deleteRoleKey", "linked", true).addInE("has", "v3", "isParent", true)
97 .addV("aai-node-type", "vpn-binding", "vpn-id", "getKey").as("v4")
98 .addV("aai-node-type", "route-target", "global-route-target", "getTargetKey", "route-target-role", "getRoleKey", "linked", true).addInE("has", "v4", "isParent", true)
99 .addV("aai-node-type", "vpn-binding", "vpn-id", "getKeyNoLink").as("v5")
100 .addV("aai-node-type", "route-target", "global-route-target", "getTargetKeyNoLink", "route-target-role", "getRoleKeyNoLink").addInE("has", "v5", "isParent", true)
106 public static void tearDown() {
107 graph.tx().rollback();
112 public void initMock() {
113 MockitoAnnotations.initMocks(this);
117 public void verifyCreationOfVertex() throws URISyntaxException, AAIException, UnsupportedEncodingException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, InstantiationException, NoSuchMethodException, MalformedURLException {
119 final Loader loader = LoaderFactory.createLoaderForVersion(ModelType.MOXY, Version.v9);
120 final Introspector obj = loader.introspectorFromName("vpn-binding");
121 obj.setValue("vpn-id", "addKey");
122 obj.setValue("global-route-target", "key1");
123 obj.setValue("route-target-role", "key2");
124 TransactionalGraphEngine spy = spy(dbEngine);
125 TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
126 TitanTransaction g = graph.newTransaction();
127 GraphTraversalSource traversal = g.traversal();
128 when(spy.asAdmin()).thenReturn(adminSpy);
129 when(adminSpy.getTraversalSource()).thenReturn(traversal);
130 when(spy.tx()).thenReturn(g);
131 when(self.<String>property(AAIProperties.AAI_URI)).thenReturn(prop);
132 when(prop.orElse(null)).thenReturn(obj.getURI());
133 DBSerializer serializer = new DBSerializer(version, spy, introspectorFactoryType, "AAI_TEST");
134 SideEffectRunner runner = new SideEffectRunner
135 .Builder(spy, serializer).addSideEffect(DataLinkWriter.class).build();
137 runner.execute(obj, self);
139 assertEquals("route-target vertex found", true, traversal.V()
140 .has(AAIProperties.NODE_TYPE, "route-target").has("global-route-target", "key1").has("route-target-role", "key2").has("linked", true).hasNext());
147 public void verifyModificationOfVertex() throws URISyntaxException, AAIException, UnsupportedEncodingException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, InstantiationException, NoSuchMethodException, MalformedURLException {
149 final Loader loader = LoaderFactory.createLoaderForVersion(ModelType.MOXY, Version.v9);
150 final Introspector obj = loader.introspectorFromName("vpn-binding");
151 obj.setValue("vpn-id", "modifyKey");
152 obj.setValue("global-route-target", "modifyTargetKey2");
153 obj.setValue("route-target-role", "modifyRoleKey2");
154 TransactionalGraphEngine spy = spy(dbEngine);
155 TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
156 TitanTransaction g = graph.newTransaction();
157 GraphTraversalSource traversal = g.traversal();
158 when(spy.asAdmin()).thenReturn(adminSpy);
159 when(adminSpy.getTraversalSource()).thenReturn(traversal);
160 when(spy.tx()).thenReturn(g);
161 when(self.<String>property(AAIProperties.AAI_URI)).thenReturn(prop);
162 when(prop.orElse(null)).thenReturn(obj.getURI());
163 DBSerializer serializer = new DBSerializer(version, spy, introspectorFactoryType, "AAI_TEST");
164 SideEffectRunner runner = new SideEffectRunner
165 .Builder(spy, serializer).addSideEffect(DataLinkWriter.class).build();
167 runner.execute(obj, self);
169 assertEquals("route-target vertex found", true, traversal.V()
170 .has(AAIProperties.NODE_TYPE, "route-target").has("global-route-target", "modifyTargetKey2").has("route-target-role", "modifyRoleKey2").has("linked", true).hasNext());
171 assertEquals("previous link removed", true, traversal.V()
172 .has(AAIProperties.NODE_TYPE, "route-target").has("global-route-target", "modifyTargetKey").has("route-target-role", "modifyRoleKey").hasNot("linked").hasNext());
178 public void verifyDeleteOfVertex() throws URISyntaxException, AAIException, UnsupportedEncodingException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, InstantiationException, NoSuchMethodException, MalformedURLException {
180 final Loader loader = LoaderFactory.createLoaderForVersion(ModelType.MOXY, Version.v9);
181 final Introspector obj = loader.introspectorFromName("vpn-binding");
182 obj.setValue("vpn-id", "deleteKey");
183 TransactionalGraphEngine spy = spy(dbEngine);
184 TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
185 TitanTransaction g = graph.newTransaction();
186 GraphTraversalSource traversal = g.traversal();
187 when(spy.asAdmin()).thenReturn(adminSpy);
188 when(adminSpy.getTraversalSource()).thenReturn(traversal);
189 when(spy.tx()).thenReturn(g);
190 when(self.<String>property(AAIProperties.AAI_URI)).thenReturn(prop);
191 when(prop.orElse(null)).thenReturn(obj.getURI());
192 DBSerializer serializer = new DBSerializer(version, spy, introspectorFactoryType, "AAI_TEST");
193 SideEffectRunner runner = new SideEffectRunner
194 .Builder(spy, serializer).addSideEffect(DataLinkWriter.class).build();
196 runner.execute(obj, self);
198 assertEquals("route-target vertex not found", false, traversal.V()
199 .has(AAIProperties.NODE_TYPE, "route-target").has("global-route-target", "deleteTargetKey").has("route-target-role", "deleteRoleKey").has("linked", true).hasNext());
205 public void verifyPropertyPopulation() throws URISyntaxException, AAIException, UnsupportedEncodingException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, InstantiationException, NoSuchMethodException, MalformedURLException {
207 final Loader loader = LoaderFactory.createLoaderForVersion(ModelType.MOXY, Version.v9);
208 final Introspector obj = loader.introspectorFromName("vpn-binding");
209 obj.setValue("vpn-id", "getKey");
210 TransactionalGraphEngine spy = spy(dbEngine);
211 TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
212 TitanTransaction g = graph.newTransaction();
213 GraphTraversalSource traversal = g.traversal();
214 when(spy.asAdmin()).thenReturn(adminSpy);
215 when(adminSpy.getTraversalSource()).thenReturn(traversal);
216 when(spy.tx()).thenReturn(g);
217 when(self.<String>property(AAIProperties.AAI_URI)).thenReturn(prop);
218 when(prop.orElse(null)).thenReturn(obj.getURI());
219 DBSerializer serializer = new DBSerializer(version, spy, introspectorFactoryType, "AAI_TEST");
220 SideEffectRunner runner = new SideEffectRunner
221 .Builder(spy, serializer).addSideEffect(DataLinkReader.class).build();
223 runner.execute(obj, self);
225 assertEquals("both properties have been populated in target object", true, obj.getValue("global-route-target").equals("getTargetKey") && obj.getValue("route-target-role").equals("getRoleKey"));
231 public void verifyPropertyPopulationWithV10OnlyPut() throws URISyntaxException, AAIException, UnsupportedEncodingException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, InstantiationException, NoSuchMethodException, MalformedURLException {
232 final Introspector obj = loader.introspectorFromName("vpn-binding");
233 obj.setValue("vpn-id", "getKeyNoLink");
234 final Introspector routeTargets = loader.introspectorFromName("route-targets");
235 obj.setValue("route-targets", routeTargets.getUnderlyingObject());
236 List<Object> targets = routeTargets.getValue("route-target");
237 final Introspector routeTargetOne = loader.introspectorFromName("route-target");
238 routeTargetOne.setValue("global-route-target", "getTargetKeyNoLink");
239 routeTargetOne.setValue("route-target-role", "getRoleKeyNoLink");
240 targets.add(routeTargetOne.getUnderlyingObject());
241 final Introspector routeTargetTwo = loader.introspectorFromName("route-target");
242 routeTargetTwo.setValue("global-route-target", "getTargetKeyNoLink2");
243 routeTargetTwo.setValue("route-target-role", "getRoleKeyNoLink2");
244 targets.add(routeTargetTwo.getUnderlyingObject());
245 TransactionalGraphEngine spy = spy(dbEngine);
246 TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
247 TitanTransaction g = graph.newTransaction();
248 GraphTraversalSource traversal = g.traversal();
249 when(spy.tx()).thenReturn(g);
250 when(spy.asAdmin()).thenReturn(adminSpy);
251 when(adminSpy.getTraversalSource()).thenReturn(traversal);
252 when(spy.tx()).thenReturn(g);
253 when(parser.isDependent()).thenReturn(false);
254 when(self.<String>property(AAIProperties.AAI_URI)).thenReturn(prop);
255 when(prop.orElse(null)).thenReturn(obj.getURI());
256 DBSerializer serializer = new DBSerializer(version, spy, introspectorFactoryType, "AAI_TEST");
257 Vertex v = serializer.createNewVertex(obj);
258 serializer.serializeToDb(obj, v, parser, obj.getURI(), "testing");
259 Vertex routeTargetOneV = traversal.V().has("global-route-target", "getTargetKeyNoLink").next();
260 Vertex routeTargetTwoV = traversal.V().has("global-route-target", "getTargetKeyNoLink2").next();
262 assertEquals("first route target put has linked", true, routeTargetOneV.property(AAIProperties.LINKED).orElse(false));
263 assertEquals("second route target put does not have linked", false, routeTargetTwoV.property(AAIProperties.LINKED).orElse(false));