X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=servicehandler%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Ftransportpce%2Fservicehandler%2Fimpl%2FServicehandlerImplTest.java;h=1e5639cc0f4c3c0c516194828c5e522603b20051;hb=198afc243c98aedfc5b30b93c1a5e3052d30868c;hp=3dd14172827a3ac270f7608f47146005bf3fb207;hpb=69ea18039f476d7ca6dabf691a5f32b0f47eba30;p=transportpce.git diff --git a/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerImplTest.java b/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerImplTest.java index 3dd141728..1e5639cc0 100644 --- a/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerImplTest.java +++ b/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerImplTest.java @@ -7,168 +7,602 @@ */ package org.opendaylight.transportpce.servicehandler.impl; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.opendaylight.transportpce.servicehandler.impl.ServicehandlerImpl.LogMessages; + +import com.google.common.collect.ClassToInstanceMap; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; -import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService; +import org.mockito.junit.jupiter.MockitoExtension; +import org.opendaylight.mdsal.binding.api.NotificationPublishService; +import org.opendaylight.mdsal.binding.api.RpcProviderService; import org.opendaylight.transportpce.common.ResponseCodes; +import org.opendaylight.transportpce.common.network.NetworkTransactionImpl; import org.opendaylight.transportpce.pce.service.PathComputationService; import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations; -import org.opendaylight.transportpce.servicehandler.listeners.PceListenerImpl; -import org.opendaylight.transportpce.servicehandler.listeners.RendererListenerImpl; +import org.opendaylight.transportpce.servicehandler.ServiceInput; +import org.opendaylight.transportpce.servicehandler.catalog.CatalogDataStoreOperations; +import org.opendaylight.transportpce.servicehandler.catalog.CatalogDataStoreOperationsImpl; +import org.opendaylight.transportpce.servicehandler.listeners.NetworkListener; +import org.opendaylight.transportpce.servicehandler.listeners.PceListener; +import org.opendaylight.transportpce.servicehandler.listeners.RendererListener; +import org.opendaylight.transportpce.servicehandler.service.PCEServiceWrapper; +import org.opendaylight.transportpce.servicehandler.service.RendererServiceWrapper; +import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations; import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperationsImpl; +import org.opendaylight.transportpce.servicehandler.utils.CatalogDataUtils; import org.opendaylight.transportpce.servicehandler.utils.ServiceDataUtils; import org.opendaylight.transportpce.test.AbstractTest; -import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev161014.*; -import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev161014.service.delete.input.ServiceDeleteReqInfoBuilder; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutputBuilder; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRerouteRequestOutputBuilder; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.service.path.rpc.result.PathDescription; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommonBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddOpenroadmOperationalModesToCatalogInputBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddOpenroadmOperationalModesToCatalogOutput; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddSpecificOperationalModesToCatalogInputBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddSpecificOperationalModesToCatalogOutput; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInput; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInputBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateOutput; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteInput; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteInputBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteOutput; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceFeasibilityCheckInputBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceFeasibilityCheckOutput; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReconfigureInput; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReconfigureInputBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReconfigureOutput; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteInput; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteInputBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteOutput; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRestorationInput; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRestorationInputBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRestorationOutput; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateInput; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateInputBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateOutput; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceDeleteInputBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceDeleteOutput; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.delete.input.ServiceDeleteReqInfoBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.ServicesBuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirectionBuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirectionBuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZ; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZBuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZKey; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.ResourceBuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.TerminationPointBuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.response.parameters.sp.ResponseParametersBuilder; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.response.parameters.sp.response.parameters.PathDescriptionBuilder; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.Uint32; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Executors; - -import static org.mockito.ArgumentMatchers.any; - -public class ServicehandlerImplTest extends AbstractTest { - +@ExtendWith(MockitoExtension.class) +public class ServicehandlerImplTest extends AbstractTest { + @Mock + private RpcProviderService rpcProviderService; @Mock private PathComputationService pathComputationService; - @Mock private RendererServiceOperations rendererServiceOperations; - @Mock private NotificationPublishService notificationPublishService; - @Mock - private PceListenerImpl pceListenerImpl; - + private PceListener pceListenerImpl; + @Mock + private RendererListener rendererListenerImpl; @Mock - private RendererListenerImpl rendererListenerImpl; + private NetworkListener networkModelListenerImpl; + @Mock + private PathDescription pathDescription; + private ServiceDataStoreOperations serviceDataStoreOperations; + private CatalogDataStoreOperations catalogDataStoreOperations; + private ServiceCreateInput serviceCreateInput; + private ServiceDeleteInput serviceDeleteInput; + private ServiceReconfigureInput serviceReconfigureInput; + private ServiceRestorationInput serviceRestorationInput; + private ServiceRerouteInput serviceRerouteInput; private ListeningExecutorService executorService; private CountDownLatch endSignal; private static final int NUM_THREADS = 5; - private boolean callbackRan; + private PCEServiceWrapper pceServiceWrapper; + private RendererServiceWrapper rendererServiceWrapper; - @Before - public void setUp() { + @BeforeEach + void setUp() { executorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(NUM_THREADS)); endSignal = new CountDownLatch(1); - callbackRan = false; - MockitoAnnotations.initMocks(this); + this.serviceDataStoreOperations = new ServiceDataStoreOperationsImpl(getNewDataBroker()); + this.catalogDataStoreOperations = + new CatalogDataStoreOperationsImpl(new NetworkTransactionImpl(getDataBroker())); + serviceCreateInput = ServiceDataUtils.buildServiceCreateInput(); + serviceDeleteInput = ServiceDataUtils.buildServiceDeleteInput(); + serviceReconfigureInput = ServiceDataUtils.buildServiceReconfigureInput(); + serviceRestorationInput = ServiceDataUtils.buildServiceRestorationInput(); + serviceRerouteInput = ServiceDataUtils.buildServiceRerouteInput(); + pathDescription = ServiceDataUtils.createPathDescription(0,1,0,1); + pceServiceWrapper = new PCEServiceWrapper(pathComputationService, notificationPublishService); + this.rendererServiceWrapper = new RendererServiceWrapper(rendererServiceOperations, notificationPublishService); } @Test - public void createServiceShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException { - ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); - ListenableFuture> result = servicehandlerImpl.serviceCreate(new ServiceCreateInputBuilder().build()); - result.addListener(new Runnable() { - @Override - public void run() { - callbackRan = true; - endSignal.countDown(); - } - }, executorService); + void testRpcRegistration() { + new ServicehandlerImpl(rpcProviderService, serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl, + networkModelListenerImpl, catalogDataStoreOperations, pathComputationService, rendererServiceOperations, + notificationPublishService); + verify(rpcProviderService, times(1)).registerRpcImplementations(any(ClassToInstanceMap.class)); + } + +// @Test +// void testNotImplementedRpc() throws InterruptedException, ExecutionException { +// ListenableFuture> result = new ServicehandlerImpl(rpcProviderService, +// serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl, networkModelListenerImpl, +// catalogDataStoreOperations, pathComputationService, rendererServiceOperations, +// notificationPublishService) +// .serviceSrlgGet(new ServiceSrlgGetInputBuilder().build()); +// +// result.addListener(() -> endSignal.countDown(), executorService); +// endSignal.await(); +// assertNotNull(result.get()); +// assertFalse(result.get().isSuccessful()); +// assertNull(result.get().getResult()); +// assertEquals(ErrorType.RPC, result.get().getErrors().get(0).getErrorType()); +// assertEquals(ErrorSeverity.ERROR, result.get().getErrors().get(0).getSeverity()); +// assertEquals(ErrorTag.OPERATION_NOT_SUPPORTED, result.get().getErrors().get(0).getTag()); +// assertEquals("RPC not implemented yet", result.get().getErrors().get(0).getMessage()); +// } + @Test + void createServiceShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException { + ListenableFuture> result = + new ServiceCreateImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl, + networkModelListenerImpl, pceServiceWrapper, notificationPublishService) + .invoke(new ServiceCreateInputBuilder().build()); + result.addListener(() -> endSignal.countDown(), executorService); endSignal.await(); + assertEquals( + ResponseCodes.RESPONSE_FAILED, + result.get().getResult().getConfigurationResponseCommon().getResponseCode()); + } - RpcResult rpcResult = result.get(); - Assert.assertEquals(ResponseCodes.RESPONSE_FAILED, rpcResult.getResult().getConfigurationResponseCommon().getResponseCode()); + @Test + void createServiceShouldBeFailedWithServiceAlreadyExist() throws ExecutionException, InterruptedException { + final ServiceDataStoreOperations serviceDSOperations = mock(ServiceDataStoreOperations.class); + when(serviceDSOperations.getService(serviceCreateInput.getServiceName())) + .thenReturn(Optional.of( + new ServicesBuilder() + .setServiceName(serviceCreateInput.getServiceName()) + .build())); + ListenableFuture> result = + new ServiceCreateImpl(serviceDSOperations, pceListenerImpl, rendererListenerImpl, + networkModelListenerImpl, pceServiceWrapper, notificationPublishService) + .invoke(serviceCreateInput); + result.addListener(() -> endSignal.countDown(), executorService); + endSignal.await(); + assertEquals( + ResponseCodes.RESPONSE_FAILED, + result.get().getResult().getConfigurationResponseCommon().getResponseCode()); } @Test - public void createServiceShouldBeSuccessfulWhenPreformPCESuccessful() throws ExecutionException, InterruptedException { - ServiceCreateInput input = ServiceDataUtils.buildServiceCreateInput(); - Mockito.when(pathComputationService.pathComputationRequest(any())).thenReturn(Futures.immediateFuture(any())); - ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); - ListenableFuture> result = servicehandlerImpl.serviceCreate(input); - result.addListener(new Runnable() { - @Override - public void run() { - callbackRan = true; - endSignal.countDown(); - } - }, executorService); + void createServiceShouldBeSuccessfulWhenPerformPCESuccessful() throws ExecutionException, InterruptedException { + when(pathComputationService.pathComputationRequest(any())).thenReturn(Futures.immediateFuture(any())); + ListenableFuture> result = + new ServiceCreateImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl, + networkModelListenerImpl, pceServiceWrapper, notificationPublishService) + .invoke(serviceCreateInput); + result.addListener(() -> endSignal.countDown(), executorService); + endSignal.await(); + assertEquals( + ResponseCodes.RESPONSE_OK, + result.get().getResult().getConfigurationResponseCommon().getResponseCode()); + } + @Test + void deleteServiceShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException { + ListenableFuture> result = + new ServiceDeleteImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl, + networkModelListenerImpl, rendererServiceWrapper, notificationPublishService) + .invoke(new ServiceDeleteInputBuilder() + .setServiceDeleteReqInfo(new ServiceDeleteReqInfoBuilder() + .setServiceName("") + .build()) + .build()); + result.addListener(() -> endSignal.countDown(), executorService); endSignal.await(); + assertEquals( + ResponseCodes.RESPONSE_FAILED, + result.get().getResult().getConfigurationResponseCommon().getResponseCode()); + } - RpcResult rpcResult = result.get(); - Assert.assertEquals(ResponseCodes.RESPONSE_OK, rpcResult.getResult().getConfigurationResponseCommon().getResponseCode()); + @Test + void deleteServiceShouldBeFailedWithNonExistService() throws ExecutionException, InterruptedException { + ListenableFuture> result = + new ServiceDeleteImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl, + networkModelListenerImpl, rendererServiceWrapper, notificationPublishService) + .invoke(serviceDeleteInput); + result.addListener(() -> endSignal.countDown(), executorService); + endSignal.await(); + assertEquals( + ResponseCodes.RESPONSE_FAILED, + result.get().getResult().getConfigurationResponseCommon().getResponseCode()); } @Test - public void deleteServiceShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException { - ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); - ListenableFuture> result = servicehandlerImpl.serviceDelete(new ServiceDeleteInputBuilder() - .setServiceDeleteReqInfo(new ServiceDeleteReqInfoBuilder().setServiceName("").build()).build()); - result.addListener(new Runnable() { - @Override - public void run() { - callbackRan = true; - endSignal.countDown(); - } - }, executorService); + void deleteServiceShouldBeSuccessForExistingService() throws ExecutionException, InterruptedException { + when(rendererServiceOperations.serviceDelete(any(), any())).thenReturn(Futures.immediateFuture(any())); + serviceDataStoreOperations.createService(serviceCreateInput); + ListenableFuture> result = + new ServiceDeleteImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl, + networkModelListenerImpl, rendererServiceWrapper, notificationPublishService) + .invoke(serviceDeleteInput); + result.addListener(() -> endSignal.countDown(), executorService); + endSignal.await(); + assertEquals( + ResponseCodes.RESPONSE_OK, + result.get().getResult().getConfigurationResponseCommon().getResponseCode()); + } + @Test + void serviceFeasibilityCheckShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException { + ListenableFuture> result = + new ServiceFeasibilityCheckImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl, + networkModelListenerImpl, pceServiceWrapper) + .invoke(new ServiceFeasibilityCheckInputBuilder().build()); + result.addListener(() -> endSignal.countDown(), executorService); endSignal.await(); + assertEquals( + ResponseCodes.RESPONSE_FAILED, + result.get().getResult().getConfigurationResponseCommon().getResponseCode()); + } - RpcResult rpcResult = result.get(); - Assert.assertEquals(ResponseCodes.RESPONSE_FAILED, rpcResult.getResult().getConfigurationResponseCommon().getResponseCode()); + @Test + void serviceFeasibilityCheckShouldBeSuccessfulWhenPerformPCESuccessful() + throws ExecutionException, InterruptedException { + when(pathComputationService.pathComputationRequest(any())).thenReturn(Futures.immediateFuture(any())); + ListenableFuture> result = + new ServiceFeasibilityCheckImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl, + networkModelListenerImpl, pceServiceWrapper) + .invoke(ServiceDataUtils.buildServiceFeasibilityCheckInput()); + result.addListener(() -> endSignal.countDown(), executorService); + endSignal.await(); + assertEquals( + ResponseCodes.RESPONSE_OK, + result.get().getResult().getConfigurationResponseCommon().getResponseCode()); } @Test - public void deleteServiceShouldBeFailedWithNonExistService() throws ExecutionException, InterruptedException { - ServiceDeleteInput input = ServiceDataUtils.buildServiceDeleteInput(); - ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); - ListenableFuture> result = servicehandlerImpl.serviceDelete(input); - result.addListener(new Runnable() { - @Override - public void run() { - callbackRan = true; - endSignal.countDown(); - } - }, executorService); + void serviceReconfigureShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException { + ListenableFuture> result = + new ServiceReconfigureImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl, + networkModelListenerImpl, rendererServiceWrapper) + .invoke(new ServiceReconfigureInputBuilder().setServiceName("").build()); + result.addListener(() -> endSignal.countDown(), executorService); + endSignal.await(); + } + + @Test + void serviceReconfigureShouldBeFailedWithNonExistService() throws ExecutionException, InterruptedException { + //action -> service reconfigure + ListenableFuture> result = + new ServiceReconfigureImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl, + networkModelListenerImpl, rendererServiceWrapper) + .invoke(serviceReconfigureInput); + result.addListener(() -> endSignal.countDown(), executorService); endSignal.await(); + } - RpcResult rpcResult = result.get(); - Assert.assertEquals(ResponseCodes.RESPONSE_FAILED, rpcResult.getResult().getConfigurationResponseCommon().getResponseCode()); + @Test + void serviceReconfigureShouldBeSuccessForExistingService() throws ExecutionException, InterruptedException { + // serviceReconfigure is calling service delete method in renderer + when(rendererServiceOperations.serviceDelete(any(), any())).thenReturn(Futures.immediateFuture(any())); + //create service to reconfigure + serviceDataStoreOperations.createService(serviceCreateInput); + //service reconfigure test action + //ServiceReconfigureInput is created with the same service information that is created before + ListenableFuture> result = + new ServiceReconfigureImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl, + networkModelListenerImpl, rendererServiceWrapper) + .invoke(serviceReconfigureInput); + result.addListener(() -> endSignal.countDown(), executorService); + endSignal.await(); } @Test - public void deleteServiceShouldBeSuccessForExistingService() throws ExecutionException, InterruptedException { - DataBroker dataBroker = getNewDataBroker(); - Mockito.when(rendererServiceOperations.serviceDelete(any())).thenReturn(Futures.immediateFuture(any())); - ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(dataBroker, pathComputationService, rendererServiceOperations, - notificationPublishService, pceListenerImpl, rendererListenerImpl, null); - ServiceDataStoreOperationsImpl serviceDataStoreOperations = new ServiceDataStoreOperationsImpl(dataBroker); - ServiceCreateInput createInput = ServiceDataUtils.buildServiceCreateInput(); - serviceDataStoreOperations.createService(createInput); - ServiceDeleteInput input = ServiceDataUtils.buildServiceDeleteInput(); - ListenableFuture> result = servicehandlerImpl.serviceDelete(input); - result.addListener(new Runnable() { - @Override - public void run() { - callbackRan = true; - endSignal.countDown(); - } - }, executorService); + void serviceReRestorationShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException { + ListenableFuture> result = + new ServiceRestorationImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl, + networkModelListenerImpl, rendererServiceWrapper) + .invoke(new ServiceRestorationInputBuilder() + .setServiceName("") + .build()); + result.addListener(() -> endSignal.countDown(), executorService); + endSignal.await(); + } + @Test + void serviceRestorationShouldBeFailedWithNonExistService() throws ExecutionException, InterruptedException { + //action -> service restore + ListenableFuture> result = + new ServiceRestorationImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl, + networkModelListenerImpl, rendererServiceWrapper) + .invoke(serviceRestorationInput); + result.addListener(() -> endSignal.countDown(), executorService); endSignal.await(); + } - RpcResult rpcResult = result.get(); - Assert.assertEquals(ResponseCodes.RESPONSE_OK, rpcResult.getResult().getConfigurationResponseCommon().getResponseCode()); + @Test + void serviceRestorationShouldBeSuccessForExistingService() throws ExecutionException, InterruptedException { + // serviceRestoration is calling service delete method in renderer + when(rendererServiceOperations.serviceDelete(any(), any())).thenReturn(Futures.immediateFuture(any())); + //create service to restore + serviceDataStoreOperations.createService(serviceCreateInput); + //service Restoration test action + //ServiceRestorationInput is created with the same service information that is created before + ListenableFuture> result = + new ServiceRestorationImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl, + networkModelListenerImpl, rendererServiceWrapper) + .invoke(serviceRestorationInput); + result.addListener(() -> endSignal.countDown(), executorService); + endSignal.await(); + } + + @Test + void serviceRerouteShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException { + ListenableFuture> result = + new ServiceRerouteImpl(serviceDataStoreOperations, pceServiceWrapper) + .invoke(new ServiceRerouteInputBuilder() + .setServiceName("") + .build()); + result.addListener(() -> endSignal.countDown(), executorService); + endSignal.await(); + assertEquals( + ResponseCodes.RESPONSE_FAILED, + result.get().getResult().getConfigurationResponseCommon().getResponseCode()); + } + + @Test + void serviceRerouteShouldBeFailedWithNonExistService() throws ExecutionException, InterruptedException { + //action -> service reconfigure + ListenableFuture> result = + new ServiceRerouteImpl(serviceDataStoreOperations, pceServiceWrapper) + .invoke(serviceRerouteInput); + result.addListener(() -> endSignal.countDown(), executorService); + endSignal.await(); + assertEquals( + ResponseCodes.RESPONSE_FAILED, + result.get().getResult().getConfigurationResponseCommon().getResponseCode()); + } + + @Test + void serviceRerouteShouldBeSuccessForExistingService() throws ExecutionException, InterruptedException { + when(pathComputationService.pathComputationRerouteRequest(any())) + .thenReturn(Futures.immediateFuture(new PathComputationRerouteRequestOutputBuilder() + .setConfigurationResponseCommon(new ConfigurationResponseCommonBuilder() + .setResponseCode(ResponseCodes.RESPONSE_OK) + .build()) + .build())); + Map atoz = Map.of( + new AToZKey("0"), + new AToZBuilder() + .setId("0") + .setResource(new ResourceBuilder() + .setResource(new TerminationPointBuilder() + .setTpNodeId("tpNodeIdC") + .setTpId("TpIdC1") + .build()) + .setState(State.InService) + .build()) + .build(), + new AToZKey("1"), + new AToZBuilder() + .setId("1") + .setResource(new ResourceBuilder() + .setResource(new TerminationPointBuilder() + .setTpNodeId("tpNodeIdD") + .setTpId("TpIdCD") + .build()) + .setState(State.InService) + .build()) + .build(), new AToZKey("2"), + new AToZBuilder() + .setId("2") + .setResource(new ResourceBuilder() + .setResource(new TerminationPointBuilder() + .setTpNodeId("tpNodeIdA") + .setTpId("TpIdA1") + .build()) + .setState(State.InService) + .build()) + .build() + + ); + serviceDataStoreOperations.createServicePath(new ServiceInput(serviceCreateInput), + new PathComputationRequestOutputBuilder() + .setResponseParameters(new ResponseParametersBuilder() + .setPathDescription(new PathDescriptionBuilder() + .setAToZDirection(new AToZDirectionBuilder() + .setAToZ(atoz) + .setRate(Uint32.valueOf(1)) + .build()) + .setZToADirection(new ZToADirectionBuilder() + .setRate(Uint32.valueOf(1)) + .build()) + .build()) + .build()) + .build()); + serviceDataStoreOperations.createService(serviceCreateInput); + ListenableFuture> result = + new ServiceRerouteImpl(serviceDataStoreOperations, pceServiceWrapper) + .invoke(serviceRerouteInput); + result.addListener(() -> endSignal.countDown(), executorService); + endSignal.await(); + assertEquals( + ResponseCodes.RESPONSE_OK, + result.get().getResult().getConfigurationResponseCommon().getResponseCode()); + } + + @Test + void tempServiceDeleteShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException { + ListenableFuture> result = + new TempServiceDeleteImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl, + rendererServiceWrapper) + .invoke(new TempServiceDeleteInputBuilder() + .setCommonId("") + .build()); + result.addListener(() -> endSignal.countDown(), executorService); + endSignal.await(); + RpcResult rpcResult = result.get(); + assertEquals( + ResponseCodes.RESPONSE_FAILED, + rpcResult.getResult().getConfigurationResponseCommon().getResponseCode()); + assertEquals( + LogMessages.SERVICE_NON_COMPLIANT, + rpcResult.getResult().getConfigurationResponseCommon().getResponseMessage()); + } + + @Test + void tempServiceDeleteShouldBeFailedWithNonExistService() throws ExecutionException, InterruptedException { + ListenableFuture> result = + new TempServiceDeleteImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl, + rendererServiceWrapper) + .invoke(ServiceDataUtils.buildTempServiceDeleteInput()); + result.addListener(() -> endSignal.countDown(), executorService); + endSignal.await(); + assertEquals( + ResponseCodes.RESPONSE_FAILED, + result.get().getResult().getConfigurationResponseCommon().getResponseCode()); + } + + @Test + void tempServiceDeleteShouldBeSuccessForExistingService() throws ExecutionException, InterruptedException { + when(rendererServiceOperations.serviceDelete(any(), any())).thenReturn(Futures.immediateFuture(any())); + //create temp service to delete in the temp delete action + TempServiceCreateInput createInput = ServiceDataUtils.buildTempServiceCreateInput(); + serviceDataStoreOperations.createTempService(createInput, pathDescription); + ListenableFuture> result = + new TempServiceDeleteImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl, + rendererServiceWrapper) + .invoke(ServiceDataUtils.buildTempServiceDeleteInput(createInput.getCommonId())); + result.addListener(() -> endSignal.countDown(), executorService); + endSignal.await(); + assertEquals( + ResponseCodes.RESPONSE_OK, + result.get().getResult().getConfigurationResponseCommon().getResponseCode()); + } + + @Test + void tempServiceCreateShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException { + ListenableFuture> result = + new TempServiceCreateImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl, + networkModelListenerImpl, pceServiceWrapper) + .invoke(new TempServiceCreateInputBuilder().build()); + result.addListener(() -> endSignal.countDown(), executorService); + endSignal.await(); + assertEquals( + ResponseCodes.RESPONSE_FAILED, + result.get().getResult().getConfigurationResponseCommon().getResponseCode()); + } + + @Test + void tempServiceCreateShouldBeFailedWithServiceAlreadyExist() throws ExecutionException, InterruptedException { + final ServiceDataStoreOperations serviceDSOperations = mock(ServiceDataStoreOperations.class); + when(serviceDSOperations.getTempService(any())) + .thenReturn(Optional.of( + new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.temp.service.list + .ServicesBuilder() + .setCommonId("bad_commonId") + .build())); + ListenableFuture> result = + new TempServiceCreateImpl(serviceDSOperations, pceListenerImpl, rendererListenerImpl, + networkModelListenerImpl, pceServiceWrapper) + .invoke(ServiceDataUtils.buildTempServiceCreateInput()); + result.addListener(() -> endSignal.countDown(), executorService); + endSignal.await(); + assertEquals( + ResponseCodes.RESPONSE_FAILED, + result.get().getResult().getConfigurationResponseCommon().getResponseCode()); + assertEquals( + "Service 'Temp (commonId)' already exists in datastore", + result.get().getResult().getConfigurationResponseCommon().getResponseMessage()); + } + + @Test + void tempServiceCreateShouldBeSuccessfulWhenPerformPCESuccessful() + throws ExecutionException, InterruptedException { + when(pathComputationService.pathComputationRequest(any())).thenReturn(Futures.immediateFuture(any())); + ListenableFuture> result = + new TempServiceCreateImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl, + networkModelListenerImpl, pceServiceWrapper) + .invoke(ServiceDataUtils.buildTempServiceCreateInput()); + result.addListener(() -> endSignal.countDown(), executorService); + endSignal.await(); + assertEquals( + ResponseCodes.RESPONSE_OK, + result.get().getResult().getConfigurationResponseCommon().getResponseCode()); + } + + @Test + public void addOpenroadmOperationalModesToCatalogShouldBeFailedWithEmptyInput() + throws ExecutionException, InterruptedException { + ListenableFuture> result = + new AddOpenroadmOperationalModesToCatalogImpl(catalogDataStoreOperations) + .invoke(new AddOpenroadmOperationalModesToCatalogInputBuilder().build()); + Assert.assertEquals( + ResponseCodes.RESPONSE_FAILED, + result.get().getResult().getConfigurationResponseCommon().getResponseCode()); + } + + @Test + public void addSpecificOperationalModesToCatalogShouldBeFailedWithEmptyInput() + throws ExecutionException, InterruptedException { + ListenableFuture> result = + new AddSpecificOperationalModesToCatalogImpl(catalogDataStoreOperations) + .invoke(new AddSpecificOperationalModesToCatalogInputBuilder().build()); + Assert.assertEquals( + ResponseCodes.RESPONSE_FAILED, + result.get().getResult().getConfigurationResponseCommon().getResponseCode()); + } + + @Test + public void addOpenroadmOperationalModesToCatalogShouldBeSuccessfulWhenAddORToCatalog() + throws ExecutionException, InterruptedException { + ListenableFuture> result = + new AddOpenroadmOperationalModesToCatalogImpl(catalogDataStoreOperations) + .invoke(CatalogDataUtils.buildAddORToCatalogInput()); + Assert.assertEquals( + ResponseCodes.RESPONSE_OK, + result.get().getResult().getConfigurationResponseCommon().getResponseCode()); + } + + @Test + public void addSpecificOperationalModesToCatalogShouldBeSuccessfulWhenAddSpecificToCatalog() + throws ExecutionException, InterruptedException { + ListenableFuture> result = + new AddSpecificOperationalModesToCatalogImpl(catalogDataStoreOperations) + .invoke(CatalogDataUtils.buildAddSpecificToCatalogInput()); + Assert.assertEquals( + ResponseCodes.RESPONSE_OK, + result.get().getResult().getConfigurationResponseCommon().getResponseCode()); } }