package com.aol.micro.server.s3; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; 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 java.io.File; import java.io.IOException; import java.nio.file.Files; import java.util.ArrayList; import java.util.List; import java.util.stream.Stream; import org.junit.Assert; import org.junit.Test; import com.amazonaws.AmazonClientException; import com.amazonaws.AmazonServiceException; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.DeleteObjectsRequest.KeyVersion; import com.amazonaws.services.s3.model.ListObjectsRequest; import com.amazonaws.services.s3.model.ObjectListing; import com.amazonaws.services.s3.model.S3Object; import com.amazonaws.services.s3.model.S3ObjectSummary; import com.amazonaws.services.s3.transfer.Download; import com.amazonaws.services.s3.transfer.TransferManager; import com.aol.micro.server.s3.data.S3Utils; public class S3UtilsTest { private boolean answer = true; @Test public void getAllSummaries() { answer = true; AmazonS3Client client = mock(AmazonS3Client.class); ObjectListing objectListing = mock(ObjectListing.class); when(client.listObjects(any(ListObjectsRequest.class))).thenReturn(objectListing); when(objectListing.isTruncated()).thenAnswer(__ -> { try { return answer; } finally { answer = false; } }); S3Utils utils = new S3Utils( client, null, null, false, null); utils.getAllSummaries(new ListObjectsRequest()); verify(objectListing, times(2)).getObjectSummaries(); } @Test public void getSummariesStream() { answer = true; AmazonS3Client client = mock(AmazonS3Client.class); ObjectListing objectListing = mock(ObjectListing.class); when(objectListing.getObjectSummaries()).thenReturn(createSummaries()); when(client.listObjects(any(ListObjectsRequest.class))).thenReturn(objectListing); when(objectListing.isTruncated()).thenAnswer(__ -> { try { return answer; } finally { answer = false; } }); // when(objectListing.getObjectSummaries()).thenReturn(summaries); S3Utils utils = new S3Utils( client, null, null, false, null); verify(objectListing, times(0)).getObjectSummaries(); Stream<String> stream = utils.getSummariesStream(new ListObjectsRequest(), s -> { return s.getKey(); }); assertEquals(500, stream.limit(500) .count()); verify(objectListing, times(1)).getObjectSummaries(); } @Test public void getSummariesStreamFull() { answer = true; AmazonS3Client client = mock(AmazonS3Client.class); ObjectListing objectListing = mock(ObjectListing.class); when(objectListing.getObjectSummaries()).thenReturn(createSummaries()); when(client.listObjects(any(ListObjectsRequest.class))).thenReturn(objectListing); when(objectListing.isTruncated()).thenAnswer(__ -> { try { return answer; } finally { answer = false; } }); // when(objectListing.getObjectSummaries()).thenReturn(summaries); S3Utils utils = new S3Utils( client, null, null, false, null); verify(objectListing, times(0)).getObjectSummaries(); Stream<String> stream = utils.getSummariesStream(new ListObjectsRequest(), s -> { return s.getKey(); }); assertEquals(2000, stream.limit(2000) .count()); } private List<S3ObjectSummary> createSummaries() { List<S3ObjectSummary> summaries = new ArrayList<>(); for (int i = 0; i < 1000; i++) { S3ObjectSummary summary = new S3ObjectSummary(); summary.setKey("" + i); summaries.add(summary); } return summaries; } @Test public void deleteObjects() { AmazonS3Client client = mock(AmazonS3Client.class); S3Utils utils = new S3Utils( client, null, null, false, null); List<KeyVersion> keys = new ArrayList<>(); for (int i = 0; i < 2000; i++) { keys.add(new KeyVersion( "")); } utils.delete("", keys); verify(client, times(2)).deleteObjects(any()); } @Test public void emptyInputStream() throws IOException { assertEquals(0, S3Utils.emptyInputStream() .available()); } @Test(expected = IOException.class) public void emptyInputStreamException() throws IOException { S3Utils.emptyInputStream() .read(); } }