2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright © 2017-2018 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 package org.onap.aai.serialization.db;
22 import org.apache.tinkerpop.gremlin.structure.Vertex;
23 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
24 import org.hamcrest.CoreMatchers;
25 import org.junit.Before;
26 import org.junit.Rule;
27 import org.junit.Test;
28 import org.mockito.Matchers;
29 import org.mockito.Mockito;
30 import org.onap.aai.exceptions.AAIException;
31 import org.onap.aai.introspection.Introspector;
32 import org.onap.aai.serialization.engines.TransactionalGraphEngine;
33 import org.onap.aai.serialization.engines.query.QueryEngine;
34 import org.onap.aai.util.AAIConstants;
35 import org.springframework.boot.test.rule.OutputCapture;
37 import java.io.UnsupportedEncodingException;
38 import java.util.ArrayList;
39 import java.util.List;
41 import static org.mockito.Matchers.eq;
43 public class ImpliedDeleteUnitTest {
45 private TransactionalGraphEngine mockEngine;
46 private DBSerializer mockSerializer;
48 private ImpliedDelete impliedDelete;
51 public final OutputCapture outputCapture = new OutputCapture();
55 mockEngine = Mockito.mock(TransactionalGraphEngine.class);
56 mockSerializer = Mockito.mock(DBSerializer.class);
57 impliedDelete = Mockito.spy(new ImpliedDelete(mockEngine, mockSerializer));
60 // aai.implied.delete.whitelist.sdnc=*
62 public void testImpliedDeleteWhenUserIsAllowedToInvokeAnyMethod() throws AAIException {
64 QueryEngine mockQueryEngine = Mockito.mock(QueryEngine.class);
69 .get(AAIConstants.AAI_IMPLIED_DELETE_WHITELIST + "sdnc","");
71 Mockito.when(mockEngine.getQueryEngine()).thenReturn(mockQueryEngine);
73 TinkerGraph graph = TinkerGraph.open();
75 Vertex vserver = graph.addVertex("vertex");
76 vserver.property("vserver-id", "some-id");
78 Vertex volume = graph.addVertex("vertex");
79 volume.property("volume-id", "some-id");
81 List<Vertex> vertices = new ArrayList<>();
84 impliedDelete.execute(vserver.id(), "SDNC", "vserver", vertices);
88 // aai.implied.delete.whitelist.sdnc='vserver'
90 public void testImpliedDeleteWhenUserIsAllowedToInvokeCertainMethod() throws AAIException {
92 QueryEngine mockQueryEngine = Mockito.mock(QueryEngine.class);
95 .doReturn("'vserver'")
97 .get(AAIConstants.AAI_IMPLIED_DELETE_WHITELIST + "sdnc","");
99 Mockito.when(mockEngine.getQueryEngine()).thenReturn(mockQueryEngine);
101 TinkerGraph graph = TinkerGraph.open();
103 Vertex vserver = graph.addVertex("vertex");
104 vserver.property("vserver-id", "some-id");
106 Vertex volume = graph.addVertex("vertex");
107 volume.property("volume-id", "some-id");
109 List<Vertex> vertices = new ArrayList<>();
110 vertices.add(volume);
112 impliedDelete.execute(vserver.id(), "SDNC", "vserver", vertices);
115 // aai.implied.delete.whitelist.sdnc='vserver'
117 public void testImpliedDeleteWhenUserIsAllowedAndTryVariationsOfSOTValueSDNC() throws AAIException {
119 QueryEngine mockQueryEngine = Mockito.mock(QueryEngine.class);
122 .doReturn("'vserver'")
124 .get(AAIConstants.AAI_IMPLIED_DELETE_WHITELIST + "sdnc","");
126 Mockito.when(mockEngine.getQueryEngine()).thenReturn(mockQueryEngine);
128 TinkerGraph graph = TinkerGraph.open();
130 Vertex vserver = graph.addVertex("vertex");
131 vserver.property("vserver-id", "some-id");
133 Vertex volume = graph.addVertex("vertex");
134 volume.property("volume-id", "some-id");
136 List<Vertex> vertices = new ArrayList<>();
137 vertices.add(volume);
139 impliedDelete.execute(vserver.id(), "SDNC", "vserver", vertices);
140 impliedDelete.execute(vserver.id(), "sDNC", "vserver", vertices);
141 impliedDelete.execute(vserver.id(), "sdNC", "vserver", vertices);
142 impliedDelete.execute(vserver.id(), "sdnC", "vserver", vertices);
143 impliedDelete.execute(vserver.id(), "sdnc", "vserver", vertices);
146 // aai.implied.delete.whitelist.sdnc='vserver','vce','pserver'
148 public void testImpliedDeleteWhenUserIsAllowedToInvokeMultipleMethods() throws AAIException {
150 QueryEngine mockQueryEngine = Mockito.mock(QueryEngine.class);
153 .doReturn("'vce','pserver','vserver','cloud-region'")
155 .get(AAIConstants.AAI_IMPLIED_DELETE_WHITELIST + "sdnc","");
157 Mockito.when(mockEngine.getQueryEngine()).thenReturn(mockQueryEngine);
159 TinkerGraph graph = TinkerGraph.open();
161 Vertex vserver = graph.addVertex("vertex");
162 vserver.property("vserver-id", "some-id");
164 Vertex volume = graph.addVertex("vertex");
165 volume.property("volume-id", "some-id");
167 List<Vertex> vertices = new ArrayList<>();
168 vertices.add(volume);
170 impliedDelete.execute(vserver.id(), "SDNC", "vserver", vertices);
173 // aai.implied.delete.whitelist.sdnc='vserver','vce','pserver'
175 public void testImpliedDeleteWhenUserIsAllowedToInvokeMultipleMethodsAndDeletableReturnsMultipleVertexes()
176 throws AAIException, UnsupportedEncodingException {
178 QueryEngine mockQueryEngine = Mockito.mock(QueryEngine.class);
180 // On a spy the syntax should be doReturn => when => method to spy
181 // On a mock the syntax should be when => thenReturn|thenAnswer
183 .doReturn("'vserver'")
185 .get(AAIConstants.AAI_IMPLIED_DELETE_WHITELIST + "sdnc","");
188 Introspector mockIntrospector = Mockito.mock(Introspector.class);
190 Mockito.when(mockEngine.getQueryEngine()).thenReturn(mockQueryEngine);
192 TinkerGraph graph = TinkerGraph.open();
194 Vertex vserver = graph.addVertex("vertex");
195 vserver.property("vserver-id", "some-id");
197 Vertex volume1 = graph.addVertex("vertex");
198 volume1.property("volume-id", "volume-1");
200 Vertex volume2 = graph.addVertex("vertex");
201 volume1.property("volume-id", "volume-2");
203 Vertex volume3 = graph.addVertex("vertex");
204 volume1.property("volume-id", "volume-3");
206 Vertex volume4 = graph.addVertex("vertex");
207 volume1.property("volume-id", "volume-4");
209 List<Vertex> vertices = new ArrayList<>();
211 vertices.add(volume1);
212 vertices.add(volume2);
213 vertices.add(volume3);
214 vertices.add(volume4);
217 .when(mockQueryEngine.findDeletable(Mockito.anyList()))
218 .thenReturn(vertices);
221 .when(mockSerializer.getLatestVersionView(Mockito.anyObject()))
222 .thenReturn(mockIntrospector);
225 .when(mockIntrospector.marshal(false))
226 .thenReturn("{\"volume-id\":\"volume-1\"}")
227 .thenReturn("{\"volume-id\":\"volume-2\"}")
228 .thenReturn("{\"volume-id\":\"volume-3\"}")
229 .thenReturn("{\"volume-id\":\"volume-4\"}");
231 impliedDelete.execute(vserver.id(), "SDNC", "vserver", vertices);
234 // aai.implied.delete.whitelist.sdnc=
235 @Test(expected = AAIException.class)
236 public void testImpliedDeleteWhenUserIsNotAllowedToDelete() throws AAIException {
238 QueryEngine mockQueryEngine = Mockito.mock(QueryEngine.class);
243 .get(AAIConstants.AAI_IMPLIED_DELETE_WHITELIST + "sdnc","");
245 Mockito.when(mockEngine.getQueryEngine()).thenReturn(mockQueryEngine);
247 TinkerGraph graph = TinkerGraph.open();
249 Vertex vserver = graph.addVertex("vertex");
250 vserver.property("vserver-id", "some-id");
252 Vertex volume = graph.addVertex("vertex");
253 volume.property("volume-id", "some-id");
255 List<Vertex> vertices = new ArrayList<>();
256 vertices.add(volume);
258 impliedDelete.execute(vserver.id(), "SDNC", "vserver", vertices);
261 // aai.implied.delete.whitelist.sdnc='vce'
262 @Test(expected = AAIException.class)
263 public void testImpliedDeleteWhenUserIsAllowedToDeleteVceChildrenButRequestedToDeleteVserverChildren() throws AAIException {
265 QueryEngine mockQueryEngine = Mockito.mock(QueryEngine.class);
270 .get(AAIConstants.AAI_IMPLIED_DELETE_WHITELIST + "sdnc","");
272 Mockito.when(mockEngine.getQueryEngine()).thenReturn(mockQueryEngine);
274 TinkerGraph graph = TinkerGraph.open();
276 Vertex vserver = graph.addVertex("vertex");
277 vserver.property("vserver-id", "some-id");
279 Vertex volume = graph.addVertex("vertex");
280 volume.property("volume-id", "some-id");
282 List<Vertex> vertices = new ArrayList<>();
283 vertices.add(volume);
285 impliedDelete.execute(vserver.id(), "SDNC", "vserver", vertices);
289 public void testImpliedDeleteWhenUserIsAllowedToDeleteAndPrintingDeletingVertexItThrowsExceptionVerifyLog() throws AAIException, UnsupportedEncodingException {
291 QueryEngine mockQueryEngine = Mockito.mock(QueryEngine.class);
293 // On a spy the syntax should be doReturn => when => method to spy
294 // On a mock the syntax should be when => thenReturn|thenAnswer
296 .doReturn("'vserver'")
298 .get(AAIConstants.AAI_IMPLIED_DELETE_WHITELIST + "sdnc","");
301 Introspector mockIntrospector = Mockito.mock(Introspector.class);
303 Mockito.when(mockEngine.getQueryEngine()).thenReturn(mockQueryEngine);
305 TinkerGraph graph = TinkerGraph.open();
307 Vertex vserver = graph.addVertex("vertex");
308 vserver.property("vserver-id", "some-id");
310 Vertex volume1 = graph.addVertex("vertex");
311 volume1.property("volume-id", "volume-1");
313 List<Vertex> vertices = new ArrayList<>();
315 vertices.add(volume1);
318 .when(mockQueryEngine.findDeletable(Mockito.anyList()))
319 .thenReturn(vertices);
322 .when(mockSerializer.getLatestVersionView(Mockito.anyObject()))
323 .thenThrow(new RuntimeException("Unable to find node"));
325 impliedDelete.execute(vserver.id(), "SDNC", "vserver", vertices);
327 outputCapture.expect(
328 CoreMatchers.containsString("Encountered an exception during retrieval of vertex properties with vertex-id " + vserver.id())