From 91787e92dd1b7c288494d75633cf58276d3e31af Mon Sep 17 00:00:00 2001 From: "Sinha, Abhinav" Date: Fri, 21 Oct 2022 18:19:34 -0400 Subject: [PATCH 1/3] unit tests init #52 --- .../mft/api/handler/MFTApiHandlerTest.java | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 api/service/src/test/java/org/apache/airavata/mft/api/handler/MFTApiHandlerTest.java diff --git a/api/service/src/test/java/org/apache/airavata/mft/api/handler/MFTApiHandlerTest.java b/api/service/src/test/java/org/apache/airavata/mft/api/handler/MFTApiHandlerTest.java new file mode 100644 index 00000000..a34cd2bf --- /dev/null +++ b/api/service/src/test/java/org/apache/airavata/mft/api/handler/MFTApiHandlerTest.java @@ -0,0 +1,123 @@ +package org.apache.airavata.mft.api.handler; + +import io.grpc.stub.StreamObserver; +import org.apache.airavata.mft.admin.MFTConsulClient; +import org.apache.airavata.mft.admin.MFTConsulClientException; +import org.apache.airavata.mft.admin.models.TransferState; +import org.apache.airavata.mft.api.service.TransferApiRequest; +import org.apache.airavata.mft.api.service.TransferApiResponse; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.beans.factory.annotation.Autowired; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +public class MFTApiHandlerTest { + + @Autowired + @InjectMocks + private MFTApiHandler mftApiHandler; + + @Mock + private MFTConsulClient mftConsulClient; + + @BeforeEach + public void setUp() throws Exception { + } + + @AfterEach + public void tearDown() throws Exception { + mftApiHandler = null; + mftConsulClient = null; + } + + @Test + public void testValidSubmitTransfer() throws MFTConsulClientException { + String testSourcePath = "test-file.txt"; + String testSourceStorageId = "ca0e786c-09de-40ff-a6ef-5d52a09e0027"; + String testSourceToken = "4c8337fc-f3e6-481e-b2be-ecabbd075924"; + String testDestinationPath = "test/test-file2.txt"; + String testDestinationStorageId = "e815392c-79e0-4e63-b730-7f10929b62dd"; + String testDestinationToken = "c211d1f7-e231-4147-a8dc-8af14194ee54"; + + TransferApiRequest transferApiRequest = TransferApiRequest.newBuilder() + .setSourceToken(testSourceToken) + .setDestinationToken(testDestinationToken) + .setDestinationStorageId(testDestinationStorageId) + .setDestinationPath(testDestinationPath) + .setSourceStorageId(testSourceStorageId) + .setSourcePath(testSourcePath).build(); + + String mock_transferId="mock-transfer-id-test-1234"; + when(mftConsulClient.submitTransfer(transferApiRequest)).thenReturn(mock_transferId); + doNothing().when(mftConsulClient).saveTransferState(any(String.class), any(TransferState.class)); + StreamObserver observer = mock(StreamObserver.class); + mftApiHandler.submitTransfer(transferApiRequest, observer); + + verify(observer).onNext(any(TransferApiResponse.class)); + verify(observer, times(1)).onCompleted(); + } + + @Test + public void testInvalidSubmitTransfer() throws MFTConsulClientException { + String testSourcePath = "test-file.txt"; + String testSourceStorageId = "ca0e786c-09de-40ff-a6ef-5d52a09e0027"; + String testSourceToken = "4c8337fc-f3e6-481e-b2be-ecabbd075924"; + String testDestinationPath = "test/test-file2.txt"; + String testDestinationStorageId = "e815392c-79e0-4e63-b730-7f10929b62dd"; + String testDestinationToken = "c211d1f7-e231-4147-a8dc-8af14194ee54"; + + TransferApiRequest transferApiRequest = TransferApiRequest.newBuilder() + .setSourceToken(testSourceToken) + .setDestinationToken(testDestinationToken) + .setDestinationStorageId(testDestinationStorageId) + .setDestinationPath(testDestinationPath) + .setSourceStorageId(testSourceStorageId) + .setSourcePath(testSourcePath).build(); + + String mock_transferId="mock-transfer-id-test-1234"; + when(mftConsulClient.submitTransfer(transferApiRequest)).thenReturn(mock_transferId); + doNothing().when(mftConsulClient).saveTransferState(any(String.class), any(TransferState.class)); + StreamObserver observer = mock(StreamObserver.class); + mftApiHandler.submitTransfer(transferApiRequest, observer); + + verify(observer).onNext(any(TransferApiResponse.class)); + verify(observer, times(1)).onCompleted(); + } + + @Disabled + public void testSubmitBatchTransfer() { + } + + @Disabled + public void testSubmitHttpUpload() { + } + + @Disabled + public void testSubmitHttpDownload() { + } + + @Disabled + public void testGetTransferStates() { + } + + @Disabled + public void testGetTransferState() { + } + + @Disabled + public void testGetFileResourceMetadata() { + } + + @Disabled + public void testGetDirectoryResourceMetadata() { + } +} \ No newline at end of file From 3b2e2fc372d23d1196edb78594e68682e8534cb1 Mon Sep 17 00:00:00 2001 From: "Sinha, Abhinav" Date: Fri, 28 Oct 2022 09:19:24 -0400 Subject: [PATCH 2/3] mft-agent tests #52 --- .../airavata/mft/agent/MFTAgentTest.java | 134 ++++++++++++++++++ api/service/pom.xml | 6 + .../mft/api/handler/MFTApiHandlerTest.java | 65 ++++----- pom.xml | 18 +++ 4 files changed, 188 insertions(+), 35 deletions(-) create mode 100644 agent/src/test/java/org/apache/airavata/mft/agent/MFTAgentTest.java diff --git a/agent/src/test/java/org/apache/airavata/mft/agent/MFTAgentTest.java b/agent/src/test/java/org/apache/airavata/mft/agent/MFTAgentTest.java new file mode 100644 index 00000000..29f6654e --- /dev/null +++ b/agent/src/test/java/org/apache/airavata/mft/agent/MFTAgentTest.java @@ -0,0 +1,134 @@ +package org.apache.airavata.mft.agent; + +import com.orbitz.consul.KeyValueClient; +import com.orbitz.consul.SessionClient; +import com.orbitz.consul.cache.ConsulCache; +import com.orbitz.consul.cache.KVCache; +import com.orbitz.consul.model.kv.Value; +import com.orbitz.consul.model.session.ImmutableSession; +import com.orbitz.consul.model.session.Session; +import com.orbitz.consul.model.session.SessionCreatedResponse; +import io.grpc.stub.StreamObserver; +import org.apache.airavata.mft.admin.MFTConsulClient; +import org.apache.airavata.mft.admin.models.TransferState; +import org.apache.airavata.mft.api.service.TransferApiResponse; +import org.apache.airavata.mft.resource.client.StorageServiceClient; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.*; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.stubbing.Answer; +import org.springframework.beans.factory.annotation.Autowired; + +import java.lang.reflect.Method; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class MFTAgentTest { + + @Autowired + @InjectMocks + private MFTAgent mftAgent; + + @Mock + private MFTConsulClient mftConsulClient; + + @Mock + private ExecutorService transferRequestExecutor; + + @Mock + private ConsulCache.Listener transferCacheListener; + + @Mock + private ConsulCache.Listener rpcCacheListener; + + @Mock + private KVCache rpcMessageCache; + + @Mock + private KVCache transferMessageCache; + + // Mocking a static method using Mockito.mockStatic + @Test + void testInit() { + try (MockedStatic kvCache = Mockito.mockStatic(KVCache.class); + MockedStatic transferRequestExecutor = Mockito.mockStatic(Executors.class)) { + // given + kvCache.when(() -> KVCache.newCache( + any(KeyValueClient.class), + any(String.class))).thenReturn(null); + transferRequestExecutor.when(() -> Executors.newFixedThreadPool(any(Integer.class))) + .thenReturn(null); + + // when + mftAgent.init(); + + //then + verify(mftConsulClient, times(2)).getKvClient(); + } + } + + @Test + void testDisconnectAgent() { + mftAgent.disconnectAgent(); + verify(rpcMessageCache, times(1)).removeListener(any()); + } + + // Mocking a method in the same class using Mockito.spy + @Test + void testStop(){ + // given + MFTAgent mftAgent1 = spy(mftAgent); + doNothing().when(mftAgent1).disconnectAgent(); + doNothing().when(transferRequestExecutor).shutdown(); + + // when + mftAgent1.stop(); + + // then + verify(mftAgent1, times(1)).disconnectAgent(); + verify(transferRequestExecutor, times(1)).shutdown(); + } + + // Mock nested methods + @Test + void testEstablishConnectionWithConsul() throws Exception{ +// ImmutableSession sessionObj = ImmutableSession.builder().name("testagent").behavior("delete").ttl("10s").build(); +// try (MockedStatic session = Mockito.mockStatic(ImmutableSession.class)) { +// // given +// SessionCreatedResponse sessResp = new SessionCreatedResponse() { +// @Override +// public String getId() { +// return "test-id"; +// } +// }; +// MFTAgent mftAgent1 = spy(mftAgent); +// MFTConsulClient mftConsulClient1 = mock(MFTConsulClient.class, RETURNS_DEEP_STUBS); +// session.when(() -> ImmutableSession.builder().name(anyString()).behavior(anyString()).ttl(anyString()).build()).thenReturn(sessionObj); +// when(mftConsulClient1.getSessionClient().createSession(any(ImmutableSession.class))).thenReturn(sessResp); +// when(mftConsulClient1.getKvClient().acquireLock(anyString(), anyString())).thenReturn(true); +// doNothing().when(mftAgent1).init(); +// +// // when +// mftAgent1.start(); +// +// // then +// verify(mftConsulClient).submitTransferStateToProcess(anyString(), anyString(), any(TransferState.class)); +// } + } + + @Test + void testRunMFTAgent() throws Exception{ + } +} \ No newline at end of file diff --git a/api/service/pom.xml b/api/service/pom.xml index fdf6f6fb..fc21e4c5 100644 --- a/api/service/pom.xml +++ b/api/service/pom.xml @@ -86,6 +86,12 @@ 0.01-SNAPSHOT runtime + + org.apache.airavata + mft-api-client + 0.01-SNAPSHOT + test + diff --git a/api/service/src/test/java/org/apache/airavata/mft/api/handler/MFTApiHandlerTest.java b/api/service/src/test/java/org/apache/airavata/mft/api/handler/MFTApiHandlerTest.java index a34cd2bf..0e972714 100644 --- a/api/service/src/test/java/org/apache/airavata/mft/api/handler/MFTApiHandlerTest.java +++ b/api/service/src/test/java/org/apache/airavata/mft/api/handler/MFTApiHandlerTest.java @@ -41,56 +41,51 @@ public void tearDown() throws Exception { @Test public void testValidSubmitTransfer() throws MFTConsulClientException { - String testSourcePath = "test-file.txt"; - String testSourceStorageId = "ca0e786c-09de-40ff-a6ef-5d52a09e0027"; - String testSourceToken = "4c8337fc-f3e6-481e-b2be-ecabbd075924"; - String testDestinationPath = "test/test-file2.txt"; - String testDestinationStorageId = "e815392c-79e0-4e63-b730-7f10929b62dd"; - String testDestinationToken = "c211d1f7-e231-4147-a8dc-8af14194ee54"; - + // given TransferApiRequest transferApiRequest = TransferApiRequest.newBuilder() - .setSourceToken(testSourceToken) - .setDestinationToken(testDestinationToken) - .setDestinationStorageId(testDestinationStorageId) - .setDestinationPath(testDestinationPath) - .setSourceStorageId(testSourceStorageId) - .setSourcePath(testSourcePath).build(); - - String mock_transferId="mock-transfer-id-test-1234"; - when(mftConsulClient.submitTransfer(transferApiRequest)).thenReturn(mock_transferId); + .setSourceToken("mock-source-token-1234") + .setDestinationToken("mock-destination-token-1234") + .setDestinationStorageId("mock-destination-storage-id-1234") + .setDestinationPath("test/test-file2.txt") + .setSourceStorageId("mock-source-storage-id-1234") + .setSourcePath("test-file.txt").build(); + // mftConsulClient mock behavior + when(mftConsulClient.submitTransfer(transferApiRequest)).thenReturn("mock-transfer-id-test-1234"); doNothing().when(mftConsulClient).saveTransferState(any(String.class), any(TransferState.class)); + // mock stream observer StreamObserver observer = mock(StreamObserver.class); + + // when mftApiHandler.submitTransfer(transferApiRequest, observer); + // then verify(observer).onNext(any(TransferApiResponse.class)); verify(observer, times(1)).onCompleted(); + verify(observer, times(0)).onError(any(MFTConsulClientException.class)); } @Test public void testInvalidSubmitTransfer() throws MFTConsulClientException { - String testSourcePath = "test-file.txt"; - String testSourceStorageId = "ca0e786c-09de-40ff-a6ef-5d52a09e0027"; - String testSourceToken = "4c8337fc-f3e6-481e-b2be-ecabbd075924"; - String testDestinationPath = "test/test-file2.txt"; - String testDestinationStorageId = "e815392c-79e0-4e63-b730-7f10929b62dd"; - String testDestinationToken = "c211d1f7-e231-4147-a8dc-8af14194ee54"; - + // given TransferApiRequest transferApiRequest = TransferApiRequest.newBuilder() - .setSourceToken(testSourceToken) - .setDestinationToken(testDestinationToken) - .setDestinationStorageId(testDestinationStorageId) - .setDestinationPath(testDestinationPath) - .setSourceStorageId(testSourceStorageId) - .setSourcePath(testSourcePath).build(); - - String mock_transferId="mock-transfer-id-test-1234"; - when(mftConsulClient.submitTransfer(transferApiRequest)).thenReturn(mock_transferId); - doNothing().when(mftConsulClient).saveTransferState(any(String.class), any(TransferState.class)); + .setSourceToken("mock-source-token-1234") + .setDestinationToken("mock-destination-token-1234") + .setDestinationStorageId("mock-destination-storage-id-1234") + .setDestinationPath("test/test-file2.txt") + .setSourceStorageId("mock-source-storage-id-1234") + .setSourcePath("test-file.txt").build(); + // mftConsulClient mock behavior + when(mftConsulClient.submitTransfer(transferApiRequest)).thenThrow(new MFTConsulClientException("Test Exception")); + // mock stream observer StreamObserver observer = mock(StreamObserver.class); + + // when mftApiHandler.submitTransfer(transferApiRequest, observer); - verify(observer).onNext(any(TransferApiResponse.class)); - verify(observer, times(1)).onCompleted(); + // then + verify(observer, times(0)).onNext(any(TransferApiResponse.class)); + verify(observer, times(0)).onCompleted(); + verify(observer, times(0)).onError(any(MFTConsulClientException.class)); } @Disabled diff --git a/pom.xml b/pom.xml index 30ae04f2..4aff6eb7 100755 --- a/pom.xml +++ b/pom.xml @@ -130,6 +130,24 @@ log4j-1.2-api ${log4j2.version} + + org.junit.jupiter + junit-jupiter + 5.9.0 + test + + + org.mockito + mockito-inline + 4.8.0 + test + + + org.mockito + mockito-junit-jupiter + 4.0.0 + test + From a3cff0d835f41a949d4f28c9ff0c2544c97630bd Mon Sep 17 00:00:00 2001 From: "Sinha, Abhinav" Date: Fri, 4 Nov 2022 10:50:08 -0400 Subject: [PATCH 3/3] add test cases for S3 #52 --- agent/pom.xml | 6 + .../airavata/mft/agent/MFTAgentTest.java | 18 --- pom.xml | 28 +++- .../backend/sql/SQLResourceBackendTest.java | 109 +++++++++++++ .../server/handler/S3ServiceHandlerTest.java | 145 ++++++++++++++++++ 5 files changed, 280 insertions(+), 26 deletions(-) create mode 100644 services/resource-service/server/src/test/java/org/apache/airavata/mft/resource/server/backend/sql/SQLResourceBackendTest.java create mode 100644 services/resource-service/server/src/test/java/org/apache/airavata/mft/resource/server/handler/S3ServiceHandlerTest.java diff --git a/agent/pom.xml b/agent/pom.xml index 310c41a7..948df3f6 100644 --- a/agent/pom.xml +++ b/agent/pom.xml @@ -129,6 +129,12 @@ javax.activation 1.2.0 + + org.mockito + mockito-inline + 4.8.0 + test + diff --git a/agent/src/test/java/org/apache/airavata/mft/agent/MFTAgentTest.java b/agent/src/test/java/org/apache/airavata/mft/agent/MFTAgentTest.java index 29f6654e..da809a99 100644 --- a/agent/src/test/java/org/apache/airavata/mft/agent/MFTAgentTest.java +++ b/agent/src/test/java/org/apache/airavata/mft/agent/MFTAgentTest.java @@ -1,36 +1,18 @@ package org.apache.airavata.mft.agent; import com.orbitz.consul.KeyValueClient; -import com.orbitz.consul.SessionClient; import com.orbitz.consul.cache.ConsulCache; import com.orbitz.consul.cache.KVCache; import com.orbitz.consul.model.kv.Value; -import com.orbitz.consul.model.session.ImmutableSession; -import com.orbitz.consul.model.session.Session; -import com.orbitz.consul.model.session.SessionCreatedResponse; -import io.grpc.stub.StreamObserver; import org.apache.airavata.mft.admin.MFTConsulClient; -import org.apache.airavata.mft.admin.models.TransferState; -import org.apache.airavata.mft.api.service.TransferApiResponse; -import org.apache.airavata.mft.resource.client.StorageServiceClient; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.*; import org.mockito.junit.jupiter.MockitoExtension; -import org.mockito.stubbing.Answer; import org.springframework.beans.factory.annotation.Autowired; -import java.lang.reflect.Method; -import java.util.List; -import java.util.Optional; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; - -import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; diff --git a/pom.xml b/pom.xml index 4aff6eb7..67313ba9 100755 --- a/pom.xml +++ b/pom.xml @@ -130,22 +130,34 @@ log4j-1.2-api ${log4j2.version} + + + + + + + + + + + + - org.junit.jupiter - junit-jupiter - 5.9.0 + org.mockito + mockito-junit-jupiter + 4.8.0 test - org.mockito - mockito-inline - 4.8.0 + org.junit.jupiter + junit-jupiter-engine + 5.7.0 test org.mockito - mockito-junit-jupiter - 4.0.0 + mockito-core + 4.8.0 test diff --git a/services/resource-service/server/src/test/java/org/apache/airavata/mft/resource/server/backend/sql/SQLResourceBackendTest.java b/services/resource-service/server/src/test/java/org/apache/airavata/mft/resource/server/backend/sql/SQLResourceBackendTest.java new file mode 100644 index 00000000..67364475 --- /dev/null +++ b/services/resource-service/server/src/test/java/org/apache/airavata/mft/resource/server/backend/sql/SQLResourceBackendTest.java @@ -0,0 +1,109 @@ +package org.apache.airavata.mft.resource.server.backend.sql; + +import org.apache.airavata.mft.resource.server.backend.sql.entity.ResolveStorageEntity; +import org.apache.airavata.mft.resource.server.backend.sql.entity.S3StorageEntity; +import org.apache.airavata.mft.resource.server.backend.sql.repository.ResolveStorageRepository; +import org.apache.airavata.mft.resource.server.backend.sql.repository.S3StorageRepository; +import org.apache.airavata.mft.resource.stubs.s3.storage.S3Storage; +import org.apache.airavata.mft.resource.stubs.s3.storage.S3StorageCreateRequest; +import org.apache.airavata.mft.resource.stubs.s3.storage.S3StorageListRequest; +import org.apache.airavata.mft.resource.stubs.s3.storage.S3StorageListResponse; +import org.dozer.DozerBeanMapper; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.PageRequest; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class SQLResourceBackendTest { + + @InjectMocks + private SQLResourceBackend sqlResourceBackend; + + @Mock + private S3StorageRepository s3StorageRepository; + + @Mock + private ResolveStorageRepository resolveStorageRepository; + + @Test + void successfullyListS3Storage() throws Exception{ + // given + S3StorageListRequest testRequest = S3StorageListRequest.newBuilder().setOffset(0).setLimit(10).build(); + // mock s3StorageRepository + List testResponse = new ArrayList<>(); + S3StorageEntity s3StorageResp = new S3StorageEntity(); + s3StorageResp.setStorageId("test-storage-id-1234"); + s3StorageResp.setName("test-storage-1"); + s3StorageResp.setBucketName("test-bucket-1"); + s3StorageResp.setRegion("us-east-2"); + s3StorageResp.setEndpoint("https://s3.us-east-2.amazonaws.com"); + s3StorageResp.setUseTLS(false); + testResponse.add(s3StorageResp); + when(s3StorageRepository.findAll( + PageRequest.of(testRequest.getOffset(), testRequest.getLimit()))) + .thenReturn(testResponse); + + // when + S3StorageListResponse response = sqlResourceBackend.listS3Storage(testRequest); + + // then + verify(s3StorageRepository, times(1)).findAll( + PageRequest.of(testRequest.getOffset(), testRequest.getLimit())); + assertEquals(response.getStoragesList().size(), testResponse.size()); + assertFalse(response.getStoragesList().isEmpty()); + assertEquals(response.getStoragesList().get(0).getStorageId(), testResponse.get(0).getStorageId()); + } + + @Test + void successfullyGetS3Storage() { + + } + + @Test + void successfullyCreateS3Storage() throws Exception{ + // given + S3StorageCreateRequest testRequest = S3StorageCreateRequest.newBuilder() + .setBucketName("test-bucket-1") + .setRegion("us-east-2") + //.setStorageId("test-storage-id-1234") + .setEndpoint("https://s3.us-east-2.amazonaws.com") + .setUseTLS(false) + .setName("test-storage-1").build(); + // mock s3StorageRepository save + S3StorageEntity testResponse = new S3StorageEntity(); + testResponse.setStorageId("test-storage-id-1234"); + testResponse.setName("test-storage-1"); + testResponse.setBucketName("test-bucket-1"); + testResponse.setRegion("us-east-2"); + testResponse.setEndpoint("https://s3.us-east-2.amazonaws.com"); + testResponse.setUseTLS(false); + DozerBeanMapper mapper = new DozerBeanMapper(); + when(s3StorageRepository.save(any(S3StorageEntity.class))).thenReturn(testResponse); + + // when + sqlResourceBackend.createS3Storage(testRequest); + + // then + verify(s3StorageRepository, times(1)).save(any(S3StorageEntity.class)); + verify(resolveStorageRepository, times(1)).save(any(ResolveStorageEntity.class)); + + } + + @Test + void updateS3Storage() { + } + + @Test + void deleteS3Storage() { + } +} \ No newline at end of file diff --git a/services/resource-service/server/src/test/java/org/apache/airavata/mft/resource/server/handler/S3ServiceHandlerTest.java b/services/resource-service/server/src/test/java/org/apache/airavata/mft/resource/server/handler/S3ServiceHandlerTest.java new file mode 100644 index 00000000..dac88956 --- /dev/null +++ b/services/resource-service/server/src/test/java/org/apache/airavata/mft/resource/server/handler/S3ServiceHandlerTest.java @@ -0,0 +1,145 @@ +package org.apache.airavata.mft.resource.server.handler; + + +import io.grpc.stub.StreamObserver; +import org.apache.airavata.mft.resource.server.backend.ResourceBackend; +import org.apache.airavata.mft.resource.stubs.s3.storage.S3Storage; +import org.apache.airavata.mft.resource.stubs.s3.storage.S3StorageCreateRequest; +import org.apache.airavata.mft.resource.stubs.s3.storage.S3StorageListRequest; +import org.apache.airavata.mft.resource.stubs.s3.storage.S3StorageListResponse; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.beans.factory.annotation.Autowired; + +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class S3ServiceHandlerTest { + + @Autowired + @InjectMocks + private S3ServiceHandler s3ServiceHandler; + + @Mock + private ResourceBackend backend; + + @BeforeEach + void setUp() { + } + + @AfterEach + void tearDown() { + } + + @Test + void listS3StorageSuccess() throws Exception { + // given + S3StorageListRequest testRequest = S3StorageListRequest.newBuilder().setOffset(0).setLimit(10).build(); + // mock listS3Storage backend service response + S3StorageListResponse testResponse = S3StorageListResponse.newBuilder().addStorages(0, + S3Storage.newBuilder() + .setStorageId("test-storage-id-1234") + .setName("test-storage-1") + .setBucketName("test-bucket-1") + .setRegion("us-east-2") + .setEndpoint("https://s3.us-east-2.amazonaws.com") + .setUseTLS(false)).build(); + // mock stream observer + StreamObserver mockObserver = mock(StreamObserver.class); + when(backend.listS3Storage(testRequest)).thenReturn(testResponse); + + // when + s3ServiceHandler.listS3Storage(testRequest, mockObserver); + + //then + verify(mockObserver, times(1)).onNext(testResponse); + verify(mockObserver, times(1)).onCompleted(); + } + + @Test + void listS3StorageFailure() throws Exception { + // given + S3StorageListRequest testRequest = S3StorageListRequest.newBuilder().setOffset(0).setLimit(10).build(); + // mock stream observer + StreamObserver mockObserver = mock(StreamObserver.class); + // mock listS3Storage backend service response + when(backend.listS3Storage(testRequest)).thenThrow(new Exception("Test Exception!")); + + // when + s3ServiceHandler.listS3Storage(testRequest, mockObserver); + + //then + verify(mockObserver, times(1)).onError(any(Throwable.class)); + } + + @Test + void getS3Storage() { + } + + @Test + void successfullyCreateS3Storage() throws Exception{ + // given + S3StorageCreateRequest testRequest = S3StorageCreateRequest.newBuilder() + .setBucketName("test-bucket-1") + .setRegion("us-east-2") + .setStorageId("test-storage-id-1234") + .setEndpoint("https://s3.us-east-2.amazonaws.com") + .setUseTLS(false) + .setName("test-storage-1").build(); + // mock stream observer + StreamObserver mockObserver = mock(StreamObserver.class); + // mock createS3Storage backend service response + S3Storage testResponse = S3Storage.newBuilder() + .setStorageId("test-storage-id-1234") + .setBucketName("test-bucket-1") + .setRegion("us-east-2") + .setEndpoint("https://s3.us-east-2.amazonaws.com") + .setUseTLS(false) + .setName("test-storage-1").build(); + when(backend.createS3Storage(testRequest)).thenReturn(testResponse); + + + // when + s3ServiceHandler.createS3Storage(testRequest, mockObserver); + + // then + verify(mockObserver, times(1)).onNext(testResponse); + verify(mockObserver, times(1)).onCompleted(); + } + + @Test + void createS3StorageFailed() throws Exception{ + // given + S3StorageCreateRequest testRequest = S3StorageCreateRequest.newBuilder() + .setBucketName("test-bucket-1") + .setRegion("us-east-2") + .setStorageId("test-storage-id-1234") + .setEndpoint("https://s3.us-east-2.amazonaws.com") + .setUseTLS(false) + .setName("test-storage-1").build(); + // mock stream observer + StreamObserver mockObserver = mock(StreamObserver.class); + // mock createS3Storage backend service response + when(backend.createS3Storage(testRequest)).thenThrow(new Exception("Test Error!")); + + // when + s3ServiceHandler.createS3Storage(testRequest, mockObserver); + + // then + verify(mockObserver, times(1)).onError(any(Throwable.class)); + } + + + @Test + void updateS3Storage() { + } + + @Test + void deleteS3Storage() { + } +} \ No newline at end of file