/*
* The Alluxio Open Foundation licenses this work under the Apache License, version 2.0
* (the "License"). You may not use this work except in compliance with the License, which is
* available at www.apache.org/licenses/LICENSE-2.0
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied, as more fully set forth in the License.
*
* See the NOTICE file distributed with this work for information regarding copyright ownership.
*/
package alluxio.underfs.s3a;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.amazonaws.services.s3.transfer.TransferManager;
import com.amazonaws.services.s3.transfer.Upload;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.security.DigestOutputStream;
/**
* Unit tests for the {@link S3AOutputStream}.
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest(S3AOutputStream.class)
public class S3AOutputStreamTest {
private static final String BUCKET_NAME = "testBucket";
private static final String KEY = "testKey";
private File mFile;
private BufferedOutputStream mLocalOutputStream;
private S3AOutputStream mStream;
/**
* Sets the properties and configuration before each test runs.
*/
@Before
public void before() throws Exception {
mFile = Mockito.mock(File.class);
mLocalOutputStream = Mockito.mock(BufferedOutputStream.class);
TransferManager manager = Mockito.mock(TransferManager.class);
Upload result = Mockito.mock(Upload.class);
Mockito.when(manager.upload(Mockito.any(PutObjectRequest.class))).thenReturn(result);
PowerMockito.whenNew(BufferedOutputStream.class)
.withArguments(Mockito.any(DigestOutputStream.class)).thenReturn(mLocalOutputStream);
PowerMockito.whenNew(File.class).withArguments(Mockito.anyString()).thenReturn(mFile);
FileOutputStream outputStream = PowerMockito.mock(FileOutputStream.class);
PowerMockito.whenNew(FileOutputStream.class).withArguments(mFile).thenReturn(outputStream);
mStream = new S3AOutputStream(BUCKET_NAME, KEY, manager);
}
/**
* Tests to ensure {@link S3AOutputStream#write(int)} calls the underlying output stream.
*/
@Test
public void writeByte() throws Exception {
mStream.write(1);
mStream.close();
Mockito.verify(mLocalOutputStream).write(1);
}
/**
* Tests to ensure {@link S3AOutputStream#write(byte[])} calls the underlying output stream.
*/
@Test
public void writeByteArray() throws Exception {
byte[] b = new byte[10];
mStream.write(b);
mStream.close();
Mockito.verify(mLocalOutputStream).write(b, 0, b.length);
}
/**
* Tests to ensure {@link S3AOutputStream#write(byte[], int, int)} calls the underlying
* output stream.
*/
@Test
public void writeByteArrayWithRange() throws Exception {
byte[] b = new byte[10];
mStream.write(b, 0, b.length);
mStream.close();
Mockito.verify(mLocalOutputStream).write(b, 0, b.length);
}
/**
* Tests to ensure {@link File#delete()} is called when the stream is closed.
*/
@Test
public void close() throws Exception {
mStream.close();
Mockito.verify(mFile).delete();
}
/**
* Tests to ensure {@link S3AOutputStream#flush()} calls the underlying output stream.
*/
@Test
public void flush() throws Exception {
mStream.flush();
mStream.close();
Mockito.verify(mLocalOutputStream).flush();
}
}