package com.aol.micro.server.s3.data;
import static org.coursera.metrics.datadog.DatadogReporter.Expansion.COUNT;
import static org.coursera.metrics.datadog.DatadogReporter.Expansion.MEAN;
import static org.coursera.metrics.datadog.DatadogReporter.Expansion.MEDIAN;
import static org.coursera.metrics.datadog.DatadogReporter.Expansion.P95;
import static org.coursera.metrics.datadog.DatadogReporter.Expansion.P99;
import static org.coursera.metrics.datadog.DatadogReporter.Expansion.RATE_15_MINUTE;
import static org.coursera.metrics.datadog.DatadogReporter.Expansion.RATE_1_MINUTE;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import java.io.File;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
import cyclops.control.Try;
import org.coursera.metrics.datadog.DatadogReporter;
import org.coursera.metrics.datadog.transport.HttpTransport;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.transfer.TransferManager;
import com.amazonaws.services.s3.transfer.model.UploadResult;
import com.codahale.metrics.Histogram;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.SharedMetricRegistries;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class S3DownloadSystemTest{
private static final String BUCKET = System.getProperty("s3.bucket");
private static TransferManager manager;
private static File tmpDir;
private static Random r;
private static MetricRegistry metricsRegistry = SharedMetricRegistries.getOrCreate("default");
private final Histogram downloadHist = getHistogram("com.aol.micro.server.s3.test.latency.download");
static {
manager = createManager();
tmpDir = new File(
System.getProperty("java.io.tmpdir"));
r = new Random();
}
private static Histogram getHistogram(String meterName) {
return metricsRegistry.histogram(MetricRegistry.name(S3DownloadSystemTest.class, meterName));
}
private static TransferManager createManager() {
AWSCredentials credentials = new AWSCredentials() {
@Override
public String getAWSAccessKeyId() {
return System.getProperty("s3.accessKey");
}
@Override
public String getAWSSecretKey() {
return System.getProperty("s3.secretKey");
}
};
return new TransferManager(
credentials);
}
@BeforeClass
public static void setupMetrics() {
EnumSet<DatadogReporter.Expansion> expansions = EnumSet.of(COUNT, RATE_1_MINUTE, RATE_15_MINUTE, MEDIAN, MEAN,
P95, P99);
HttpTransport httpTransport = new HttpTransport.Builder().withApiKey(System.getProperty("datadog.key"))
.build();
DatadogReporter.Builder builder = DatadogReporter.forRegistry(metricsRegistry)
.withTransport(httpTransport)
.withExpansions(expansions)
.withTags(Arrays.asList("stage:dev"));
DatadogReporter reporter = builder.build();
int reportPeriod = 5;
TimeUnit reportUnit = TimeUnit.valueOf("SECONDS");
log.info("Reporting to datadog every {} {}", reportPeriod, reportUnit);
reporter.start(reportPeriod, reportUnit);
}
@Test
@Ignore
public void download(){
S3ObjectWriter writerWithEncryption = buildWriterWithEncryption(true);
String name = "uploadWithEncryption" + r.nextLong();
Try<UploadResult, Throwable> uploadWithEncryption = writerWithEncryption.putSync(name, "Microserver");
assertTrue(uploadWithEncryption.isSuccess());
ExecutorService executorService = mock(ExecutorService.class);
S3Utils s3Utils = new S3Utils((AmazonS3Client) manager.getAmazonS3Client(), manager, tmpDir.getAbsolutePath(), true, executorService);
S3Reader s3Reader = s3Utils.reader(BUCKET);
long startD = System.currentTimeMillis();
Try<String, Throwable> download = s3Reader.getAsObject(name);
long endD = System.currentTimeMillis();
assertTrue(download.isSuccess());
assertEquals("Microserver",download.firstValue());
downloadHist.update(endD - startD);
}
private S3ObjectWriter buildWriterWithEncryption(boolean aesEncryption) {
return new S3ObjectWriter(
manager, BUCKET, tmpDir, aesEncryption);
}
}