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=========================================================
21 package org.onap.aai.serialization.db;
23 import java.io.UnsupportedEncodingException;
24 import java.util.ArrayList;
25 import java.util.List;
27 import org.apache.tinkerpop.gremlin.structure.Vertex;
28 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
29 import org.hamcrest.CoreMatchers;
30 import org.junit.Before;
31 import org.junit.Rule;
32 import org.junit.Test;
33 import org.mockito.Mockito;
34 import org.onap.aai.exceptions.AAIException;
35 import org.onap.aai.introspection.Introspector;
36 import org.onap.aai.serialization.engines.TransactionalGraphEngine;
37 import org.onap.aai.serialization.engines.query.QueryEngine;
38 import org.onap.aai.util.AAIConstants;
39 import org.springframework.boot.test.rule.OutputCapture;
41 public class ImpliedDeleteUnitTest {
43 private TransactionalGraphEngine mockEngine;
44 private DBSerializer mockSerializer;
46 private ImpliedDelete impliedDelete;
49 public final OutputCapture outputCapture = new OutputCapture();
53 mockEngine = Mockito.mock(TransactionalGraphEngine.class);
54 mockSerializer = Mockito.mock(DBSerializer.class);
55 impliedDelete = Mockito.spy(new ImpliedDelete(mockEngine, mockSerializer));
58 // aai.implied.delete.whitelist.sdnc=*
60 public void testImpliedDeleteWhenUserIsAllowedToInvokeAnyMethod() throws AAIException {
62 QueryEngine mockQueryEngine = Mockito.mock(QueryEngine.class);
64 Mockito.doReturn("*").when(impliedDelete).get(AAIConstants.AAI_IMPLIED_DELETE_WHITELIST + "sdnc", "");
66 Mockito.when(mockEngine.getQueryEngine()).thenReturn(mockQueryEngine);
68 TinkerGraph graph = TinkerGraph.open();
70 Vertex vserver = graph.addVertex("vertex");
71 vserver.property("vserver-id", "some-id");
73 Vertex volume = graph.addVertex("vertex");
74 volume.property("volume-id", "some-id");
76 List<Vertex> vertices = new ArrayList<>();
79 impliedDelete.execute(vserver.id(), "SDNC", "vserver", vertices);
83 // aai.implied.delete.whitelist.sdnc='vserver'
85 public void testImpliedDeleteWhenUserIsAllowedToInvokeCertainMethod() throws AAIException {
87 QueryEngine mockQueryEngine = Mockito.mock(QueryEngine.class);
89 Mockito.doReturn("'vserver'").when(impliedDelete).get(AAIConstants.AAI_IMPLIED_DELETE_WHITELIST + "sdnc", "");
91 Mockito.when(mockEngine.getQueryEngine()).thenReturn(mockQueryEngine);
93 TinkerGraph graph = TinkerGraph.open();
95 Vertex vserver = graph.addVertex("vertex");
96 vserver.property("vserver-id", "some-id");
98 Vertex volume = graph.addVertex("vertex");
99 volume.property("volume-id", "some-id");
101 List<Vertex> vertices = new ArrayList<>();
102 vertices.add(volume);
104 impliedDelete.execute(vserver.id(), "SDNC", "vserver", vertices);
107 // aai.implied.delete.whitelist.sdnc='vserver'
109 public void testImpliedDeleteWhenUserIsAllowedAndTryVariationsOfSOTValueSDNC() throws AAIException {
111 QueryEngine mockQueryEngine = Mockito.mock(QueryEngine.class);
113 Mockito.doReturn("'vserver'").when(impliedDelete).get(AAIConstants.AAI_IMPLIED_DELETE_WHITELIST + "sdnc", "");
115 Mockito.when(mockEngine.getQueryEngine()).thenReturn(mockQueryEngine);
117 TinkerGraph graph = TinkerGraph.open();
119 Vertex vserver = graph.addVertex("vertex");
120 vserver.property("vserver-id", "some-id");
122 Vertex volume = graph.addVertex("vertex");
123 volume.property("volume-id", "some-id");
125 List<Vertex> vertices = new ArrayList<>();
126 vertices.add(volume);
128 impliedDelete.execute(vserver.id(), "SDNC", "vserver", vertices);
129 impliedDelete.execute(vserver.id(), "sDNC", "vserver", vertices);
130 impliedDelete.execute(vserver.id(), "sdNC", "vserver", vertices);
131 impliedDelete.execute(vserver.id(), "sdnC", "vserver", vertices);
132 impliedDelete.execute(vserver.id(), "sdnc", "vserver", vertices);
135 // aai.implied.delete.whitelist.sdnc='vserver','vce','pserver'
137 public void testImpliedDeleteWhenUserIsAllowedToInvokeMultipleMethods() throws AAIException {
139 QueryEngine mockQueryEngine = Mockito.mock(QueryEngine.class);
141 Mockito.doReturn("'vce','pserver','vserver','cloud-region'").when(impliedDelete)
142 .get(AAIConstants.AAI_IMPLIED_DELETE_WHITELIST + "sdnc", "");
144 Mockito.when(mockEngine.getQueryEngine()).thenReturn(mockQueryEngine);
146 TinkerGraph graph = TinkerGraph.open();
148 Vertex vserver = graph.addVertex("vertex");
149 vserver.property("vserver-id", "some-id");
151 Vertex volume = graph.addVertex("vertex");
152 volume.property("volume-id", "some-id");
154 List<Vertex> vertices = new ArrayList<>();
155 vertices.add(volume);
157 impliedDelete.execute(vserver.id(), "SDNC", "vserver", vertices);
160 // aai.implied.delete.whitelist.sdnc='vserver','vce','pserver'
162 public void testImpliedDeleteWhenUserIsAllowedToInvokeMultipleMethodsAndDeletableReturnsMultipleVertexes()
163 throws AAIException, UnsupportedEncodingException {
165 QueryEngine mockQueryEngine = Mockito.mock(QueryEngine.class);
167 // On a spy the syntax should be doReturn => when => method to spy
168 // On a mock the syntax should be when => thenReturn|thenAnswer
169 Mockito.doReturn("'vserver'").when(impliedDelete).get(AAIConstants.AAI_IMPLIED_DELETE_WHITELIST + "sdnc", "");
171 Introspector mockIntrospector = Mockito.mock(Introspector.class);
173 Mockito.when(mockEngine.getQueryEngine()).thenReturn(mockQueryEngine);
175 TinkerGraph graph = TinkerGraph.open();
177 Vertex vserver = graph.addVertex("vertex");
178 vserver.property("vserver-id", "some-id");
180 Vertex volume1 = graph.addVertex("vertex");
181 volume1.property("volume-id", "volume-1");
183 Vertex volume2 = graph.addVertex("vertex");
184 volume1.property("volume-id", "volume-2");
186 Vertex volume3 = graph.addVertex("vertex");
187 volume1.property("volume-id", "volume-3");
189 Vertex volume4 = graph.addVertex("vertex");
190 volume1.property("volume-id", "volume-4");
192 List<Vertex> vertices = new ArrayList<>();
194 vertices.add(volume1);
195 vertices.add(volume2);
196 vertices.add(volume3);
197 vertices.add(volume4);
199 Mockito.when(mockQueryEngine.findDeletable(Mockito.anyList())).thenReturn(vertices);
201 Mockito.when(mockSerializer.getLatestVersionView(Mockito.anyObject())).thenReturn(mockIntrospector);
203 Mockito.when(mockIntrospector.marshal(false)).thenReturn("{\"volume-id\":\"volume-1\"}")
204 .thenReturn("{\"volume-id\":\"volume-2\"}").thenReturn("{\"volume-id\":\"volume-3\"}")
205 .thenReturn("{\"volume-id\":\"volume-4\"}");
207 impliedDelete.execute(vserver.id(), "SDNC", "vserver", vertices);
210 // aai.implied.delete.whitelist.sdnc=
211 @Test(expected = AAIException.class)
212 public void testImpliedDeleteWhenUserIsNotAllowedToDelete() throws AAIException {
214 QueryEngine mockQueryEngine = Mockito.mock(QueryEngine.class);
216 Mockito.doReturn("").when(impliedDelete).get(AAIConstants.AAI_IMPLIED_DELETE_WHITELIST + "sdnc", "");
218 Mockito.when(mockEngine.getQueryEngine()).thenReturn(mockQueryEngine);
220 TinkerGraph graph = TinkerGraph.open();
222 Vertex vserver = graph.addVertex("vertex");
223 vserver.property("vserver-id", "some-id");
225 Vertex volume = graph.addVertex("vertex");
226 volume.property("volume-id", "some-id");
228 List<Vertex> vertices = new ArrayList<>();
229 vertices.add(volume);
231 impliedDelete.execute(vserver.id(), "SDNC", "vserver", vertices);
234 // aai.implied.delete.whitelist.sdnc='vce'
235 @Test(expected = AAIException.class)
236 public void testImpliedDeleteWhenUserIsAllowedToDeleteVceChildrenButRequestedToDeleteVserverChildren()
237 throws AAIException {
239 QueryEngine mockQueryEngine = Mockito.mock(QueryEngine.class);
241 Mockito.doReturn("'vce'").when(impliedDelete).get(AAIConstants.AAI_IMPLIED_DELETE_WHITELIST + "sdnc", "");
243 Mockito.when(mockEngine.getQueryEngine()).thenReturn(mockQueryEngine);
245 TinkerGraph graph = TinkerGraph.open();
247 Vertex vserver = graph.addVertex("vertex");
248 vserver.property("vserver-id", "some-id");
250 Vertex volume = graph.addVertex("vertex");
251 volume.property("volume-id", "some-id");
253 List<Vertex> vertices = new ArrayList<>();
254 vertices.add(volume);
256 impliedDelete.execute(vserver.id(), "SDNC", "vserver", vertices);
260 public void testImpliedDeleteWhenUserIsAllowedToDeleteAndPrintingDeletingVertexItThrowsExceptionVerifyLog()
261 throws AAIException, UnsupportedEncodingException {
263 QueryEngine mockQueryEngine = Mockito.mock(QueryEngine.class);
265 // On a spy the syntax should be doReturn => when => method to spy
266 // On a mock the syntax should be when => thenReturn|thenAnswer
267 Mockito.doReturn("'vserver'").when(impliedDelete).get(AAIConstants.AAI_IMPLIED_DELETE_WHITELIST + "sdnc", "");
269 Introspector mockIntrospector = Mockito.mock(Introspector.class);
271 Mockito.when(mockEngine.getQueryEngine()).thenReturn(mockQueryEngine);
273 TinkerGraph graph = TinkerGraph.open();
275 Vertex vserver = graph.addVertex("vertex");
276 vserver.property("vserver-id", "some-id");
278 Vertex volume1 = graph.addVertex("vertex");
279 volume1.property("volume-id", "volume-1");
281 List<Vertex> vertices = new ArrayList<>();
283 vertices.add(volume1);
285 Mockito.when(mockQueryEngine.findDeletable(Mockito.anyList())).thenReturn(vertices);
287 Mockito.when(mockSerializer.getLatestVersionView(Mockito.anyObject()))
288 .thenThrow(new RuntimeException("Unable to find node"));
290 impliedDelete.execute(vserver.id(), "SDNC", "vserver", vertices);
292 outputCapture.expect(CoreMatchers.containsString(
293 "Encountered an exception during retrieval of vertex properties with vertex-id " + vserver.id()));