blob: 332eee30fec770c4776dcc921511a748c1853cbc [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.jclouds.b2.features;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.Map;
import java.util.Random;
import org.jclouds.io.Payload;
import org.jclouds.io.Payloads;
import org.jclouds.b2.domain.Action;
import org.jclouds.b2.domain.B2Object;
import org.jclouds.b2.domain.Bucket;
import org.jclouds.b2.domain.BucketType;
import org.jclouds.b2.domain.GetUploadPartResponse;
import org.jclouds.b2.domain.ListPartsResponse;
import org.jclouds.b2.domain.ListUnfinishedLargeFilesResponse;
import org.jclouds.b2.domain.MultipartUploadResponse;
import org.jclouds.b2.internal.BaseB2ApiLiveTest;
import org.jclouds.utils.TestUtils;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.hash.Hashing;
import com.google.common.io.ByteSource;
public final class MultipartApiLiveTest extends BaseB2ApiLiveTest {
private static final Random random = new Random();
@Test(groups = "live")
public void testCancelMultipart() throws Exception {
BucketApi bucketApi = api.getBucketApi();
MultipartApi multipartApi = api.getMultipartApi();
String fileName = "file-name";
String contentType = "text/plain";
Map<String, String> fileInfo = ImmutableMap.of("author", "unknown");
Bucket bucket = bucketApi.createBucket(getBucketName(), BucketType.ALL_PRIVATE);
try {
MultipartUploadResponse response = multipartApi.startLargeFile(bucket.bucketId(), fileName, contentType, fileInfo);
multipartApi.cancelLargeFile(response.fileId());
} finally {
bucketApi.deleteBucket(bucket.bucketId());
}
}
@Test(groups = "live")
public void testFinishMultipart() throws Exception {
BucketApi bucketApi = api.getBucketApi();
ObjectApi objectApi = api.getObjectApi();
MultipartApi multipartApi = api.getMultipartApi();
String fileName = "file-name";
String contentType = "text/plain";
Map<String, String> fileInfo = ImmutableMap.of("author", "unknown");
Bucket bucket = bucketApi.createBucket(getBucketName(), BucketType.ALL_PRIVATE);
MultipartUploadResponse response = null;
B2Object b2Object = null;
try {
response = multipartApi.startLargeFile(bucket.bucketId(), fileName, contentType, fileInfo);
ByteSource part1 = TestUtils.randomByteSource().slice(0, 100 * 1024 * 1024);
String hash1 = part1.hash(Hashing.sha1()).toString();
Payload payload1 = Payloads.newByteSourcePayload(part1);
payload1.getContentMetadata().setContentLength(part1.size());
GetUploadPartResponse uploadUrl = multipartApi.getUploadPartUrl(response.fileId());
multipartApi.uploadPart(uploadUrl, 1, hash1, payload1);
ByteSource part2 = TestUtils.randomByteSource().slice(0, 1);
String hash2 = part2.hash(Hashing.sha1()).toString();
Payload payload2 = Payloads.newByteSourcePayload(part2);
payload2.getContentMetadata().setContentLength(part2.size());
uploadUrl = multipartApi.getUploadPartUrl(response.fileId());
multipartApi.uploadPart(uploadUrl, 2, hash2, payload2);
b2Object = multipartApi.finishLargeFile(response.fileId(), ImmutableList.of(hash1, hash2));
response = null;
assertThat(b2Object.fileName()).isEqualTo(fileName);
assertThat(b2Object.fileInfo()).isEqualTo(fileInfo);
assertThat(b2Object.uploadTimestamp()).isAfterYear(2015);
assertThat(b2Object.action()).isEqualTo(Action.UPLOAD);
assertThat(b2Object.bucketId()).isEqualTo(bucket.bucketId());
assertThat(b2Object.contentLength()).isEqualTo(100 * 1024 * 1024 + 1);
assertThat(b2Object.contentType()).isEqualTo(contentType);
} finally {
if (b2Object != null) {
objectApi.deleteFileVersion(fileName, b2Object.fileId());
}
if (response != null) {
multipartApi.cancelLargeFile(response.fileId());
}
bucketApi.deleteBucket(bucket.bucketId());
}
}
@Test(groups = "live")
public void testListParts() throws Exception {
BucketApi bucketApi = api.getBucketApi();
ObjectApi objectApi = api.getObjectApi();
MultipartApi multipartApi = api.getMultipartApi();
String fileName = "file-name";
String contentType = "text/plain";
Map<String, String> fileInfo = ImmutableMap.of("author", "unknown");
Bucket bucket = bucketApi.createBucket(getBucketName(), BucketType.ALL_PRIVATE);
MultipartUploadResponse response = null;
B2Object b2Object = null;
try {
response = multipartApi.startLargeFile(bucket.bucketId(), fileName, contentType, fileInfo);
ListPartsResponse listParts = multipartApi.listParts(response.fileId(), 1, 1000);
assertThat(listParts.parts()).hasSize(0);
long contentLength = 1024 * 1024;
ByteSource part = TestUtils.randomByteSource().slice(0, contentLength);
String hash = part.hash(Hashing.sha1()).toString();
Payload payload = Payloads.newByteSourcePayload(part);
payload.getContentMetadata().setContentLength(contentLength);
GetUploadPartResponse uploadUrl = multipartApi.getUploadPartUrl(response.fileId());
multipartApi.uploadPart(uploadUrl, 1, hash, payload);
listParts = multipartApi.listParts(response.fileId(), 1, 1000);
assertThat(listParts.parts()).hasSize(1);
ListPartsResponse.Entry entry = listParts.parts().get(0);
assertThat(entry.contentLength()).isEqualTo(contentLength);
assertThat(entry.contentSha1()).isEqualTo(hash);
assertThat(entry.partNumber()).isEqualTo(1);
} finally {
if (response != null) {
multipartApi.cancelLargeFile(response.fileId());
}
bucketApi.deleteBucket(bucket.bucketId());
}
}
@Test(groups = "live")
public void testListUnfinishedLargeFiles() throws Exception {
BucketApi bucketApi = api.getBucketApi();
ObjectApi objectApi = api.getObjectApi();
MultipartApi multipartApi = api.getMultipartApi();
String fileName = "file-name";
String contentType = "text/plain";
Map<String, String> fileInfo = ImmutableMap.of("author", "unknown");
Bucket bucket = bucketApi.createBucket(getBucketName(), BucketType.ALL_PRIVATE);
MultipartUploadResponse response = null;
B2Object b2Object = null;
try {
ListUnfinishedLargeFilesResponse unfinishedLargeFiles = multipartApi.listUnfinishedLargeFiles(bucket.bucketId(), null, null);
assertThat(unfinishedLargeFiles.files()).hasSize(0);
response = multipartApi.startLargeFile(bucket.bucketId(), fileName, contentType, fileInfo);
unfinishedLargeFiles = multipartApi.listUnfinishedLargeFiles(bucket.bucketId(), null, null);
assertThat(unfinishedLargeFiles.files()).hasSize(1);
ListUnfinishedLargeFilesResponse.Entry entry = unfinishedLargeFiles.files().get(0);
assertThat(entry.contentType()).isEqualTo(contentType);
assertThat(entry.fileInfo()).isEqualTo(fileInfo);
assertThat(entry.fileName()).isEqualTo(fileName);
} finally {
if (response != null) {
multipartApi.cancelLargeFile(response.fileId());
}
bucketApi.deleteBucket(bucket.bucketId());
}
}
private static String getBucketName() {
return "jcloudstestbucket-" + random.nextInt(Integer.MAX_VALUE);
}
}