063a7c15daf0cefb8c1190a6b4a3c2c4036fd4df
[aai/aai-common.git] / aai-core / src / test / java / org / openecomp / aai / introspection / sideeffect / DataLinkTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * org.openecomp.aai
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
10
11      http://www.apache.org/licenses/LICENSE-2.0
12
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=========================================================
19  */
20
21 package org.openecomp.aai.introspection.sideeffect;
22
23 import static org.junit.Assert.assertEquals;
24 import static org.mockito.Mockito.spy;
25 import static org.mockito.Mockito.when;
26
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;
32
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;
44
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;
63
64 public class DataLinkTest {
65
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;
76         @Rule
77         public ExpectedException thrown = ExpectedException.none();
78         
79         
80         @BeforeClass
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(
88                                 queryStyle,
89                                 type,
90                                 loader);
91                 
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)
101                 .next();
102                 graph.tx().commit();
103         }
104         
105         @AfterClass
106         public static void tearDown() {
107                 graph.tx().rollback();
108                 graph.close();
109         }
110         
111         @Before
112         public void initMock() {
113                 MockitoAnnotations.initMocks(this);
114         }
115         
116         @Test
117         public void verifyCreationOfVertex() throws URISyntaxException, AAIException, UnsupportedEncodingException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, InstantiationException, NoSuchMethodException, MalformedURLException {
118                 
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();
136                 
137                 runner.execute(obj, self);
138
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());
141                 
142                 g.rollback();
143                 
144         }
145         
146         @Test
147         public void verifyModificationOfVertex() throws URISyntaxException, AAIException, UnsupportedEncodingException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, InstantiationException, NoSuchMethodException, MalformedURLException {
148                 
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();
166                 
167                 runner.execute(obj, self);
168
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());
173                 g.rollback();
174                 
175         }
176         
177         @Test
178         public void verifyDeleteOfVertex() throws URISyntaxException, AAIException, UnsupportedEncodingException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, InstantiationException, NoSuchMethodException, MalformedURLException {
179                 
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();
195                 
196                 runner.execute(obj, self);
197
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());
200                 g.rollback();
201                 
202         }
203         
204         @Test
205         public void verifyPropertyPopulation() throws URISyntaxException, AAIException, UnsupportedEncodingException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, InstantiationException, NoSuchMethodException, MalformedURLException {
206                 
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();
222                 
223                 runner.execute(obj, self);
224
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"));
226                 g.rollback();
227                 
228         }
229         
230         @Test
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();
261
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));
264
265                 g.rollback();
266                 
267         }
268 }