blob: 3de3cdb0f4885751e950e3b05d118ca639e46141 [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.io.IOException;
import java.io.InputStream;
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.B2ObjectList;
import org.jclouds.b2.domain.Bucket;
import org.jclouds.b2.domain.BucketType;
import org.jclouds.b2.domain.HideFileResponse;
import org.jclouds.b2.domain.UploadFileResponse;
import org.jclouds.b2.domain.UploadUrlResponse;
import org.jclouds.b2.internal.BaseB2ApiLiveTest;
import org.jclouds.util.Closeables2;
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 ObjectApiLiveTest extends BaseB2ApiLiveTest {
private static final Random random = new Random();
@Test(groups = "live")
public void testGetFileInfo() throws Exception {
BucketApi bucketApi = api.getBucketApi();
ObjectApi objectApi = api.getObjectApi();
ByteSource byteSource = TestUtils.randomByteSource().slice(0, 1024);
Payload payload = Payloads.newByteSourcePayload(byteSource);
payload.getContentMetadata().setContentLength(byteSource.size());
String fileName = "file-name";
String contentSha1 = byteSource.hash(Hashing.sha1()).toString();
String contentType = "text/plain";
payload.getContentMetadata().setContentType(contentType);
Map<String, String> fileInfo = ImmutableMap.of("author", "unknown");
Bucket response = bucketApi.createBucket(getBucketName(), BucketType.ALL_PRIVATE);
UploadFileResponse uploadFile = null;
try {
UploadUrlResponse uploadUrl = objectApi.getUploadUrl(response.bucketId());
uploadFile = objectApi.uploadFile(uploadUrl, fileName, contentSha1, fileInfo, payload);
B2Object b2Object = objectApi.getFileInfo(uploadFile.fileId());
assertThat(b2Object.fileId()).isEqualTo(uploadFile.fileId());
assertThat(b2Object.fileName()).isEqualTo(fileName);
assertThat(b2Object.accountId()).isEqualTo(response.accountId());
assertThat(b2Object.bucketId()).isEqualTo(response.bucketId());
assertThat(b2Object.contentLength()).isEqualTo(byteSource.size());
assertThat(b2Object.contentSha1()).isEqualTo(contentSha1);
assertThat(b2Object.contentType()).isEqualTo(contentType);
assertThat(b2Object.fileInfo()).isEqualTo(fileInfo);
assertThat(b2Object.action()).isEqualTo(Action.UPLOAD);
assertThat(b2Object.uploadTimestamp()).isAfterYear(2015);
assertThat(b2Object.payload()).isNull();
} finally {
if (uploadFile != null) {
objectApi.deleteFileVersion(uploadFile.fileName(), uploadFile.fileId());
}
bucketApi.deleteBucket(response.bucketId());
}
}
@Test(groups = "live")
public void testDownloadFileById() throws Exception {
BucketApi bucketApi = api.getBucketApi();
ObjectApi objectApi = api.getObjectApi();
ByteSource byteSource = TestUtils.randomByteSource().slice(0, 1024);
Payload payload = Payloads.newByteSourcePayload(byteSource);
payload.getContentMetadata().setContentLength(byteSource.size());
String fileName = "file-name";
String contentSha1 = byteSource.hash(Hashing.sha1()).toString();
String contentType = "text/plain";
payload.getContentMetadata().setContentType(contentType);
Map<String, String> fileInfo = ImmutableMap.of("author", "unknown");
Bucket response = bucketApi.createBucket(getBucketName(), BucketType.ALL_PRIVATE);
UploadFileResponse uploadFile = null;
try {
UploadUrlResponse uploadUrl = objectApi.getUploadUrl(response.bucketId());
uploadFile = objectApi.uploadFile(uploadUrl, fileName, contentSha1, fileInfo, payload);
B2Object b2Object = objectApi.downloadFileById(uploadFile.fileId());
payload = b2Object.payload();
assertThat(b2Object.fileName()).isEqualTo(fileName);
assertThat(b2Object.contentSha1()).isEqualTo(contentSha1);
assertThat(b2Object.fileInfo()).isEqualTo(fileInfo);
assertThat(b2Object.uploadTimestamp()).isAfterYear(2015);
assertThat(payload.getContentMetadata().getContentType()).isEqualTo(contentType);
InputStream actual = null;
InputStream expected = null;
try {
actual = payload.openStream();
expected = byteSource.openStream();
assertThat(actual).hasContentEqualTo(expected);
} finally {
Closeables2.closeQuietly(expected);
Closeables2.closeQuietly(actual);
}
} finally {
if (uploadFile != null) {
objectApi.deleteFileVersion(uploadFile.fileName(), uploadFile.fileId());
}
bucketApi.deleteBucket(response.bucketId());
}
}
@Test(groups = "live")
public void testDownloadFileByName() throws Exception {
BucketApi bucketApi = api.getBucketApi();
ObjectApi objectApi = api.getObjectApi();
String bucketName = getBucketName();
ByteSource byteSource = TestUtils.randomByteSource().slice(0, 1024);
Payload payload = Payloads.newByteSourcePayload(byteSource);
payload.getContentMetadata().setContentLength(byteSource.size());
String fileName = "file name"; // intentionally using spaces in file name
String contentSha1 = byteSource.hash(Hashing.sha1()).toString();
String contentType = "text/plain";
payload.getContentMetadata().setContentType(contentType);
Map<String, String> fileInfo = ImmutableMap.of("author", "unknown");
Bucket response = bucketApi.createBucket(bucketName, BucketType.ALL_PRIVATE);
UploadFileResponse uploadFile = null;
try {
UploadUrlResponse uploadUrl = objectApi.getUploadUrl(response.bucketId());
uploadFile = objectApi.uploadFile(uploadUrl, fileName, contentSha1, fileInfo, payload);
B2Object b2Object = objectApi.downloadFileByName(bucketName, fileName);
payload = b2Object.payload();
assertThat(b2Object.fileName()).isEqualTo(fileName);
assertThat(b2Object.contentSha1()).isEqualTo(contentSha1);
assertThat(b2Object.fileInfo()).isEqualTo(fileInfo);
assertThat(b2Object.uploadTimestamp()).isAfterYear(2015);
assertThat(payload.getContentMetadata().getContentType()).isEqualTo(contentType);
InputStream actual = null;
InputStream expected = null;
try {
actual = payload.openStream();
expected = byteSource.openStream();
assertThat(actual).hasContentEqualTo(expected);
} finally {
Closeables2.closeQuietly(expected);
Closeables2.closeQuietly(actual);
}
} finally {
if (uploadFile != null) {
objectApi.deleteFileVersion(uploadFile.fileName(), uploadFile.fileId());
}
bucketApi.deleteBucket(response.bucketId());
}
}
@Test(groups = "live")
public void testListFileNames() throws Exception {
BucketApi bucketApi = api.getBucketApi();
ObjectApi objectApi = api.getObjectApi();
Bucket response = bucketApi.createBucket(getBucketName(), BucketType.ALL_PRIVATE);
int numFiles = 3;
ImmutableList.Builder<UploadFileResponse> uploadFiles = ImmutableList.builder();
try {
for (int i = 0; i < numFiles; ++i) {
uploadFiles.add(createFile(objectApi, response.bucketId(), "file" + i));
}
B2ObjectList list = objectApi.listFileNames(response.bucketId(), null, null);
assertThat(list.files()).hasSize(numFiles);
} finally {
for (UploadFileResponse uploadFile : uploadFiles.build()) {
objectApi.deleteFileVersion(uploadFile.fileName(), uploadFile.fileId());
}
bucketApi.deleteBucket(response.bucketId());
}
}
@Test(groups = "live")
public void testListFileVersions() throws Exception {
BucketApi bucketApi = api.getBucketApi();
ObjectApi objectApi = api.getObjectApi();
Bucket response = bucketApi.createBucket(getBucketName(), BucketType.ALL_PRIVATE);
int numFiles = 3;
ImmutableList.Builder<UploadFileResponse> uploadFiles = ImmutableList.builder();
try {
for (int i = 0; i < numFiles; ++i) {
uploadFiles.add(createFile(objectApi, response.bucketId(), "file"));
}
B2ObjectList list = objectApi.listFileNames(response.bucketId(), null, null);
assertThat(list.files()).hasSize(1);
list = objectApi.listFileVersions(response.bucketId(), null, null, null);
assertThat(list.files()).hasSize(numFiles);
} finally {
for (UploadFileResponse uploadFile : uploadFiles.build()) {
objectApi.deleteFileVersion(uploadFile.fileName(), uploadFile.fileId());
}
bucketApi.deleteBucket(response.bucketId());
}
}
@Test(groups = "live")
public void testHideFile() throws Exception {
BucketApi bucketApi = api.getBucketApi();
ObjectApi objectApi = api.getObjectApi();
String fileName = "file-name";
Bucket response = bucketApi.createBucket(getBucketName(), BucketType.ALL_PRIVATE);
UploadFileResponse uploadFile = null;
HideFileResponse hideFile = null;
try {
uploadFile = createFile(objectApi, response.bucketId(), fileName);
B2ObjectList list = objectApi.listFileNames(response.bucketId(), null, null);
assertThat(list.files()).hasSize(1);
hideFile = objectApi.hideFile(response.bucketId(), fileName);
list = objectApi.listFileNames(response.bucketId(), null, null);
assertThat(list.files()).isEmpty();
list = objectApi.listFileVersions(response.bucketId(), null, null, null);
assertThat(list.files()).hasSize(2);
} finally {
if (hideFile != null) {
objectApi.deleteFileVersion(hideFile.fileName(), hideFile.fileId());
}
if (uploadFile != null) {
objectApi.deleteFileVersion(uploadFile.fileName(), uploadFile.fileId());
}
bucketApi.deleteBucket(response.bucketId());
}
}
private static String getBucketName() {
return "jcloudstestbucket-" + random.nextInt(Integer.MAX_VALUE);
}
private static UploadFileResponse createFile(ObjectApi objectApi, String bucketId, String fileName) throws IOException {
ByteSource byteSource = TestUtils.randomByteSource().slice(0, 1024);
Payload payload = Payloads.newByteSourcePayload(byteSource);
payload.getContentMetadata().setContentLength(byteSource.size());
String contentSha1 = byteSource.hash(Hashing.sha1()).toString();
String contentType = "text/plain";
payload.getContentMetadata().setContentType(contentType);
Map<String, String> fileInfo = ImmutableMap.of("author", "unknown");
UploadUrlResponse uploadUrl = objectApi.getUploadUrl(bucketId);
return objectApi.uploadFile(uploadUrl, fileName, contentSha1, fileInfo, payload);
}
}