2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights
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
12 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
22 package org.onap.sdnc.vnfapi;
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;
49 import java.util.Properties;
50 import java.util.concurrent.ExecutionException;
52 class ExceptionThrowerConfigurator {
53 private boolean shouldThrowExceptionDuringTransactionPut;
55 public ExceptionThrowerConfigurator() {
56 this.shouldThrowExceptionDuringTransactionPut = true;
59 public boolean shouldThrowExceptionDuringTransactionPut() {
60 return shouldThrowExceptionDuringTransactionPut;
63 public void setShouldThrowExceptionDuringTransactionPut(boolean shouldThrowExceptionDuringTransactionPut) {
64 this.shouldThrowExceptionDuringTransactionPut = shouldThrowExceptionDuringTransactionPut;
68 class DataBrokerErrorMsgConfigurator {
69 static public String JAVA_LANG_RUNTIME_EXCEPTION = "java.lang.RuntimeException: ";
70 static public String TRANSACTION_WRITE_ERROR = "transaction-write-error";
73 class DataBrokerStab extends BindingDOMDataBrokerAdapter {
74 ExceptionThrowerConfigurator exceptionThrowerConfigurator;
76 public DataBrokerStab(final DOMDataBroker domDataBroker,
77 final BindingToNormalizedNodeCodec codec, ExceptionThrowerConfigurator exceptionThrowerConfigurator) {
78 super(domDataBroker, codec);
79 this.exceptionThrowerConfigurator = exceptionThrowerConfigurator;
84 public WriteTransaction newWriteOnlyTransaction() {
85 if (exceptionThrowerConfigurator.shouldThrowExceptionDuringTransactionPut()) {
86 return newThrowingExceptionWriteOnlyTransaction();
88 return newNotThrowingExceptionWriteOnlyTransaction();
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;
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;
108 class VnfApiProviderDataBrokerTestCustomizer extends ConcurrentDataBrokerTestCustomizer {
109 ExceptionThrowerConfigurator exceptionThrowerConfigurator;
111 public VnfApiProviderDataBrokerTestCustomizer(ExceptionThrowerConfigurator exceptionThrowerConfigurator) {
112 this.exceptionThrowerConfigurator = exceptionThrowerConfigurator;
115 public DataBroker createDataBroker() {
116 return new DataBrokerStab(createDOMDataBroker(),
117 super.getBindingToNormalized(), this.exceptionThrowerConfigurator);
121 @RunWith(MockitoJUnitRunner.class)
122 public class VnfInstanceTopologyOperationTest extends VnfApiProviderTest {
123 protected static final Logger LOG = LoggerFactory.getLogger(VnfInstanceTopologyOperationTest.class);
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";
135 private ExceptionThrowerConfigurator exceptionThrowerConfigurator;
138 protected AbstractDataBrokerTestCustomizer createDataBrokerTestCustomizer() {
139 this.exceptionThrowerConfigurator = new ExceptionThrowerConfigurator();
140 return new VnfApiProviderDataBrokerTestCustomizer(this.exceptionThrowerConfigurator);
144 public void setUp() throws Exception {
146 svcClient.setScvOperation(SVC_OPERATION);
150 public void vnfInstanceTopologyOperationInputIsNull() throws Exception {
151 VnfInstanceTopologyOperationInput input = null;
152 checkVnfInstanceTopologyOperation(input, "403", INVALID_INPUT);
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);
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);
172 public void vnfInstanceTopologyOperationInput_VnfInstanceRequestInformationVnfInstanceIdIsZero() throws Exception {
173 VnfInstanceTopologyOperationInputBuilder builder = createVnfInstanceTopologyOperationInputBuilder(createVnfInstanceRequestInformation(""));
174 VnfInstanceTopologyOperationInput input = builder.build();
175 checkVnfInstanceTopologyOperation(input, "403", INVALID_INPUT);
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);
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);
196 public void vnfInstanceTopologyOperationInput_svcLogicClientExecuteThrowsException() throws Exception {
197 VnfInstanceTopologyOperationInputBuilder builder = createVnfInstanceTopologyOperationInputBuilder(createVnfInstanceRequestInformation(VIID));
198 VnfInstanceTopologyOperationInput input = builder.build();
200 setReturnForSvcLogicServiceClientHasGraph(true);
201 setMockVNFSDNSvcLogicServiceClientToThrowException(Exception.class);
202 checkVnfInstanceTopologyOperation(input, "500", null);
206 public void vnfInstanceTopologyOperationInput_svcLogicClientExecuteReturnsNotNull() throws Exception {
207 VnfInstanceTopologyOperationInputBuilder builder = createVnfInstanceTopologyOperationInputBuilder(createVnfInstanceRequestInformation(VIID));
208 VnfInstanceTopologyOperationInput input = builder.build();
210 Properties properties = prop().set(ERROR_CODE, "500")
211 .set(ERROR_MESSAGE, ERROR_MESSAGE)
215 setReturnForSvcLogicServiceClientHasGraph(true);
216 setReturnForSvcLogicServiceClientExecute(properties);
217 checkVnfInstanceTopologyOperation(input, "500", ERROR_MESSAGE);
221 public void vnfInstanceTopologyOperationInput_svcLogicClientExecuteReturnsNull() throws Exception {
222 VnfInstanceTopologyOperationInputBuilder builder = createVnfInstanceTopologyOperationInputBuilder(createVnfInstanceRequestInformation(VIID));
223 VnfInstanceTopologyOperationInput input = builder.build();
225 setReturnForSvcLogicServiceClientHasGraph(true);
226 setReturnForSvcLogicServiceClientExecute(null);
227 String expectedErrorMsg = DataBrokerErrorMsgConfigurator.JAVA_LANG_RUNTIME_EXCEPTION
228 + DataBrokerErrorMsgConfigurator.TRANSACTION_WRITE_ERROR;
229 checkVnfInstanceTopologyOperation(input, "500", expectedErrorMsg);
233 public void vnfInstanceTopologyOperationInput_NoErrorDuringTransactionWriting() throws Exception {
234 VnfInstanceTopologyOperationInputBuilder builder = createVnfInstanceTopologyOperationInputBuilder(createVnfInstanceRequestInformation(VIID));
235 VnfInstanceTopologyOperationInput input = builder.build();
237 setReturnForSvcLogicServiceClientHasGraph(true);
238 setReturnForSvcLogicServiceClientExecute(null);
239 exceptionThrowerConfigurator.setShouldThrowExceptionDuringTransactionPut(false);
240 checkVnfInstanceTopologyOperation(input, "200", null);
243 private void checkVnfInstanceTopologyOperation(VnfInstanceTopologyOperationInput input,
244 String expectedResponseCode, String expectedResponseMessage) throws ExecutionException, InterruptedException {
246 VnfInstanceTopologyOperationOutput output = executeVnfInstanceTopologyOperation(input);
247 checkVnfInstanceTopologyOperationOutput(output, expectedResponseCode, expectedResponseMessage);
250 private VnfInstanceTopologyOperationOutput executeVnfInstanceTopologyOperation(
251 VnfInstanceTopologyOperationInput input) throws ExecutionException, InterruptedException {
252 return vnfapiProvider
253 .vnfInstanceTopologyOperation(input)
258 private void checkVnfInstanceTopologyOperationOutput(VnfInstanceTopologyOperationOutput result,
259 String expectedResponseCode, String expectedResponseMessage) {
261 String expectedAckFinalIndicator = "Y";
263 Assert.assertEquals(expectedResponseCode , result.getResponseCode());
264 Assert.assertEquals(expectedResponseMessage, result.getResponseMessage());
265 Assert.assertEquals(expectedAckFinalIndicator, result.getAckFinalIndicator());
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);
274 private void setReturnForSvcLogicServiceClientExecute(Properties properties) throws Exception{
275 Mockito.when(mockVNFSDNSvcLogicServiceClient
276 .execute(Mockito.any(),
280 Mockito.any(VnfInstanceServiceDataBuilder.class),
282 .thenReturn(properties);
285 private void setMockVNFSDNSvcLogicServiceClientToThrowException(Class exceptionClass) throws Exception {
286 Mockito.when(mockVNFSDNSvcLogicServiceClient
287 .execute(Mockito.any(),
291 Mockito.any(VnfInstanceServiceDataBuilder.class),
293 .thenThrow(exceptionClass.asSubclass(Throwable.class));
296 private VnfInstanceTopologyOperationInputBuilder createVnfInstanceTopologyOperationInputBuilder(VnfInstanceRequestInformation vnfInstanceRequestInformation) {
297 VnfInstanceTopologyOperationInputBuilder builder = new VnfInstanceTopologyOperationInputBuilder();
298 builder.setVnfInstanceRequestInformation(vnfInstanceRequestInformation);
304 private VnfInstanceRequestInformation createVnfInstanceRequestInformation(String vnfInstanceId) {
305 return new VnfInstanceRequestInformationBuilder()
306 .setVnfInstanceId(vnfInstanceId)
307 .setVnfInstanceName(PRELOAD_NAME)
308 .setVnfModelId(PRELOAD_TYPE)