Add test cases for vnf-api
[sdnc/northbound.git] / vnfapi / provider / src / test / java / org / onap / sdnc / vnfapi / VfModuleTopologyOperationTest.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.VfModuleTopologyOperationInput;
43 import org.opendaylight.yang.gen.v1.org.onap.sdnctl.vnf.rev150720.VfModuleTopologyOperationOutput;
44 import org.opendaylight.yang.gen.v1.org.onap.sdnctl.vnf.rev150720.request.information.RequestInformation;
45 import org.opendaylight.yang.gen.v1.org.onap.sdnctl.vnf.rev150720.request.information.RequestInformation.RequestAction;
46 import org.opendaylight.yang.gen.v1.org.onap.sdnctl.vnf.rev150720.request.information.RequestInformationBuilder;
47 import org.opendaylight.yang.gen.v1.org.onap.sdnctl.vnf.rev150720.vf.module.request.information.VfModuleRequestInformation;
48 import org.opendaylight.yang.gen.v1.org.onap.sdnctl.vnf.rev150720.vf.module.request.information.VfModuleRequestInformationBuilder;
49 import org.opendaylight.yang.gen.v1.org.onap.sdnctl.vnf.rev150720.vf.module.service.data.VfModuleServiceDataBuilder;
50 import org.opendaylight.yang.gen.v1.org.onap.sdnctl.vnf.rev150720.VfModuleTopologyOperationInputBuilder;
51
52 import java.util.Properties;
53 import java.util.concurrent.ExecutionException;
54
55 class VfModuleExceptionThrowerConfigurator {
56     private boolean shouldThrowExceptionDuringTransactionPut;
57
58     public VfModuleExceptionThrowerConfigurator() {
59         this.shouldThrowExceptionDuringTransactionPut = true;
60     }
61
62     public boolean shouldThrowExceptionDuringTransactionPut() {
63         return shouldThrowExceptionDuringTransactionPut;
64     }
65
66     public void setShouldThrowExceptionDuringTransactionPut(boolean shouldThrowExceptionDuringTransactionPut) {
67         this.shouldThrowExceptionDuringTransactionPut = shouldThrowExceptionDuringTransactionPut;
68     }
69 }
70
71 class VfModuleDataBrokerErrorMsgConfigurator {
72     static public String JAVA_LANG_RUNTIME_EXCEPTION = "java.lang.RuntimeException: ";
73     static public String TRANSACTION_WRITE_ERROR = "transaction-write-error";
74 }
75
76 class VfModuleDataBrokerStab extends BindingDOMDataBrokerAdapter {
77     VfModuleExceptionThrowerConfigurator exceptionThrowerConfigurator;
78
79     public VfModuleDataBrokerStab(final DOMDataBroker domDataBroker,
80         final BindingToNormalizedNodeCodec codec, VfModuleExceptionThrowerConfigurator exceptionThrowerConfigurator) {
81         super(domDataBroker, codec);
82         this.exceptionThrowerConfigurator = exceptionThrowerConfigurator;
83
84     }
85
86     @Override
87     public WriteTransaction newWriteOnlyTransaction() {
88         if (exceptionThrowerConfigurator.shouldThrowExceptionDuringTransactionPut()) {
89             return newThrowingExceptionWriteOnlyTransaction();
90         }
91         return newNotThrowingExceptionWriteOnlyTransaction();
92     }
93
94     private WriteTransaction newThrowingExceptionWriteOnlyTransaction() {
95         WriteTransaction mockWriteTransaction = Mockito.mock(WriteTransaction.class);
96         Mockito.doThrow(new RuntimeException(VfModuleDataBrokerErrorMsgConfigurator.TRANSACTION_WRITE_ERROR))
97                 .when(mockWriteTransaction).put(Mockito.any(), Mockito.any(), Mockito.any());
98         return mockWriteTransaction;
99     }
100
101     private WriteTransaction newNotThrowingExceptionWriteOnlyTransaction() {
102          WriteTransaction mockWriteTransaction = Mockito.mock(WriteTransaction.class);
103         CheckedFuture<Void, TransactionCommitFailedException> mockCheckedFuture =
104                 Mockito.mock(CheckedFuture.class);
105         Mockito.doNothing().when(mockWriteTransaction).put(Mockito.any(), Mockito.any(), Mockito.any());
106         Mockito.doReturn(mockCheckedFuture).when(mockWriteTransaction).submit();
107         return mockWriteTransaction;
108     }
109 }
110
111 class VfModuleProviderDataBrokerTestCustomizer  extends ConcurrentDataBrokerTestCustomizer {
112     VfModuleExceptionThrowerConfigurator exceptionThrowerConfigurator;
113
114     public VfModuleProviderDataBrokerTestCustomizer(VfModuleExceptionThrowerConfigurator exceptionThrowerConfigurator) {
115         super(false);
116         this.exceptionThrowerConfigurator = exceptionThrowerConfigurator;
117     }
118
119     public DataBroker createDataBroker() {
120         return new VfModuleDataBrokerStab(createDOMDataBroker(),
121             super.getBindingToNormalized(), this.exceptionThrowerConfigurator);
122     }
123 }
124
125 @RunWith(MockitoJUnitRunner.class)
126 public class VfModuleTopologyOperationTest extends VnfApiProviderTest {
127     protected static final Logger LOG = LoggerFactory.getLogger(VfModuleTopologyOperationTest.class);
128
129     private static final String INVALID_VFMODULEID = "invalid input, null or empty vf-module-id";
130     private static final String INVALID_VNFINSTANCEID = "invalid input, null or empty vnf-instance-id";
131     private static final String NO_SERVICE_LOGIC = "No service logic active for VNF-API: \'vf-module-topology-operation\'";
132     private static final String VF_MODULE_ID = "vfModule1";
133     private static final String VNF_INSTANCE_ID = "vnfInstance1";
134     private static final String PRELOAD_NAME = "preloadName";
135     private static final String PRELOAD_TYPE = "preloadType";
136     private static final String ERROR_CODE = "error-code";
137     
138     private static final String ERROR_MESSAGE = "error-message";
139     private static final String ACK_FINAL = "ack-final";
140     private static final String SVC_OPERATION = "vf-module-topology-operation";
141
142     private VfModuleExceptionThrowerConfigurator exceptionThrowerConfigurator;
143
144     @Override
145     protected AbstractDataBrokerTestCustomizer createDataBrokerTestCustomizer() {
146         this.exceptionThrowerConfigurator = new VfModuleExceptionThrowerConfigurator();
147         return new VfModuleProviderDataBrokerTestCustomizer(this.exceptionThrowerConfigurator);
148     }
149
150     @Before
151     public void setUp() throws Exception {
152         super.setUp();
153         svcClient.setScvOperation(SVC_OPERATION);
154     }
155
156     @Test
157     public void vfModuleTopologyOperationInputIsNull() throws Exception {
158         VfModuleTopologyOperationInput input = null;
159         checkVfModuleTopologyOperation(input, "403", INVALID_VFMODULEID);
160     }
161
162     @Test
163     public void vfModuleTopologyOperationInput_VfModuleRequestInformationIsNull() throws Exception {
164         VfModuleTopologyOperationInputBuilder builder = new VfModuleTopologyOperationInputBuilder();
165         builder.setVfModuleRequestInformation(null);
166         VfModuleTopologyOperationInput input = builder.build();
167         checkVfModuleTopologyOperation(input, "403", INVALID_VFMODULEID);
168     }
169
170     @Test
171     public void vfModuleTopologyOperationInput_getVfModuleRequestInformationVfModuleIdIsNull() throws Exception {
172         RequestInformation reqInfo = createRequestInformation(RequestAction.PreloadVfModuleRequest);
173         VfModuleRequestInformation vfModuleRequestInformation = createVfModuleRequestInformation(VNF_INSTANCE_ID, null);
174         VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(vfModuleRequestInformation, reqInfo);
175         VfModuleTopologyOperationInput input = builder.build();
176         checkVfModuleTopologyOperation(input, "403", INVALID_VFMODULEID);
177     }
178
179     @Test
180     public void vfModuleTopologyOperationInput_VfModuleRequestInformationVfModuleIdIsZero() throws Exception {
181         VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(createVfModuleRequestInformation(VNF_INSTANCE_ID,""), createRequestInformation(RequestAction.PreloadVfModuleRequest));
182         VfModuleTopologyOperationInput input = builder.build();
183         checkVfModuleTopologyOperation(input, "403", INVALID_VFMODULEID);
184     }
185     
186     @Test
187     public void vfModuleTopologyOperationInput_getVfModuleRequestInformationVnfInstanceIdIsNull() throws Exception {
188         RequestInformation reqInfo = createRequestInformation(RequestAction.PreloadVfModuleRequest);
189         VfModuleRequestInformation vfModuleRequestInformation = createVfModuleRequestInformation(null, VF_MODULE_ID);
190         VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(vfModuleRequestInformation, reqInfo);
191         VfModuleTopologyOperationInput input = builder.build();
192         checkVfModuleTopologyOperation(input, "403", INVALID_VNFINSTANCEID);
193     }
194
195     @Test
196     public void vfModuleTopologyOperationInput_VfModuleRequestInformationVnfInstanceIdIsZero() throws Exception {
197         VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(createVfModuleRequestInformation("",VF_MODULE_ID), createRequestInformation(RequestAction.PreloadVfModuleRequest));
198         VfModuleTopologyOperationInput input = builder.build();
199         checkVfModuleTopologyOperation(input, "403", INVALID_VNFINSTANCEID);
200     }
201
202     @Test
203     public void vfModuleTopologyOperationInput_svcLogicClientHasGrapheReturnFalse() throws Exception {
204         VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(createVfModuleRequestInformation(VNF_INSTANCE_ID, VF_MODULE_ID), createRequestInformation(RequestAction.PreloadVfModuleRequest));
205         VfModuleTopologyOperationInput input = builder.build();
206         setReturnForSvcLogicServiceClientHasGraph(false);
207         checkVfModuleTopologyOperation(input, "503", NO_SERVICE_LOGIC);
208     }
209
210     @Test
211     public void vfModuleTopologyOperationInput_svcLogicClientExecuteThrowsSvcLogicException() throws Exception {
212         VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(createVfModuleRequestInformation(VNF_INSTANCE_ID, VF_MODULE_ID), createRequestInformation(RequestAction.PreloadVfModuleRequest));
213         VfModuleTopologyOperationInput input = builder.build();
214         setReturnForSvcLogicServiceClientHasGraph(true);
215         setMockVNFSDNSvcLogicServiceClientToThrowException(SvcLogicException.class);
216         checkVfModuleTopologyOperation(input, "500", null);
217     }
218
219     @Test
220     public void vfModuleTopologyOperationInput_svcLogicClientExecuteThrowsException() throws Exception {
221         VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(createVfModuleRequestInformation(VNF_INSTANCE_ID, VF_MODULE_ID), createRequestInformation(RequestAction.PreloadVfModuleRequest));
222         VfModuleTopologyOperationInput input = builder.build();
223
224         setReturnForSvcLogicServiceClientHasGraph(true);
225         setMockVNFSDNSvcLogicServiceClientToThrowException(Exception.class);
226         checkVfModuleTopologyOperation(input, "500", null);
227     }
228
229     @Test
230     public void vfModuleTopologyOperationInput_svcLogicClientExecuteReturnsNotNull() throws Exception {
231         VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(createVfModuleRequestInformation(VNF_INSTANCE_ID, VF_MODULE_ID), createRequestInformation(RequestAction.PreloadVfModuleRequest));
232         VfModuleTopologyOperationInput input = builder.build();
233
234         Properties properties = prop().set(ERROR_CODE, "500")
235                 .set(ERROR_MESSAGE, ERROR_MESSAGE)
236                 .set(ACK_FINAL, "Y")
237                 .build();
238
239         setReturnForSvcLogicServiceClientHasGraph(true);
240         setReturnForSvcLogicServiceClientExecute(properties);
241         checkVfModuleTopologyOperation(input, "500", ERROR_MESSAGE);
242     }
243
244     @Test
245     public void vfModuleTopologyOperationInput_svcLogicClientExecuteReturnsNull() throws Exception {
246         VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(createVfModuleRequestInformation(VNF_INSTANCE_ID, VF_MODULE_ID), createRequestInformation(RequestAction.PreloadVfModuleRequest));
247         VfModuleTopologyOperationInput input = builder.build();
248
249         setReturnForSvcLogicServiceClientHasGraph(true);
250         setReturnForSvcLogicServiceClientExecute(null);
251         String expectedErrorMsg = VfModuleDataBrokerErrorMsgConfigurator.JAVA_LANG_RUNTIME_EXCEPTION
252                 + VfModuleDataBrokerErrorMsgConfigurator.TRANSACTION_WRITE_ERROR;
253         checkVfModuleTopologyOperation(input, "500", expectedErrorMsg);
254     }
255
256     @Test
257     public void vfModuleTopologyOperationInput_ActivateNoErrorDuringTransactionWriting() throws Exception {
258         VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(createVfModuleRequestInformation(VNF_INSTANCE_ID, VF_MODULE_ID), createRequestInformation(RequestAction.VfModuleActivateRequest));
259         VfModuleTopologyOperationInput input = builder.build();
260
261         setReturnForSvcLogicServiceClientHasGraph(true);
262         setReturnForSvcLogicServiceClientExecute(null);
263         exceptionThrowerConfigurator.setShouldThrowExceptionDuringTransactionPut(false);
264         checkVfModuleTopologyOperation(input, "200", null);
265     }
266     
267     @Test
268     public void vfModuleTopologyOperationInput_ChangeNoErrorDuringTransactionWriting() throws Exception {
269         VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(createVfModuleRequestInformation(VNF_INSTANCE_ID, VF_MODULE_ID), createRequestInformation(RequestAction.ChangeVfModuleActivateRequest));
270         VfModuleTopologyOperationInput input = builder.build();
271
272         setReturnForSvcLogicServiceClientHasGraph(true);
273         setReturnForSvcLogicServiceClientExecute(null);
274         exceptionThrowerConfigurator.setShouldThrowExceptionDuringTransactionPut(false);
275         checkVfModuleTopologyOperation(input, "200", null);
276     }
277     
278     @Test
279     public void vfModuleTopologyOperationInput_DisconnectNoErrorDuringTransactionWriting() throws Exception {
280         VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(createVfModuleRequestInformation(VNF_INSTANCE_ID, VF_MODULE_ID), createRequestInformation(RequestAction.DisconnectVfModuleRequest));
281         VfModuleTopologyOperationInput input = builder.build();
282
283         setReturnForSvcLogicServiceClientHasGraph(true);
284         setReturnForSvcLogicServiceClientExecute(null);
285         exceptionThrowerConfigurator.setShouldThrowExceptionDuringTransactionPut(false);
286         checkVfModuleTopologyOperation(input, "200", null);
287     }
288
289     @Test
290     public void vfModuleTopologyOperationInput_PreloadNoErrorDuringTransactionWriting() throws Exception {
291         VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(createVfModuleRequestInformation(VNF_INSTANCE_ID, VF_MODULE_ID), createRequestInformation(RequestAction.PreloadVfModuleRequest));
292         VfModuleTopologyOperationInput input = builder.build();
293
294         setReturnForSvcLogicServiceClientHasGraph(true);
295         setReturnForSvcLogicServiceClientExecute(null);
296         exceptionThrowerConfigurator.setShouldThrowExceptionDuringTransactionPut(false);
297         checkVfModuleTopologyOperation(input, "200", null);
298     }
299     
300     @Test
301     public void vfModuleTopologyOperationInput_DeletePreloadNoErrorDuringTransactionWriting() throws Exception {
302         VfModuleTopologyOperationInputBuilder builder = createVfModuleTopologyOperationInputBuilder(createVfModuleRequestInformation(VNF_INSTANCE_ID, VF_MODULE_ID), createRequestInformation(RequestAction.DeletePreloadVfModuleRequest));
303         VfModuleTopologyOperationInput input = builder.build();
304
305         setReturnForSvcLogicServiceClientHasGraph(true);
306         setReturnForSvcLogicServiceClientExecute(null);
307         exceptionThrowerConfigurator.setShouldThrowExceptionDuringTransactionPut(false);
308         checkVfModuleTopologyOperation(input, "200", null);
309     }
310     private void checkVfModuleTopologyOperation(VfModuleTopologyOperationInput input,
311         String expectedResponseCode, String expectedResponseMessage) throws ExecutionException, InterruptedException {
312
313         VfModuleTopologyOperationOutput output = executeVfModuleTopologyOperation(input);
314         checkVfModuleTopologyOperationOutput(output, expectedResponseCode, expectedResponseMessage);
315     }
316
317     private VfModuleTopologyOperationOutput executeVfModuleTopologyOperation(
318         VfModuleTopologyOperationInput input) throws ExecutionException, InterruptedException {
319         return vnfapiProvider
320                 .vfModuleTopologyOperation(input)
321                 .get()
322                 .getResult();
323     }
324
325     private void checkVfModuleTopologyOperationOutput(VfModuleTopologyOperationOutput result,
326         String expectedResponseCode, String expectedResponseMessage) {
327
328         String expectedAckFinalIndicator = "Y";
329
330         Assert.assertEquals(expectedResponseCode , result.getResponseCode());
331         Assert.assertEquals(expectedResponseMessage, result.getResponseMessage());
332         Assert.assertEquals(expectedAckFinalIndicator, result.getAckFinalIndicator());
333     }
334
335     private void setReturnForSvcLogicServiceClientHasGraph(Boolean returnValue) throws Exception{
336         Mockito.when(mockVNFSDNSvcLogicServiceClient
337                 .hasGraph(Mockito.any(),Mockito.any(), Mockito.any(),Mockito.any()))
338                 .thenReturn(returnValue);
339     }
340
341     private void setReturnForSvcLogicServiceClientExecute(Properties properties) throws Exception{
342         Mockito.when(mockVNFSDNSvcLogicServiceClient
343                 .execute(Mockito.any(),
344                         Mockito.any(),
345                         Mockito.any(),
346                         Mockito.any(),
347                         Mockito.any(VfModuleServiceDataBuilder.class),
348                         Mockito.any()))
349                 .thenReturn(properties);
350     }
351
352     private void setMockVNFSDNSvcLogicServiceClientToThrowException(Class exceptionClass) throws Exception {
353         Mockito.when(mockVNFSDNSvcLogicServiceClient
354                 .execute(Mockito.any(),
355                         Mockito.any(),
356                         Mockito.any(),
357                         Mockito.any(),
358                         Mockito.any(VfModuleServiceDataBuilder.class),
359                         Mockito.any()))
360                 .thenThrow(exceptionClass.asSubclass(Throwable.class));
361     }
362
363     private VfModuleTopologyOperationInputBuilder createVfModuleTopologyOperationInputBuilder(VfModuleRequestInformation vfModuleRequestInformation, RequestInformation reqInfo) {
364         VfModuleTopologyOperationInputBuilder builder = new VfModuleTopologyOperationInputBuilder();
365         builder.setVfModuleRequestInformation(vfModuleRequestInformation);
366         builder.setRequestInformation(reqInfo);
367         return builder;
368     }
369
370
371
372     private VfModuleRequestInformation createVfModuleRequestInformation(String vnfInstanceId, String vfModuleId) {
373         return new VfModuleRequestInformationBuilder()
374                 .setVnfInstanceId(vnfInstanceId)
375                 .setVfModuleId(vfModuleId)
376                 .setVfModuleName(PRELOAD_NAME)
377                 .setVfModuleModelId(PRELOAD_TYPE)
378                 .build();
379     }
380     
381     private RequestInformation createRequestInformation(RequestAction action) {
382         return new RequestInformationBuilder()
383                 .setRequestAction(action)
384                 .build();
385     }
386     
387     
388 }