diff --git a/glacier/pom.xml b/glacier/pom.xml
index fc35eab..b741f10 100644
--- a/glacier/pom.xml
+++ b/glacier/pom.xml
@@ -142,7 +142,7 @@
- long
+ livelong
@@ -160,7 +160,47 @@
src/test/resources/testng.xml
live
- liveshort
+ liveshort, setup
+
+
+ ${jclouds.blobstore.httpstream.url}
+
+
+ ${jclouds.blobstore.httpstream.md5}
+
+ ${test.glacier.endpoint}
+ ${test.glacier.api-version}
+ ${test.glacier.build-version}
+ ${test.glacier.identity}
+ ${test.glacier.credential}
+
+
+
+
+
+
+
+
+
+ livelongsetup
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ integration
+ integration-test
+
+ test
+
+
+
+ src/test/resources/testng.xml
+
+ live
+ liveshort, longtest
${jclouds.blobstore.httpstream.url}
diff --git a/glacier/src/main/java/org/jclouds/glacier/domain/JobMetadata.java b/glacier/src/main/java/org/jclouds/glacier/domain/JobMetadata.java
index 6dfc5eb..1e67df8 100644
--- a/glacier/src/main/java/org/jclouds/glacier/domain/JobMetadata.java
+++ b/glacier/src/main/java/org/jclouds/glacier/domain/JobMetadata.java
@@ -70,7 +70,7 @@ public JobMetadata(String action, @Nullable String archiveId, @Nullable Long arc
@Nullable String archiveSHA256TreeHash, boolean completed, @Nullable Date completionDate, Date creationDate,
@Nullable Long inventorySizeInBytes, @Nullable String jobDescription, String jobId,
@Nullable String retrievalByteRange, @Nullable String sha256TreeHash, @Nullable String snsTopic,
- String statusCode, String statusMessage, String vaultArn,
+ String statusCode, @Nullable String statusMessage, String vaultArn,
@Nullable InventoryRetrievalParameters parameters) {
super();
this.action = checkNotNull(action, "action");
@@ -87,7 +87,7 @@ public JobMetadata(String action, @Nullable String archiveId, @Nullable Long arc
this.sha256TreeHash = sha256TreeHash;
this.snsTopic = snsTopic;
this.statusCode = JobStatus.fromString(checkNotNull(statusCode, "statusCode"));
- this.statusMessage = checkNotNull(statusMessage, "statusMessage");
+ this.statusMessage = statusMessage;
this.vaultArn = checkNotNull(vaultArn, "vaultArn");
this.parameters = parameters;
}
diff --git a/glacier/src/test/java/org/jclouds/glacier/GlacierClientLongLiveTest.java b/glacier/src/test/java/org/jclouds/glacier/GlacierClientLongLiveTest.java
index e851f72..1ab4939 100644
--- a/glacier/src/test/java/org/jclouds/glacier/GlacierClientLongLiveTest.java
+++ b/glacier/src/test/java/org/jclouds/glacier/GlacierClientLongLiveTest.java
@@ -17,22 +17,130 @@
package org.jclouds.glacier;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.jclouds.glacier.util.TestUtils.MiB;
+import static org.jclouds.glacier.util.TestUtils.buildData;
+import static org.jclouds.glacier.util.TestUtils.buildPayload;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.concurrent.TimeUnit;
import org.jclouds.apis.BaseApiLiveTest;
+import org.jclouds.glacier.domain.ArchiveRetrievalJobRequest;
+import org.jclouds.glacier.domain.InventoryRetrievalJobRequest;
+import org.jclouds.glacier.domain.JobMetadata;
+import org.jclouds.glacier.domain.JobStatus;
+import org.jclouds.glacier.domain.VaultMetadata;
+import org.jclouds.glacier.util.ContentRange;
import org.testng.annotations.Test;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.hash.HashCode;
+import com.google.common.io.Closer;
+
/**
* Long live test for Glacier.
*/
-@Test(groups = {"live", "livelong"})
public class GlacierClientLongLiveTest extends BaseApiLiveTest{
+ private static final long PART_SIZE = 1;
+ private static final long INITIAL_WAIT = TimeUnit.HOURS.toMillis(3);
+ private static final long TIME_BETWEEN_POLLS = TimeUnit.MINUTES.toMillis(15);
+ private static final String VAULT_NAME = "JCLOUDS_LIVE_TESTS";
+ private static final String ARCHIVE_DESCRIPTION = "test archive";
+
+ private String archiveId = null;
+ private String archiveRetrievalJob = null;
+ private String inventoryRetrievalJob = null;
+
public GlacierClientLongLiveTest() {
this.provider = "glacier";
}
- @Test
- public void testApi() throws Exception {
- assertThat(api).isNotNull();
+ @Test(groups = {"live", "livelong", "setup"})
+ public void testSetVault() throws Exception {
+ api.createVault(VAULT_NAME);
+ api.uploadArchive(VAULT_NAME, buildPayload(1 * MiB), ARCHIVE_DESCRIPTION);
+ }
+
+ @Test(groups = {"live", "livelong", "longtest"})
+ public void testUploadArchive() {
+ String archiveId = api.uploadArchive(VAULT_NAME, buildPayload(1 * MiB));
+ assertThat(api.deleteArchive(VAULT_NAME, archiveId)).isTrue();
+ }
+
+ @Test(groups = {"live", "livelong", "longtest"})
+ public void testCompleteMultipartUpload() {
+ String uploadId = api.initiateMultipartUpload(VAULT_NAME, PART_SIZE);
+ ImmutableMap.Builder hashes = ImmutableMap.builder();
+ hashes.put(0, api.uploadPart(VAULT_NAME, uploadId, ContentRange.fromPartNumber(0, PART_SIZE),
+ buildPayload(PART_SIZE * MiB)));
+ hashes.put(1, api.uploadPart(VAULT_NAME, uploadId, ContentRange.fromPartNumber(1, PART_SIZE),
+ buildPayload(PART_SIZE * MiB)));
+ archiveId = api.completeMultipartUpload(VAULT_NAME, uploadId, hashes.build(), PART_SIZE * 2 * MiB);
+ assertThat(archiveId).isNotNull();
+ }
+
+ @Test(groups = {"live", "livelong", "longtest"}, dependsOnMethods = {"testUploadArchive", "testCompleteMultipartUpload"})
+ public void testInitiateJob() {
+ ArchiveRetrievalJobRequest archiveRetrieval = ArchiveRetrievalJobRequest.builder().archiveId(archiveId).build();
+ InventoryRetrievalJobRequest inventoryRetrieval = InventoryRetrievalJobRequest.builder().build();
+ archiveRetrievalJob = api.initiateJob(VAULT_NAME, archiveRetrieval);
+ inventoryRetrievalJob = api.initiateJob(VAULT_NAME, inventoryRetrieval);
+ assertThat(archiveRetrievalJob).isNotNull();
+ assertThat(inventoryRetrievalJob).isNotNull();
+ }
+
+ @Test(groups = {"live", "livelong", "longtest"}, dependsOnMethods = {"testInitiateJob"})
+ public void testDescribeJob() {
+ VaultMetadata vaultMetadata = api.describeVault(VAULT_NAME);
+
+ JobMetadata archiveRetrievalMetadata = api.describeJob(VAULT_NAME, archiveRetrievalJob);
+ assertThat(archiveRetrievalMetadata.getArchiveId()).isEqualTo(archiveId);
+ assertThat(archiveRetrievalMetadata.getJobId()).isEqualTo(archiveRetrievalJob);
+ assertThat(archiveRetrievalMetadata.getVaultArn()).isEqualTo(vaultMetadata.getVaultARN());
+
+ JobMetadata inventoryRetrievalMetadata = api.describeJob(VAULT_NAME, inventoryRetrievalJob);
+ assertThat(inventoryRetrievalMetadata.getJobId()).isEqualTo(inventoryRetrievalJob);
+ assertThat(inventoryRetrievalMetadata.getVaultArn()).isEqualTo(vaultMetadata.getVaultARN());
+ }
+
+ @Test(groups = {"live", "livelong", "longtest"}, dependsOnMethods = {"testInitiateJob"})
+ public void testListJobs() {
+ assertThat(api.listJobs(VAULT_NAME)).extracting("jobId").contains(inventoryRetrievalJob, archiveRetrievalJob);
+ }
+
+ @Test(groups = {"live", "livelong", "longtest"}, dependsOnMethods = {"testInitiateJob", "testDescribeJob", "testListJobs"})
+ public void testWaitForSucceed() throws InterruptedException {
+ Thread.sleep(INITIAL_WAIT);
+ while (api.describeJob(VAULT_NAME, archiveRetrievalJob).getStatusCode() == JobStatus.IN_PROGRESS ||
+ api.describeJob(VAULT_NAME, inventoryRetrievalJob).getStatusCode() == JobStatus.IN_PROGRESS) {
+ Thread.sleep(TIME_BETWEEN_POLLS);
+ }
+ assertThat(api.describeJob(VAULT_NAME, archiveRetrievalJob).getStatusCode()).isEqualTo(JobStatus.SUCCEEDED);
+ assertThat(api.describeJob(VAULT_NAME, inventoryRetrievalJob).getStatusCode()).isEqualTo(JobStatus.SUCCEEDED);
+ }
+
+ @Test(groups = {"live", "livelong", "longtest"}, dependsOnMethods = {"testWaitForSucceed"})
+ public void testGetJobOutput() throws IOException {
+ Closer closer = Closer.create();
+ try {
+ InputStream inputStream = closer.register(api.getJobOutput(VAULT_NAME, archiveRetrievalJob).openStream());
+ InputStream expectedInputStream = closer.register(buildData(PART_SIZE * 2 * MiB).openStream());
+ assertThat(inputStream).hasContentEqualTo(expectedInputStream);
+ } finally {
+ closer.close();
+ }
+ }
+
+ @Test(groups = {"live", "livelong", "longtest"}, dependsOnMethods = {"testWaitForSucceed"})
+ public void testGetInventoryRetrievalOutput() throws InterruptedException {
+ assertThat(api.getInventoryRetrievalOutput(VAULT_NAME, inventoryRetrievalJob))
+ .extracting("description").contains(ARCHIVE_DESCRIPTION);
+ }
+
+ @Test(groups = {"live", "livelong", "longtest"}, dependsOnMethods = {"testGetJobOutput"})
+ public void testDeleteArchive() throws Exception {
+ assertThat(api.deleteArchive(VAULT_NAME, archiveId)).isTrue();
}
}