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) {
113 this.exceptionThrowerConfigurator = exceptionThrowerConfigurator;
116 public DataBroker createDataBroker() {
117 return new DataBrokerStab(createDOMDataBroker(),
118 super.getBindingToNormalized(), this.exceptionThrowerConfigurator);
122 @RunWith(MockitoJUnitRunner.class)
123 public class VnfInstanceTopologyOperationTest extends VnfApiProviderTest {
124 protected static final Logger LOG = LoggerFactory.getLogger(VnfInstanceTopologyOperationTest.class);
126 private static final String INVALID_INPUT = "invalid input, null or empty vnf-instance-id";
127 private static final String NO_SERVICE_LOGIC = "No service logic active for VNF-API: \'vnf-instance-topology-operation\'";
128 private static final String VIID = "viid";
129 private static final String PRELOAD_NAME = "preloadName";
130 private static final String PRELOAD_TYPE = "preloadType";
131 private static final String ERROR_CODE = "error-code";
132 private static final String ERROR_MESSAGE = "error-message";
133 private static final String ACK_FINAL = "ack-final";
134 private static final String SVC_OPERATION = "vnf-topology-operation";
136 private ExceptionThrowerConfigurator exceptionThrowerConfigurator;
139 protected AbstractDataBrokerTestCustomizer createDataBrokerTestCustomizer() {
140 this.exceptionThrowerConfigurator = new ExceptionThrowerConfigurator();
141 return new VnfApiProviderDataBrokerTestCustomizer(this.exceptionThrowerConfigurator);
145 public void setUp() throws Exception {
147 svcClient.setScvOperation(SVC_OPERATION);
151 public void vnfInstanceTopologyOperationInputIsNull() throws Exception {
152 VnfInstanceTopologyOperationInput input = null;
153 checkVnfInstanceTopologyOperation(input, "403", INVALID_INPUT);
157 public void vnfInstanceTopologyOperationInput_VnfInstanceRequestInformationIsNull() throws Exception {
158 VnfInstanceTopologyOperationInputBuilder builder = new VnfInstanceTopologyOperationInputBuilder();
159 builder.setVnfInstanceRequestInformation(null);
160 VnfInstanceTopologyOperationInput input = builder.build();
161 checkVnfInstanceTopologyOperation(input, "403", INVALID_INPUT);
165 public void vnfInstanceTopologyOperationInput_getVnfInstanceRequestInformationVnfInstanceIdIsNull() throws Exception {
166 VnfInstanceRequestInformation vnfInstanceRequestInformation = createVnfInstanceRequestInformation(null);
167 VnfInstanceTopologyOperationInputBuilder builder = createVnfInstanceTopologyOperationInputBuilder(vnfInstanceRequestInformation);
168 VnfInstanceTopologyOperationInput input = builder.build();
169 checkVnfInstanceTopologyOperation(input, "403", INVALID_INPUT);
173 public void vnfInstanceTopologyOperationInput_VnfInstanceRequestInformationVnfInstanceIdIsZero() throws Exception {
174 VnfInstanceTopologyOperationInputBuilder builder = createVnfInstanceTopologyOperationInputBuilder(createVnfInstanceRequestInformation(""));
175 VnfInstanceTopologyOperationInput input = builder.build();
176 checkVnfInstanceTopologyOperation(input, "403", INVALID_INPUT);
180 public void vnfInstanceTopologyOperationInput_svcLogicClientHasGrapheReturnFalse() throws Exception {
181 VnfInstanceTopologyOperationInputBuilder builder = createVnfInstanceTopologyOperationInputBuilder(createVnfInstanceRequestInformation(VIID));
182 VnfInstanceTopologyOperationInput input = builder.build();
183 setReturnForSvcLogicServiceClientHasGraph(false);
184 checkVnfInstanceTopologyOperation(input, "503", NO_SERVICE_LOGIC);
188 public void vnfInstanceTopologyOperationInput_svcLogicClientExecuteThrowsSvcLogicException() throws Exception {
189 VnfInstanceTopologyOperationInputBuilder builder = createVnfInstanceTopologyOperationInputBuilder(createVnfInstanceRequestInformation(VIID));
190 VnfInstanceTopologyOperationInput input = builder.build();
191 setReturnForSvcLogicServiceClientHasGraph(true);
192 setMockVNFSDNSvcLogicServiceClientToThrowException(SvcLogicException.class);
193 checkVnfInstanceTopologyOperation(input, "500", null);
197 public void vnfInstanceTopologyOperationInput_svcLogicClientExecuteThrowsException() throws Exception {
198 VnfInstanceTopologyOperationInputBuilder builder = createVnfInstanceTopologyOperationInputBuilder(createVnfInstanceRequestInformation(VIID));
199 VnfInstanceTopologyOperationInput input = builder.build();
201 setReturnForSvcLogicServiceClientHasGraph(true);
202 setMockVNFSDNSvcLogicServiceClientToThrowException(Exception.class);
203 checkVnfInstanceTopologyOperation(input, "500", null);
207 public void vnfInstanceTopologyOperationInput_svcLogicClientExecuteReturnsNotNull() throws Exception {
208 VnfInstanceTopologyOperationInputBuilder builder = createVnfInstanceTopologyOperationInputBuilder(createVnfInstanceRequestInformation(VIID));
209 VnfInstanceTopologyOperationInput input = builder.build();
211 Properties properties = prop().set(ERROR_CODE, "500")
212 .set(ERROR_MESSAGE, ERROR_MESSAGE)
216 setReturnForSvcLogicServiceClientHasGraph(true);
217 setReturnForSvcLogicServiceClientExecute(properties);
218 checkVnfInstanceTopologyOperation(input, "500", ERROR_MESSAGE);
222 public void vnfInstanceTopologyOperationInput_svcLogicClientExecuteReturnsNull() throws Exception {
223 VnfInstanceTopologyOperationInputBuilder builder = createVnfInstanceTopologyOperationInputBuilder(createVnfInstanceRequestInformation(VIID));
224 VnfInstanceTopologyOperationInput input = builder.build();
226 setReturnForSvcLogicServiceClientHasGraph(true);
227 setReturnForSvcLogicServiceClientExecute(null);
228 String expectedErrorMsg = DataBrokerErrorMsgConfigurator.JAVA_LANG_RUNTIME_EXCEPTION
229 + DataBrokerErrorMsgConfigurator.TRANSACTION_WRITE_ERROR;
230 checkVnfInstanceTopologyOperation(input, "500", expectedErrorMsg);
234 public void vnfInstanceTopologyOperationInput_NoErrorDuringTransactionWriting() throws Exception {
235 VnfInstanceTopologyOperationInputBuilder builder = createVnfInstanceTopologyOperationInputBuilder(createVnfInstanceRequestInformation(VIID));
236 VnfInstanceTopologyOperationInput input = builder.build();
238 setReturnForSvcLogicServiceClientHasGraph(true);
239 setReturnForSvcLogicServiceClientExecute(null);
240 exceptionThrowerConfigurator.setShouldThrowExceptionDuringTransactionPut(false);
241 checkVnfInstanceTopologyOperation(input, "200", null);
244 private void checkVnfInstanceTopologyOperation(VnfInstanceTopologyOperationInput input,
245 String expectedResponseCode, String expectedResponseMessage) throws ExecutionException, InterruptedException {
247 VnfInstanceTopologyOperationOutput output = executeVnfInstanceTopologyOperation(input);
248 checkVnfInstanceTopologyOperationOutput(output, expectedResponseCode, expectedResponseMessage);
251 private VnfInstanceTopologyOperationOutput executeVnfInstanceTopologyOperation(
252 VnfInstanceTopologyOperationInput input) throws ExecutionException, InterruptedException {
253 return vnfapiProvider
254 .vnfInstanceTopologyOperation(input)
259 private void checkVnfInstanceTopologyOperationOutput(VnfInstanceTopologyOperationOutput result,
260 String expectedResponseCode, String expectedResponseMessage) {
262 String expectedAckFinalIndicator = "Y";
264 Assert.assertEquals(expectedResponseCode , result.getResponseCode());
265 Assert.assertEquals(expectedResponseMessage, result.getResponseMessage());
266 Assert.assertEquals(expectedAckFinalIndicator, result.getAckFinalIndicator());
269 private void setReturnForSvcLogicServiceClientHasGraph(Boolean returnValue) throws Exception{
270 Mockito.when(mockVNFSDNSvcLogicServiceClient
271 .hasGraph(Mockito.any(),Mockito.any(), Mockito.any(),Mockito.any()))
272 .thenReturn(returnValue);
275 private void setReturnForSvcLogicServiceClientExecute(Properties properties) throws Exception{
276 Mockito.when(mockVNFSDNSvcLogicServiceClient
277 .execute(Mockito.any(),
281 Mockito.any(VnfInstanceServiceDataBuilder.class),
283 .thenReturn(properties);
286 private void setMockVNFSDNSvcLogicServiceClientToThrowException(Class exceptionClass) throws Exception {
287 Mockito.when(mockVNFSDNSvcLogicServiceClient
288 .execute(Mockito.any(),
292 Mockito.any(VnfInstanceServiceDataBuilder.class),
294 .thenThrow(exceptionClass.asSubclass(Throwable.class));
297 private VnfInstanceTopologyOperationInputBuilder createVnfInstanceTopologyOperationInputBuilder(VnfInstanceRequestInformation vnfInstanceRequestInformation) {
298 VnfInstanceTopologyOperationInputBuilder builder = new VnfInstanceTopologyOperationInputBuilder();
299 builder.setVnfInstanceRequestInformation(vnfInstanceRequestInformation);
305 private VnfInstanceRequestInformation createVnfInstanceRequestInformation(String vnfInstanceId) {
306 return new VnfInstanceRequestInformationBuilder()
307 .setVnfInstanceId(vnfInstanceId)
308 .setVnfInstanceName(PRELOAD_NAME)
309 .setVnfModelId(PRELOAD_TYPE)