From: Jakub Dudycz Date: Tue, 20 Mar 2018 15:27:15 +0000 (+0100) Subject: GenericResourceApiProvider unit tests part 5. X-Git-Tag: v1.3.1~4 X-Git-Url: https://gerrit.onap.org/r/gitweb?p=sdnc%2Fnorthbound.git;a=commitdiff_plain;h=29c3b1e0557e10b1ee4570324e85771f6db8b2c3 GenericResourceApiProvider unit tests part 5. Added unit tests for contrailRouteTopologyOperation method Change-Id: I8519c5e1f3b8e076186f1965a8e316d0a35095ff Issue-ID: SDNC-275 Signed-off-by: Jakub Dudycz --- diff --git a/generic-resource-api/provider/src/main/java/org/onap/sdnc/northbound/GenericResourceApiProvider.java b/generic-resource-api/provider/src/main/java/org/onap/sdnc/northbound/GenericResourceApiProvider.java index 197ffdc5..13b02f95 100644 --- a/generic-resource-api/provider/src/main/java/org/onap/sdnc/northbound/GenericResourceApiProvider.java +++ b/generic-resource-api/provider/src/main/java/org/onap/sdnc/northbound/GenericResourceApiProvider.java @@ -1322,7 +1322,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC final String svcOperation = "contrail-route-topology-operation"; ServiceData serviceData; ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder(); - Properties parms = new Properties(); + Properties properties = new Properties(); log.info(CALLED_STR, svcOperation); // create a new response object @@ -1349,7 +1349,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC log.info("Adding INPUT data for " + svcOperation + " [" + siid + "] input: " + input); ContrailRouteTopologyOperationInputBuilder inputBuilder = new ContrailRouteTopologyOperationInputBuilder(input); - GenericResourceApiUtil.toProperties(parms, inputBuilder.build()); + GenericResourceApiUtil.toProperties(properties, inputBuilder.build()); // Call SLI sync method // Get SvcLogicService reference @@ -1358,7 +1358,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC String allottedResourceId = ERROR_NETWORK_ID; String serviceObjectPath = null; String contrailRouteObjectPath = null; - Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, error); + Properties respProps = tryGetProperties(svcOperation, properties, serviceDataBuilder, error); if (respProps != null) { error.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM)); @@ -1410,7 +1410,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC } catch (IllegalStateException e) { log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e); responseBuilder.setResponseCode("500"); - responseBuilder.setResponseMessage(e.toString()); + responseBuilder.setResponseMessage(e.getMessage()); responseBuilder.setAckFinalIndicator("Y"); log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build()); diff --git a/generic-resource-api/provider/src/test/java/org/onap/sdnc/northbound/ContrailRouteTopologyOperationRPCTest.java b/generic-resource-api/provider/src/test/java/org/onap/sdnc/northbound/ContrailRouteTopologyOperationRPCTest.java new file mode 100644 index 00000000..d3513f70 --- /dev/null +++ b/generic-resource-api/provider/src/test/java/org/onap/sdnc/northbound/ContrailRouteTopologyOperationRPCTest.java @@ -0,0 +1,174 @@ +package org.onap.sdnc.northbound; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static org.onap.sdnc.northbound.GenericResourceApiProvider.APP_NAME; +import static org.onap.sdnc.northbound.GenericResourceApiProvider.INVALID_INPUT_ERROR_MESSAGE; +import static org.onap.sdnc.northbound.GenericResourceApiProvider.NO_SERVICE_LOGIC_ACTIVE; +import static org.onap.sdnc.northbound.GenericResourceApiProvider.NULL_OR_EMPTY_ERROR_PARAM; +import static org.onap.sdnc.northbound.util.MDSALUtil.build; +import static org.onap.sdnc.northbound.util.MDSALUtil.contrailRouteTopologyOperationInput; +import static org.onap.sdnc.northbound.util.MDSALUtil.exec; +import static org.onap.sdnc.northbound.util.MDSALUtil.service; +import static org.onap.sdnc.northbound.util.MDSALUtil.serviceData; +import static org.onap.sdnc.northbound.util.MDSALUtil.serviceInformationBuilder; +import static org.onap.sdnc.northbound.util.MDSALUtil.serviceLevelOperStatus; + +import java.time.Instant; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.mockito.runners.MockitoJUnitRunner; +import org.onap.sdnc.northbound.util.PropBuilder; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.controller.md.sal.common.api.data.TransactionChainClosedException; +import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationInput; +import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationOutput; +import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.LastAction; +import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.LastOrderStatus; +import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.LastRpcAction; +import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.OperStatusData.OrderStatus; +import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.model.infrastructure.Service; +import org.opendaylight.yangtools.yang.common.RpcResult; + +@RunWith(MockitoJUnitRunner.class) +public class ContrailRouteTopologyOperationRPCTest extends GenericResourceApiProviderTest { + + private static final String SVC_OPERATION = "contrail-route-topology-operation"; + + + @Before + public void setUp() throws Exception { + super.setUp(); + svcClient.setScvOperation(SVC_OPERATION); + } + + @Test + public void should_fail_when_service_instance_id_not_present() throws Exception { + + ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput()); + + ContrailRouteTopologyOperationOutput output = + exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult); + + assertEquals("404", output.getResponseCode()); + assertEquals(NULL_OR_EMPTY_ERROR_PARAM, output.getResponseMessage()); + assertEquals("Y", output.getAckFinalIndicator()); + } + + + @Test + public void should_fail_when_invalid_service_data() throws Exception { + + ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput() + .setServiceInformation(build(serviceInformationBuilder() + .setServiceInstanceId("test-service-instance-id") + )) + ); + + ContrailRouteTopologyOperationOutput output = + exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult); + + assertEquals("404", output.getResponseCode()); + assertEquals(INVALID_INPUT_ERROR_MESSAGE, output.getResponseMessage()); + assertEquals("Y", output.getAckFinalIndicator()); + } + + + @Test + public void should_fail_when_client_execution_failed() throws Exception { + + svcClient.mockHasGraph(true); + svcClient.mockExecute(new RuntimeException("test exception")); + + ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput() + .setServiceInformation(build(serviceInformationBuilder() + .setServiceInstanceId("test-service-instance-id") + )) + ); + + persistServiceInDataBroker(input); + + ContrailRouteTopologyOperationOutput output = + exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult); + + assertEquals("500", output.getResponseCode()); + assertEquals("test exception", output.getResponseMessage()); + assertEquals("Y", output.getAckFinalIndicator()); + } + + @Test + public void should_fail_when_client_has_no_graph() throws Exception { + + svcClient.mockHasGraph(false); + + ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput() + .setServiceInformation(build(serviceInformationBuilder() + .setServiceInstanceId("test-service-instance-id") + )) + ); + + persistServiceInDataBroker(input); + + ContrailRouteTopologyOperationOutput output = + exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult); + + assertEquals("503", output.getResponseCode()); + assertEquals(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + SVC_OPERATION + "'", output.getResponseMessage()); + assertEquals("Y", output.getAckFinalIndicator()); + } + + @Test + public void should_fail_when_failed_to_update_mdsal() throws Exception { + + PropBuilder svcResultProp = svcClient.createExecuteOKResult(); + svcClient.mockExecute(svcResultProp); + svcClient.mockHasGraph(true); + WriteTransaction mockWriteTransaction = mock(WriteTransaction.class); + when(mockWriteTransaction.submit()).thenThrow(new TransactionChainClosedException("test exception")); + + DataBroker spyDataBroker = Mockito.spy(dataBroker); + when(spyDataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTransaction); + genericResourceApiProvider.setDataBroker(spyDataBroker); + + ContrailRouteTopologyOperationInput input = build(contrailRouteTopologyOperationInput() + .setServiceInformation(build(serviceInformationBuilder() + .setServiceInstanceId("test-service-instance-id") + )) + ); + + persistServiceInDataBroker(input); + + ContrailRouteTopologyOperationOutput output = + exec(genericResourceApiProvider::contrailRouteTopologyOperation, input, RpcResult::getResult); + + assertEquals("500", output.getResponseCode()); + assertEquals("test exception", output.getResponseMessage()); + assertEquals("Y", output.getAckFinalIndicator()); + } + + + private Service persistServiceInDataBroker(ContrailRouteTopologyOperationInput input) throws Exception { + + Service service = build(service() + .setServiceInstanceId(input.getServiceInformation().getServiceInstanceId()) + .setServiceData(build(serviceData() + .setServiceLevelOperStatus(build(serviceLevelOperStatus() + .setOrderStatus(OrderStatus.Created) + .setModifyTimestamp(Instant.now().toString()) + .setLastSvcRequestId("svc-request-id: abc") + .setLastRpcAction(LastRpcAction.Activate) + .setLastOrderStatus(LastOrderStatus.PendingAssignment) + .setLastAction(LastAction.ActivateNetworkInstance) + .setCreateTimestamp(Instant.now().toString()) + )) + )) + ); + db.write(true, service, LogicalDatastoreType.CONFIGURATION); + return service; + } +} diff --git a/generic-resource-api/provider/src/test/java/org/onap/sdnc/northbound/util/MDSALUtil.java b/generic-resource-api/provider/src/test/java/org/onap/sdnc/northbound/util/MDSALUtil.java index cea51b44..aa533925 100644 --- a/generic-resource-api/provider/src/test/java/org/onap/sdnc/northbound/util/MDSALUtil.java +++ b/generic-resource-api/provider/src/test/java/org/onap/sdnc/northbound/util/MDSALUtil.java @@ -24,6 +24,8 @@ package org.onap.sdnc.northbound.util; import java.util.concurrent.Future; import java.util.function.Consumer; import java.util.function.Function; +import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationInputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationOutputBuilder; import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.NetworkTopologyOperationInputBuilder; import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.NetworkTopologyOperationOutputBuilder; import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ServiceTopologyOperationInputBuilder; @@ -75,6 +77,14 @@ import org.opendaylight.yangtools.yang.common.RpcResult; */ public class MDSALUtil { + public static ContrailRouteTopologyOperationInputBuilder contrailRouteTopologyOperationInput() { + return new ContrailRouteTopologyOperationInputBuilder(); + } + + public static ContrailRouteTopologyOperationOutputBuilder contrailRouteTopologyOperationOutput() { + return new ContrailRouteTopologyOperationOutputBuilder(); + } + public static VfModuleTopologyOperationInputBuilder vfModuleTopologyOperationInput() { return new VfModuleTopologyOperationInputBuilder(); }