Add tests to VnfApiProvider part 5
[sdnc/northbound.git] / vnfapi / provider / src / test / java / org / onap / sdnc / vnfapi / VnfInstanceTopologyOperationTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * openECOMP : SDN-C
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights
6  *                                                      reserved.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.sdnc.vnfapi;
23
24 import com.google.common.util.concurrent.CheckedFuture;
25 import org.junit.Assert;
26 import org.junit.Before;
27 import org.junit.Test;
28 import org.junit.runner.RunWith;
29 import org.mockito.runners.MockitoJUnitRunner;
30 import org.mockito.Mockito;
31 import org.onap.ccsdk.sli.core.sli.SvcLogicException;
32 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
33 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
34 import org.opendaylight.controller.md.sal.binding.impl.BindingDOMDataBrokerAdapter;
35 import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec;
36 import org.opendaylight.controller.md.sal.binding.test.AbstractDataBrokerTestCustomizer;
37 import org.opendaylight.controller.md.sal.binding.test.ConcurrentDataBrokerTestCustomizer;
38 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
39 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
40 import org.slf4j.Logger;
41 import org.slf4j.LoggerFactory;
42 import org.opendaylight.yang.gen.v1.org.onap.sdnctl.vnf.rev150720.VnfInstanceTopologyOperationInput;
43 import org.opendaylight.yang.gen.v1.org.onap.sdnctl.vnf.rev150720.VnfInstanceTopologyOperationOutput;
44 import org.opendaylight.yang.gen.v1.org.onap.sdnctl.vnf.rev150720.VnfInstanceTopologyOperationInputBuilder;
45 import org.opendaylight.yang.gen.v1.org.onap.sdnctl.vnf.rev150720.vnf.instance.request.information.VnfInstanceRequestInformation;
46 import org.opendaylight.yang.gen.v1.org.onap.sdnctl.vnf.rev150720.vnf.instance.request.information.VnfInstanceRequestInformationBuilder;
47 import org.opendaylight.yang.gen.v1.org.onap.sdnctl.vnf.rev150720.vnf.instance.service.data.VnfInstanceServiceDataBuilder;
48
49 import java.util.Properties;
50 import java.util.concurrent.ExecutionException;
51
52 class ExceptionThrowerConfigurator {
53     private boolean shouldThrowExceptionDuringTransactionPut;
54
55     public ExceptionThrowerConfigurator() {
56         this.shouldThrowExceptionDuringTransactionPut = true;
57     }
58
59     public boolean shouldThrowExceptionDuringTransactionPut() {
60         return shouldThrowExceptionDuringTransactionPut;
61     }
62
63     public void setShouldThrowExceptionDuringTransactionPut(boolean shouldThrowExceptionDuringTransactionPut) {
64         this.shouldThrowExceptionDuringTransactionPut = shouldThrowExceptionDuringTransactionPut;
65     }
66 }
67
68 class DataBrokerErrorMsgConfigurator {
69     static public String JAVA_LANG_RUNTIME_EXCEPTION = "java.lang.RuntimeException: ";
70     static public String TRANSACTION_WRITE_ERROR = "transaction-write-error";
71 }
72
73 class DataBrokerStab extends BindingDOMDataBrokerAdapter {
74     ExceptionThrowerConfigurator exceptionThrowerConfigurator;
75
76     public DataBrokerStab(final DOMDataBroker domDataBroker,
77         final BindingToNormalizedNodeCodec codec, ExceptionThrowerConfigurator exceptionThrowerConfigurator) {
78         super(domDataBroker, codec);
79         this.exceptionThrowerConfigurator = exceptionThrowerConfigurator;
80
81     }
82
83     @Override
84     public WriteTransaction newWriteOnlyTransaction() {
85         if (exceptionThrowerConfigurator.shouldThrowExceptionDuringTransactionPut()) {
86             return newThrowingExceptionWriteOnlyTransaction();
87         }
88         return newNotThrowingExceptionWriteOnlyTransaction();
89     }
90
91     private WriteTransaction newThrowingExceptionWriteOnlyTransaction() {
92         WriteTransaction mockWriteTransaction = Mockito.mock(WriteTransaction.class);
93         Mockito.doThrow(new RuntimeException(DataBrokerErrorMsgConfigurator.TRANSACTION_WRITE_ERROR))
94                 .when(mockWriteTransaction).put(Mockito.any(), Mockito.any(), Mockito.any());
95         return mockWriteTransaction;
96     }
97
98     private WriteTransaction newNotThrowingExceptionWriteOnlyTransaction() {
99          WriteTransaction mockWriteTransaction = Mockito.mock(WriteTransaction.class);
100         CheckedFuture<Void, TransactionCommitFailedException> mockCheckedFuture =
101                 Mockito.mock(CheckedFuture.class);
102         Mockito.doNothing().when(mockWriteTransaction).put(Mockito.any(), Mockito.any(), Mockito.any());
103         Mockito.doReturn(mockCheckedFuture).when(mockWriteTransaction).submit();
104         return mockWriteTransaction;
105     }
106 }
107
108 class VnfApiProviderDataBrokerTestCustomizer  extends ConcurrentDataBrokerTestCustomizer {
109     ExceptionThrowerConfigurator exceptionThrowerConfigurator;
110
111     public VnfApiProviderDataBrokerTestCustomizer(ExceptionThrowerConfigurator exceptionThrowerConfigurator) {
112         this.exceptionThrowerConfigurator = exceptionThrowerConfigurator;
113     }
114
115     public DataBroker createDataBroker() {
116         return new DataBrokerStab(createDOMDataBroker(),
117             super.getBindingToNormalized(), this.exceptionThrowerConfigurator);
118     }
119 }
120
121 @RunWith(MockitoJUnitRunner.class)
122 public class VnfInstanceTopologyOperationTest extends VnfApiProviderTest {
123     protected static final Logger LOG = LoggerFactory.getLogger(VnfInstanceTopologyOperationTest.class);
124
125     private static final String INVALID_INPUT = "invalid input, null or empty vnf-instance-id";
126     private static final String NO_SERVICE_LOGIC = "No service logic active for VNF-API: \'vnf-instance-topology-operation\'";
127     private static final String VIID = "viid";
128     private static final String PRELOAD_NAME = "preloadName";
129     private static final String PRELOAD_TYPE = "preloadType";
130     private static final String ERROR_CODE = "error-code";
131     private static final String ERROR_MESSAGE = "error-message";
132     private static final String ACK_FINAL = "ack-final";
133     private static final String SVC_OPERATION = "vnf-topology-operation";
134
135     private ExceptionThrowerConfigurator exceptionThrowerConfigurator;
136
137     @Override
138     protected AbstractDataBrokerTestCustomizer createDataBrokerTestCustomizer() {
139         this.exceptionThrowerConfigurator = new ExceptionThrowerConfigurator();
140         return new VnfApiProviderDataBrokerTestCustomizer(this.exceptionThrowerConfigurator);
141     }
142
143     @Before
144     public void setUp() throws Exception {
145         super.setUp();
146         svcClient.setScvOperation(SVC_OPERATION);
147     }
148
149     @Test
150     public void vnfInstanceTopologyOperationInputIsNull() throws Exception {
151         VnfInstanceTopologyOperationInput input = null;
152         checkVnfInstanceTopologyOperation(input, "403", INVALID_INPUT);
153     }
154
155     @Test
156     public void vnfInstanceTopologyOperationInput_VnfInstanceRequestInformationIsNull() throws Exception {
157         VnfInstanceTopologyOperationInputBuilder builder = new VnfInstanceTopologyOperationInputBuilder();
158         builder.setVnfInstanceRequestInformation(null);
159         VnfInstanceTopologyOperationInput input = builder.build();
160         checkVnfInstanceTopologyOperation(input, "403", INVALID_INPUT);
161     }
162
163     @Test
164     public void vnfInstanceTopologyOperationInput_getVnfInstanceRequestInformationVnfInstanceIdIsNull() throws Exception {
165         VnfInstanceRequestInformation vnfInstanceRequestInformation = createVnfInstanceRequestInformation(null);
166         VnfInstanceTopologyOperationInputBuilder builder = createVnfInstanceTopologyOperationInputBuilder(vnfInstanceRequestInformation);
167         VnfInstanceTopologyOperationInput input = builder.build();
168         checkVnfInstanceTopologyOperation(input, "403", INVALID_INPUT);
169     }
170
171     @Test
172     public void vnfInstanceTopologyOperationInput_VnfInstanceRequestInformationVnfInstanceIdIsZero() throws Exception {
173         VnfInstanceTopologyOperationInputBuilder builder = createVnfInstanceTopologyOperationInputBuilder(createVnfInstanceRequestInformation(""));
174         VnfInstanceTopologyOperationInput input = builder.build();
175         checkVnfInstanceTopologyOperation(input, "403", INVALID_INPUT);
176     }
177
178     @Test
179     public void vnfInstanceTopologyOperationInput_svcLogicClientHasGrapheReturnFalse() throws Exception {
180         VnfInstanceTopologyOperationInputBuilder builder = createVnfInstanceTopologyOperationInputBuilder(createVnfInstanceRequestInformation(VIID));
181         VnfInstanceTopologyOperationInput input = builder.build();
182         setReturnForSvcLogicServiceClientHasGraph(false);
183         checkVnfInstanceTopologyOperation(input, "503", NO_SERVICE_LOGIC);
184     }
185
186     @Test
187     public void vnfInstanceTopologyOperationInput_svcLogicClientExecuteThrowsSvcLogicException() throws Exception {
188         VnfInstanceTopologyOperationInputBuilder builder = createVnfInstanceTopologyOperationInputBuilder(createVnfInstanceRequestInformation(VIID));
189         VnfInstanceTopologyOperationInput input = builder.build();
190         setReturnForSvcLogicServiceClientHasGraph(true);
191         setMockVNFSDNSvcLogicServiceClientToThrowException(SvcLogicException.class);
192         checkVnfInstanceTopologyOperation(input, "500", null);
193     }
194
195     @Test
196     public void vnfInstanceTopologyOperationInput_svcLogicClientExecuteThrowsException() throws Exception {
197         VnfInstanceTopologyOperationInputBuilder builder = createVnfInstanceTopologyOperationInputBuilder(createVnfInstanceRequestInformation(VIID));
198         VnfInstanceTopologyOperationInput input = builder.build();
199
200         setReturnForSvcLogicServiceClientHasGraph(true);
201         setMockVNFSDNSvcLogicServiceClientToThrowException(Exception.class);
202         checkVnfInstanceTopologyOperation(input, "500", null);
203     }
204
205     @Test
206     public void vnfInstanceTopologyOperationInput_svcLogicClientExecuteReturnsNotNull() throws Exception {
207         VnfInstanceTopologyOperationInputBuilder builder = createVnfInstanceTopologyOperationInputBuilder(createVnfInstanceRequestInformation(VIID));
208         VnfInstanceTopologyOperationInput input = builder.build();
209
210         Properties properties = prop().set(ERROR_CODE, "500")
211                 .set(ERROR_MESSAGE, ERROR_MESSAGE)
212                 .set(ACK_FINAL, "Y")
213                 .build();
214
215         setReturnForSvcLogicServiceClientHasGraph(true);
216         setReturnForSvcLogicServiceClientExecute(properties);
217         checkVnfInstanceTopologyOperation(input, "500", ERROR_MESSAGE);
218     }
219
220     @Test
221     public void vnfInstanceTopologyOperationInput_svcLogicClientExecuteReturnsNull() throws Exception {
222         VnfInstanceTopologyOperationInputBuilder builder = createVnfInstanceTopologyOperationInputBuilder(createVnfInstanceRequestInformation(VIID));
223         VnfInstanceTopologyOperationInput input = builder.build();
224
225         setReturnForSvcLogicServiceClientHasGraph(true);
226         setReturnForSvcLogicServiceClientExecute(null);
227         String expectedErrorMsg = DataBrokerErrorMsgConfigurator.JAVA_LANG_RUNTIME_EXCEPTION
228                 + DataBrokerErrorMsgConfigurator.TRANSACTION_WRITE_ERROR;
229         checkVnfInstanceTopologyOperation(input, "500", expectedErrorMsg);
230     }
231
232     @Test
233     public void vnfInstanceTopologyOperationInput_NoErrorDuringTransactionWriting() throws Exception {
234         VnfInstanceTopologyOperationInputBuilder builder = createVnfInstanceTopologyOperationInputBuilder(createVnfInstanceRequestInformation(VIID));
235         VnfInstanceTopologyOperationInput input = builder.build();
236
237         setReturnForSvcLogicServiceClientHasGraph(true);
238         setReturnForSvcLogicServiceClientExecute(null);
239         exceptionThrowerConfigurator.setShouldThrowExceptionDuringTransactionPut(false);
240         checkVnfInstanceTopologyOperation(input, "200", null);
241     }
242
243     private void checkVnfInstanceTopologyOperation(VnfInstanceTopologyOperationInput input,
244         String expectedResponseCode, String expectedResponseMessage) throws ExecutionException, InterruptedException {
245
246         VnfInstanceTopologyOperationOutput output = executeVnfInstanceTopologyOperation(input);
247         checkVnfInstanceTopologyOperationOutput(output, expectedResponseCode, expectedResponseMessage);
248     }
249
250     private VnfInstanceTopologyOperationOutput executeVnfInstanceTopologyOperation(
251         VnfInstanceTopologyOperationInput input) throws ExecutionException, InterruptedException {
252         return vnfapiProvider
253                 .vnfInstanceTopologyOperation(input)
254                 .get()
255                 .getResult();
256     }
257
258     private void checkVnfInstanceTopologyOperationOutput(VnfInstanceTopologyOperationOutput result,
259         String expectedResponseCode, String expectedResponseMessage) {
260
261         String expectedAckFinalIndicator = "Y";
262
263         Assert.assertEquals(expectedResponseCode , result.getResponseCode());
264         Assert.assertEquals(expectedResponseMessage, result.getResponseMessage());
265         Assert.assertEquals(expectedAckFinalIndicator, result.getAckFinalIndicator());
266     }
267
268     private void setReturnForSvcLogicServiceClientHasGraph(Boolean returnValue) throws Exception{
269         Mockito.when(mockVNFSDNSvcLogicServiceClient
270                 .hasGraph(Mockito.any(),Mockito.any(), Mockito.any(),Mockito.any()))
271                 .thenReturn(returnValue);
272     }
273
274     private void setReturnForSvcLogicServiceClientExecute(Properties properties) throws Exception{
275         Mockito.when(mockVNFSDNSvcLogicServiceClient
276                 .execute(Mockito.any(),
277                         Mockito.any(),
278                         Mockito.any(),
279                         Mockito.any(),
280                         Mockito.any(VnfInstanceServiceDataBuilder.class),
281                         Mockito.any()))
282                 .thenReturn(properties);
283     }
284
285     private void setMockVNFSDNSvcLogicServiceClientToThrowException(Class exceptionClass) throws Exception {
286         Mockito.when(mockVNFSDNSvcLogicServiceClient
287                 .execute(Mockito.any(),
288                         Mockito.any(),
289                         Mockito.any(),
290                         Mockito.any(),
291                         Mockito.any(VnfInstanceServiceDataBuilder.class),
292                         Mockito.any()))
293                 .thenThrow(exceptionClass.asSubclass(Throwable.class));
294     }
295
296     private VnfInstanceTopologyOperationInputBuilder createVnfInstanceTopologyOperationInputBuilder(VnfInstanceRequestInformation vnfInstanceRequestInformation) {
297         VnfInstanceTopologyOperationInputBuilder builder = new VnfInstanceTopologyOperationInputBuilder();
298         builder.setVnfInstanceRequestInformation(vnfInstanceRequestInformation);
299         return builder;
300     }
301
302
303
304     private VnfInstanceRequestInformation createVnfInstanceRequestInformation(String vnfInstanceId) {
305         return new VnfInstanceRequestInformationBuilder()
306                 .setVnfInstanceId(vnfInstanceId)
307                 .setVnfInstanceName(PRELOAD_NAME)
308                 .setVnfModelId(PRELOAD_TYPE)
309                 .build();
310     }
311 }