/* * Copyright 2015 herd contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.finra.herd.service; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import java.io.File; import java.util.Arrays; import java.util.List; import com.amazonaws.services.s3.model.S3ObjectSummary; import com.amazonaws.services.s3.model.Tag; import org.junit.Before; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.finra.herd.dao.S3Dao; import org.finra.herd.model.dto.S3FileCopyRequestParamsDto; import org.finra.herd.model.dto.S3FileTransferRequestParamsDto; import org.finra.herd.model.dto.S3FileTransferResultsDto; import org.finra.herd.service.impl.S3ServiceImpl; /** * This class tests functionality within the S3 service. */ public class S3ServiceTest extends AbstractServiceTest { @Mock private S3Dao s3Dao; @InjectMocks private S3ServiceImpl s3Service; @Before public void before() { MockitoAnnotations.initMocks(this); } @Test public void testCopyFile() throws InterruptedException { // Create an S3 file copy request parameters DTO. S3FileCopyRequestParamsDto s3FileCopyRequestParamsDto = new S3FileCopyRequestParamsDto(); // Create an S3 file transfer result DTO. S3FileTransferResultsDto s3FileTransferResultsDto = new S3FileTransferResultsDto(); // Mock the external calls. when(s3Dao.copyFile(s3FileCopyRequestParamsDto)).thenReturn(s3FileTransferResultsDto); // Call the method under test. S3FileTransferResultsDto result = s3Service.copyFile(s3FileCopyRequestParamsDto); // Verify the external calls. verify(s3Dao).copyFile(s3FileCopyRequestParamsDto); verifyNoMoreInteractions(s3Dao); // Validate the returned object. assertEquals(s3FileTransferResultsDto, result); } @Test public void testCreateDirectory() { // Create an S3 file transfer request parameters DTO. S3FileTransferRequestParamsDto s3FileTransferRequestParamsDto = new S3FileTransferRequestParamsDto(); // Call the method under test. s3Service.createDirectory(s3FileTransferRequestParamsDto); // Verify the external calls. verify(s3Dao).createDirectory(s3FileTransferRequestParamsDto); verifyNoMoreInteractions(s3Dao); } @Test public void testDeleteDirectory() { // Create an S3 file transfer request parameters DTO. S3FileTransferRequestParamsDto s3FileTransferRequestParamsDto = new S3FileTransferRequestParamsDto(); // Call the method under test. s3Service.deleteDirectory(s3FileTransferRequestParamsDto); // Verify the external calls. verify(s3Dao).deleteDirectory(s3FileTransferRequestParamsDto); verifyNoMoreInteractions(s3Dao); } @Test public void testDeleteDirectoryIgnoreException() { // Create an S3 file transfer request parameters DTO. S3FileTransferRequestParamsDto s3FileTransferRequestParamsDto = new S3FileTransferRequestParamsDto(); // Call the method under test. s3Service.deleteDirectoryIgnoreException(s3FileTransferRequestParamsDto); // Verify the external calls. verify(s3Dao).deleteDirectory(s3FileTransferRequestParamsDto); verifyNoMoreInteractions(s3Dao); } @Test public void testDeleteDirectoryIgnoreExceptionWhenRuntimeExceptionOccurs() { // Create an S3 file transfer request parameters DTO. S3FileTransferRequestParamsDto s3FileTransferRequestParamsDto = new S3FileTransferRequestParamsDto(); // Mock the external calls. doThrow(new RuntimeException()).when(s3Dao).deleteDirectory(s3FileTransferRequestParamsDto); // Call the method under test. s3Service.deleteDirectoryIgnoreException(s3FileTransferRequestParamsDto); // Verify the external calls. verify(s3Dao).deleteDirectory(s3FileTransferRequestParamsDto); verifyNoMoreInteractions(s3Dao); } @Test public void testDeleteFileList() { // Create an S3 file transfer request parameters DTO. S3FileTransferRequestParamsDto s3FileTransferRequestParamsDto = new S3FileTransferRequestParamsDto(); // Call the method under test. s3Service.deleteFileList(s3FileTransferRequestParamsDto); // Verify the external calls. verify(s3Dao).deleteFileList(s3FileTransferRequestParamsDto); verifyNoMoreInteractions(s3Dao); } @Test public void testDownloadDirectory() throws InterruptedException { // Create an S3 file transfer request parameters DTO. S3FileTransferRequestParamsDto s3FileTransferRequestParamsDto = new S3FileTransferRequestParamsDto(); // Create an S3 file transfer result DTO. S3FileTransferResultsDto s3FileTransferResultsDto = new S3FileTransferResultsDto(); // Mock the external calls. when(s3Dao.downloadDirectory(s3FileTransferRequestParamsDto)).thenReturn(s3FileTransferResultsDto); // Call the method under test. S3FileTransferResultsDto result = s3Service.downloadDirectory(s3FileTransferRequestParamsDto); // Verify the external calls. verify(s3Dao).downloadDirectory(s3FileTransferRequestParamsDto); verifyNoMoreInteractions(s3Dao); // Validate the returned object. assertEquals(s3FileTransferResultsDto, result); } @Test public void testDownloadFile() throws InterruptedException { // Create an S3 file transfer request parameters DTO. S3FileTransferRequestParamsDto s3FileTransferRequestParamsDto = new S3FileTransferRequestParamsDto(); // Create an S3 file transfer result DTO. S3FileTransferResultsDto s3FileTransferResultsDto = new S3FileTransferResultsDto(); // Mock the external calls. when(s3Dao.downloadFile(s3FileTransferRequestParamsDto)).thenReturn(s3FileTransferResultsDto); // Call the method under test. S3FileTransferResultsDto result = s3Service.downloadFile(s3FileTransferRequestParamsDto); // Verify the external calls. verify(s3Dao).downloadFile(s3FileTransferRequestParamsDto); verifyNoMoreInteractions(s3Dao); // Validate the returned object. assertEquals(s3FileTransferResultsDto, result); } @Test public void testListDirectory() { // Create an S3 file transfer request parameters DTO. S3FileTransferRequestParamsDto s3FileTransferRequestParamsDto = new S3FileTransferRequestParamsDto(); // Create a list of S3 object summaries. List<S3ObjectSummary> s3ObjectSummaries = Arrays.asList(new S3ObjectSummary()); // Mock the external calls. when(s3Dao.listDirectory(s3FileTransferRequestParamsDto, false)).thenReturn(s3ObjectSummaries); // Call the method under test. List<S3ObjectSummary> result = s3Service.listDirectory(s3FileTransferRequestParamsDto); // Verify the external calls. By default, we do not ignore 0 byte objects that represent S3 directories. verify(s3Dao).listDirectory(s3FileTransferRequestParamsDto, false); verifyNoMoreInteractions(s3Dao); // Validate the returned object. assertEquals(s3ObjectSummaries, result); } @Test public void testListDirectoryIgnoreZeroByteDirectoryMarkers() { // Create an S3 file transfer request parameters DTO. S3FileTransferRequestParamsDto s3FileTransferRequestParamsDto = new S3FileTransferRequestParamsDto(); // Create a list of S3 object summaries. List<S3ObjectSummary> s3ObjectSummaries = Arrays.asList(new S3ObjectSummary()); // Mock the external calls. when(s3Dao.listDirectory(s3FileTransferRequestParamsDto, true)).thenReturn(s3ObjectSummaries); // Call the method under test. List<S3ObjectSummary> result = s3Service.listDirectory(s3FileTransferRequestParamsDto, true); // Verify the external calls. verify(s3Dao).listDirectory(s3FileTransferRequestParamsDto, true); verifyNoMoreInteractions(s3Dao); // Validate the returned object. assertEquals(s3ObjectSummaries, result); } @Test public void testRestoreObjects() { // Create an S3 file transfer request parameters DTO. S3FileTransferRequestParamsDto s3FileTransferRequestParamsDto = new S3FileTransferRequestParamsDto(); // Call the method under test. s3Service.restoreObjects(s3FileTransferRequestParamsDto, INTEGER_VALUE); // Verify the external calls. verify(s3Dao).restoreObjects(s3FileTransferRequestParamsDto, INTEGER_VALUE); verifyNoMoreInteractions(s3Dao); } @Test public void testTagObjects() { // Create an S3 file transfer request parameters DTO to access S3 objects. S3FileTransferRequestParamsDto s3FileTransferRequestParamsDto = new S3FileTransferRequestParamsDto(); s3FileTransferRequestParamsDto.setFiles(Arrays.asList(new File(TEST_S3_KEY_PREFIX + "/" + LOCAL_FILE))); // Create an S3 file transfer request parameters DTO to tag S3 objects. S3FileTransferRequestParamsDto s3ObjectTaggerParamsDto = new S3FileTransferRequestParamsDto(); s3ObjectTaggerParamsDto.setAwsAccessKeyId(AWS_ASSUMED_ROLE_ACCESS_KEY); s3ObjectTaggerParamsDto.setAwsSecretKey(AWS_ASSUMED_ROLE_SECRET_KEY); s3ObjectTaggerParamsDto.setSessionToken(AWS_ASSUMED_ROLE_SESSION_TOKEN); // Create an S3 object tag. Tag tag = new Tag(S3_OBJECT_TAG_KEY, S3_OBJECT_TAG_VALUE); // Call the method under test. s3Service.tagObjects(s3FileTransferRequestParamsDto, s3ObjectTaggerParamsDto, tag); // Verify the external calls. verify(s3Dao).tagObjects(s3FileTransferRequestParamsDto, s3ObjectTaggerParamsDto, tag); verifyNoMoreInteractions(s3Dao); } @Test public void testUploadDirectory() throws InterruptedException { // Create an S3 file transfer request parameters DTO. S3FileTransferRequestParamsDto s3FileTransferRequestParamsDto = new S3FileTransferRequestParamsDto(); // Create an S3 file transfer result DTO. S3FileTransferResultsDto s3FileTransferResultsDto = new S3FileTransferResultsDto(); // Mock the external calls. when(s3Dao.uploadDirectory(s3FileTransferRequestParamsDto)).thenReturn(s3FileTransferResultsDto); // Call the method under test. S3FileTransferResultsDto result = s3Service.uploadDirectory(s3FileTransferRequestParamsDto); // Verify the external calls. verify(s3Dao).uploadDirectory(s3FileTransferRequestParamsDto); verifyNoMoreInteractions(s3Dao); // Validate the returned object. assertEquals(s3FileTransferResultsDto, result); } @Test public void testUploadFile() throws InterruptedException { // Create an S3 file transfer request parameters DTO. S3FileTransferRequestParamsDto s3FileTransferRequestParamsDto = new S3FileTransferRequestParamsDto(); // Create an S3 file transfer result DTO. S3FileTransferResultsDto s3FileTransferResultsDto = new S3FileTransferResultsDto(); // Mock the external calls. when(s3Dao.uploadFile(s3FileTransferRequestParamsDto)).thenReturn(s3FileTransferResultsDto); // Call the method under test. S3FileTransferResultsDto result = s3Service.uploadFile(s3FileTransferRequestParamsDto); // Verify the external calls. verify(s3Dao).uploadFile(s3FileTransferRequestParamsDto); verifyNoMoreInteractions(s3Dao); // Validate the returned object. assertEquals(s3FileTransferResultsDto, result); } @Test public void testUploadFileList() throws InterruptedException { // Create an S3 file transfer request parameters DTO. S3FileTransferRequestParamsDto s3FileTransferRequestParamsDto = new S3FileTransferRequestParamsDto(); // Create an S3 file transfer result DTO. S3FileTransferResultsDto s3FileTransferResultsDto = new S3FileTransferResultsDto(); // Mock the external calls. when(s3Dao.uploadFileList(s3FileTransferRequestParamsDto)).thenReturn(s3FileTransferResultsDto); // Call the method under test. S3FileTransferResultsDto result = s3Service.uploadFileList(s3FileTransferRequestParamsDto); // Verify the external calls. verify(s3Dao).uploadFileList(s3FileTransferRequestParamsDto); verifyNoMoreInteractions(s3Dao); // Validate the returned object. assertEquals(s3FileTransferResultsDto, result); } @Test public void testValidateGlacierS3FilesRestored() throws RuntimeException { // Create an S3 file transfer request parameters DTO. S3FileTransferRequestParamsDto s3FileTransferRequestParamsDto = new S3FileTransferRequestParamsDto(); // Call the method under test. s3Service.validateGlacierS3FilesRestored(s3FileTransferRequestParamsDto); // Verify the external calls. verify(s3Dao).validateGlacierS3FilesRestored(s3FileTransferRequestParamsDto); verifyNoMoreInteractions(s3Dao); } }