blob: 8524210d3799567473ad10ce36ecfcf34f598d4f [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 static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown;
import static org.jclouds.b2.features.B2TestUtils.api;
import static org.jclouds.b2.features.B2TestUtils.assertAuthentication;
import static org.jclouds.b2.features.B2TestUtils.assertRequest;
import static org.jclouds.b2.features.B2TestUtils.createMockWebServer;
import static org.jclouds.b2.features.B2TestUtils.stringFromResource;
import java.net.URI;
import java.util.Date;
import java.util.Map;
import org.jclouds.blobstore.ContainerNotFoundException;
import org.jclouds.blobstore.KeyNotFoundException;
import org.jclouds.http.options.GetOptions;
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.DeleteFileResponse;
import org.jclouds.b2.domain.HideFileResponse;
import org.jclouds.b2.domain.UploadFileResponse;
import org.jclouds.b2.domain.UploadUrlResponse;
import org.jclouds.b2.reference.B2Headers;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
import com.google.common.net.HttpHeaders;
import com.squareup.okhttp.mockwebserver.MockResponse;
import com.squareup.okhttp.mockwebserver.MockWebServer;
import com.squareup.okhttp.mockwebserver.RecordedRequest;
@Test(groups = "unit", testName = "ObjectApiMockTest")
public final class ObjectApiMockTest {
private static final String BUCKET_NAME = "BUCKET_NAME";
private static final String BUCKET_ID = "4a48fe8875c6214145260818";
private static final String FILE_ID = "4_h4a48fe8875c6214145260818_f000000000000472a_d20140104_m032022_c001_v0000123_t0104";
private static final String FILE_NAME = "typing_test.txt";
private static final String CONTENT_TYPE = "text/plain";
private static final String SHA1 = "bae5ed658ab3546aee12f23f36392f35dba1ebdd";
private static final String PAYLOAD = "The quick brown fox jumped over the lazy dog.\n";
private static final Map<String, String> FILE_INFO = ImmutableMap.of("author", "unknown");
public void testGetUploadUrl() throws Exception {
MockWebServer server = createMockWebServer();
server.enqueue(new MockResponse().setBody(stringFromResource("/authorize_account_response.json")));
server.enqueue(new MockResponse().setBody(stringFromResource("/get_upload_url_response.json")));
try {
ObjectApi api = api(server.getUrl("/").toString(), "b2").getObjectApi();
UploadUrlResponse response = api.getUploadUrl(BUCKET_ID);
assertThat(response.bucketId()).isEqualTo(BUCKET_ID);
assertThat(response.uploadUrl()).isEqualTo(URI.create("https://pod-000-1005-03.backblaze.com/b2api/v1/b2_upload_file?cvt=c001_v0001005_t0027&bucket=4a48fe8875c6214145260818"));
assertThat(response.authorizationToken()).isEqualTo("2_20151009170037_f504a0f39a0f4e657337e624_9754dde94359bd7b8f1445c8f4cc1a231a33f714_upld");
assertThat(server.getRequestCount()).isEqualTo(2);
assertAuthentication(server);
assertRequest(server.takeRequest(), "POST", "/b2api/v1/b2_get_upload_url", "/get_upload_url_request.json");
} finally {
server.shutdown();
}
}
public void testGetUploadUrlDeletedBucket() throws Exception {
MockWebServer server = createMockWebServer();
server.enqueue(new MockResponse().setBody(stringFromResource("/authorize_account_response.json")));
server.enqueue(new MockResponse().setResponseCode(400).setBody(stringFromResource("/get_upload_url_deleted_bucket_response.json")));
try {
ObjectApi api = api(server.getUrl("/").toString(), "b2").getObjectApi();
try {
api.getUploadUrl(BUCKET_ID);
failBecauseExceptionWasNotThrown(ContainerNotFoundException.class);
} catch (ContainerNotFoundException cnfe) {
// expected
}
assertThat(server.getRequestCount()).isEqualTo(2);
assertAuthentication(server);
assertRequest(server.takeRequest(), "POST", "/b2api/v1/b2_get_upload_url", "/get_upload_url_request.json");
} finally {
server.shutdown();
}
}
public void testUploadFile() throws Exception {
MockWebServer server = createMockWebServer();
server.enqueue(new MockResponse().setBody(stringFromResource("/upload_file_response.json")));
try {
ObjectApi api = api(server.getUrl("/").toString(), "b2").getObjectApi();
String accountId = "d522aa47a10f";
UploadUrlResponse uploadUrl = UploadUrlResponse.create(BUCKET_ID, server.getUrl("/b2api/v1/b2_upload_file/4a48fe8875c6214145260818/c001_v0001007_t0042").toURI(), "FAKE-AUTHORIZATION-TOKEN");
Payload payload = Payloads.newStringPayload(PAYLOAD);
payload.getContentMetadata().setContentType(CONTENT_TYPE);
UploadFileResponse response = api.uploadFile(uploadUrl, FILE_NAME, SHA1, FILE_INFO, payload);
assertThat(response.fileId()).isEqualTo(FILE_ID);
assertThat(response.fileName()).isEqualTo(FILE_NAME);
assertThat(response.accountId()).isEqualTo(accountId);
assertThat(response.bucketId()).isEqualTo(BUCKET_ID);
assertThat(response.contentLength()).isEqualTo(PAYLOAD.length());
assertThat(response.contentSha1()).isEqualTo(SHA1);
assertThat(response.contentType()).isEqualTo(CONTENT_TYPE);
assertThat(response.fileInfo()).isEqualTo(FILE_INFO);
assertThat(server.getRequestCount()).isEqualTo(1);
assertRequest(server.takeRequest(), "POST", "/b2api/v1/b2_upload_file/4a48fe8875c6214145260818/c001_v0001007_t0042");
} finally {
server.shutdown();
}
}
public void testDeleteFileVersion() throws Exception {
MockWebServer server = createMockWebServer();
server.enqueue(new MockResponse().setBody(stringFromResource("/authorize_account_response.json")));
server.enqueue(new MockResponse().setBody(stringFromResource("/delete_object_response.json")));
try {
ObjectApi api = api(server.getUrl("/").toString(), "b2").getObjectApi();
DeleteFileResponse response = api.deleteFileVersion(FILE_NAME, FILE_ID);
assertThat(response.fileName()).isEqualTo(FILE_NAME);
assertThat(response.fileId()).isEqualTo(FILE_ID);
assertThat(server.getRequestCount()).isEqualTo(2);
assertAuthentication(server);
assertRequest(server.takeRequest(), "POST", "/b2api/v1/b2_delete_file_version", "/delete_object_request.json");
} finally {
server.shutdown();
}
}
public void testDeleteAlreadyDeletedFileVersion() throws Exception {
MockWebServer server = createMockWebServer();
server.enqueue(new MockResponse().setBody(stringFromResource("/authorize_account_response.json")));
server.enqueue(new MockResponse().setResponseCode(400).setBody(stringFromResource("/delete_file_version_already_deleted_response.json")));
try {
ObjectApi api = api(server.getUrl("/").toString(), "b2").getObjectApi();
try {
api.deleteFileVersion(FILE_NAME, FILE_ID);
failBecauseExceptionWasNotThrown(KeyNotFoundException.class);
} catch (KeyNotFoundException knfe) {
// expected
}
assertThat(server.getRequestCount()).isEqualTo(2);
assertAuthentication(server);
assertRequest(server.takeRequest(), "POST", "/b2api/v1/b2_delete_file_version", "/delete_object_request.json");
} finally {
server.shutdown();
}
}
public void testGetFileInfo() throws Exception {
MockWebServer server = createMockWebServer();
server.enqueue(new MockResponse().setBody(stringFromResource("/authorize_account_response.json")));
server.enqueue(new MockResponse().setBody(stringFromResource("/get_file_info_response.json")));
try {
ObjectApi api = api(server.getUrl("/").toString(), "b2").getObjectApi();
B2Object b2Object = api.getFileInfo("4_ze73ede9c9c8412db49f60715_f100b4e93fbae6252_d20150824_m224353_c900_v8881000_t0001");
assertThat(b2Object.fileId()).isEqualTo("4_ze73ede9c9c8412db49f60715_f100b4e93fbae6252_d20150824_m224353_c900_v8881000_t0001");
assertThat(b2Object.fileName()).isEqualTo("akitty.jpg");
assertThat(b2Object.accountId()).isEqualTo("7eecc42b9675");
assertThat(b2Object.bucketId()).isEqualTo("e73ede9c9c8412db49f60715");
assertThat(b2Object.contentLength()).isEqualTo(122573);
assertThat(b2Object.contentSha1()).isEqualTo("a01a21253a07fb08a354acd30f3a6f32abb76821");
assertThat(b2Object.contentType()).isEqualTo("image/jpeg");
assertThat(b2Object.fileInfo()).isEqualTo(ImmutableMap.<String, String>of());
assertThat(b2Object.action()).isEqualTo(Action.UPLOAD);
assertThat(b2Object.uploadTimestamp()).isAfterYear(2014);
assertThat(b2Object.payload()).isNull();
assertThat(server.getRequestCount()).isEqualTo(2);
assertAuthentication(server);
assertRequest(server.takeRequest(), "POST", "/b2api/v1/b2_get_file_info", "/get_file_info_request.json");
} finally {
server.shutdown();
}
}
public void testGetFileInfoDeletedFileVersion() throws Exception {
MockWebServer server = createMockWebServer();
server.enqueue(new MockResponse().setBody(stringFromResource("/authorize_account_response.json")));
server.enqueue(new MockResponse().setResponseCode(404).setBody(stringFromResource("/get_file_info_deleted_file_response.json")));
try {
ObjectApi api = api(server.getUrl("/").toString(), "b2").getObjectApi();
B2Object b2Object = api.getFileInfo("4_ze73ede9c9c8412db49f60715_f100b4e93fbae6252_d20150824_m224353_c900_v8881000_t0001");
assertThat(b2Object).isNull();
assertThat(server.getRequestCount()).isEqualTo(2);
assertAuthentication(server);
assertRequest(server.takeRequest(), "POST", "/b2api/v1/b2_get_file_info", "/get_file_info_request.json");
} finally {
server.shutdown();
}
}
public void testDownloadFileById() throws Exception {
MockWebServer server = createMockWebServer();
server.enqueue(new MockResponse().setBody(stringFromResource("/authorize_account_response.json")));
server.enqueue(new MockResponse()
.addHeader(HttpHeaders.CONTENT_TYPE, CONTENT_TYPE)
.addHeader(B2Headers.FILE_ID, FILE_ID)
.addHeader(B2Headers.FILE_NAME, FILE_NAME)
.addHeader(B2Headers.CONTENT_SHA1, SHA1)
.addHeader(B2Headers.UPLOAD_TIMESTAMP, String.valueOf(1500000000000L))
.addHeader(B2Headers.FILE_INFO_PREFIX + FILE_INFO.entrySet().iterator().next().getKey(), FILE_INFO.entrySet().iterator().next().getValue())
.setBody(PAYLOAD));
try {
ObjectApi api = api(server.getUrl("/").toString(), "b2").getObjectApi();
B2Object b2Object = api.downloadFileById(FILE_ID);
assertThat(b2Object.fileId()).isEqualTo(FILE_ID);
assertThat(b2Object.fileName()).isEqualTo(FILE_NAME);
assertThat(b2Object.contentSha1()).isEqualTo(SHA1);
assertThat(b2Object.fileInfo()).isEqualTo(FILE_INFO);
assertThat(b2Object.uploadTimestamp()).isAfterYear(2015);
assertThat(b2Object.payload().getContentMetadata().getContentLength()).isEqualTo(PAYLOAD.length());
assertThat(b2Object.payload().getContentMetadata().getContentType()).isEqualTo(CONTENT_TYPE);
assertThat(server.getRequestCount()).isEqualTo(2);
RecordedRequest request = server.takeRequest();
assertThat(request.getMethod()).isEqualTo("GET");
assertThat(request.getPath()).isEqualTo("/b2api/v1/b2_authorize_account");
request = server.takeRequest();
assertThat(request.getMethod()).isEqualTo("GET");
assertThat(request.getPath()).isEqualTo("/b2api/v1/b2_download_file_by_id?fileId=4_h4a48fe8875c6214145260818_f000000000000472a_d20140104_m032022_c001_v0000123_t0104");
} finally {
server.shutdown();
}
}
public void testDownloadFileByIdOptions() throws Exception {
MockWebServer server = createMockWebServer();
server.enqueue(new MockResponse().setBody(stringFromResource("/authorize_account_response.json")));
server.enqueue(new MockResponse()
.addHeader(HttpHeaders.CONTENT_TYPE, CONTENT_TYPE)
.addHeader(B2Headers.FILE_ID, FILE_ID)
.addHeader(B2Headers.FILE_NAME, FILE_NAME)
.addHeader(B2Headers.CONTENT_SHA1, SHA1)
.addHeader(B2Headers.UPLOAD_TIMESTAMP, String.valueOf(1500000000000L))
.addHeader(B2Headers.FILE_INFO_PREFIX + FILE_INFO.entrySet().iterator().next().getKey(), FILE_INFO.entrySet().iterator().next().getValue())
.setBody(PAYLOAD));
try {
ObjectApi api = api(server.getUrl("/").toString(), "b2").getObjectApi();
B2Object b2Object = api.downloadFileById(FILE_ID, new GetOptions().range(42, 69));
assertThat(server.getRequestCount()).isEqualTo(2);
RecordedRequest request = server.takeRequest();
assertThat(request.getMethod()).isEqualTo("GET");
assertThat(request.getPath()).isEqualTo("/b2api/v1/b2_authorize_account");
request = server.takeRequest();
assertThat(request.getMethod()).isEqualTo("GET");
assertThat(request.getPath()).isEqualTo("/b2api/v1/b2_download_file_by_id?fileId=4_h4a48fe8875c6214145260818_f000000000000472a_d20140104_m032022_c001_v0000123_t0104");
assertThat(request.getHeaders()).contains("Range: bytes=42-69");
} finally {
server.shutdown();
}
}
public void testDownloadFileByName() throws Exception {
MockWebServer server = createMockWebServer();
server.enqueue(new MockResponse().setBody(stringFromResource("/authorize_account_response.json")));
server.enqueue(new MockResponse()
.addHeader(HttpHeaders.CONTENT_TYPE, CONTENT_TYPE)
.addHeader(B2Headers.FILE_ID, FILE_ID)
.addHeader(B2Headers.FILE_NAME, FILE_NAME)
.addHeader(B2Headers.CONTENT_SHA1, SHA1)
.addHeader(B2Headers.UPLOAD_TIMESTAMP, String.valueOf(1500000000000L))
.addHeader(B2Headers.FILE_INFO_PREFIX + FILE_INFO.entrySet().iterator().next().getKey(), FILE_INFO.entrySet().iterator().next().getValue())
.setBody(PAYLOAD));
try {
ObjectApi api = api(server.getUrl("/").toString(), "b2").getObjectApi();
B2Object b2Object = api.downloadFileByName(BUCKET_NAME, FILE_NAME);
assertThat(b2Object.fileId()).isEqualTo(FILE_ID);
assertThat(b2Object.fileName()).isEqualTo(FILE_NAME);
assertThat(b2Object.contentSha1()).isEqualTo(SHA1);
assertThat(b2Object.fileInfo()).isEqualTo(FILE_INFO);
assertThat(b2Object.uploadTimestamp()).isAfterYear(2015);
assertThat(b2Object.payload().getContentMetadata().getContentLength()).isEqualTo(PAYLOAD.length());
assertThat(b2Object.payload().getContentMetadata().getContentType()).isEqualTo(CONTENT_TYPE);
assertThat(server.getRequestCount()).isEqualTo(2);
RecordedRequest request = server.takeRequest();
assertThat(request.getMethod()).isEqualTo("GET");
assertThat(request.getPath()).isEqualTo("/b2api/v1/b2_authorize_account");
request = server.takeRequest();
assertThat(request.getMethod()).isEqualTo("GET");
assertThat(request.getPath()).isEqualTo("/file/BUCKET_NAME/typing_test.txt");
} finally {
server.shutdown();
}
}
public void testListFileNames() throws Exception {
MockWebServer server = createMockWebServer();
server.enqueue(new MockResponse().setBody(stringFromResource("/authorize_account_response.json")));
server.enqueue(new MockResponse().setBody(stringFromResource("/list_file_names_response.json")));
try {
ObjectApi api = api(server.getUrl("/").toString(), "b2").getObjectApi();
String accountId = "d522aa47a10f";
B2ObjectList list = api.listFileNames(BUCKET_ID, null, null);
assertThat(list.nextFileName()).isNull();
assertThat(list.files()).hasSize(2);
B2ObjectList.Entry object = list.files().get(0);
assertThat(object.action()).isEqualTo(Action.UPLOAD);
assertThat(object.fileId()).isEqualTo("4_z27c88f1d182b150646ff0b16_f1004ba650fe24e6b_d20150809_m012853_c100_v0009990_t0000");
assertThat(object.fileName()).isEqualTo("files/hello.txt");
assertThat(object.size()).isEqualTo(6);
assertThat(object.uploadTimestamp()).isEqualTo(new Date(1439083733000L));
object = list.files().get(1);
assertThat(object.action()).isEqualTo(Action.UPLOAD);
assertThat(object.fileId()).isEqualTo("4_z27c88f1d182b150646ff0b16_f1004ba650fe24e6c_d20150809_m012854_c100_v0009990_t0000");
assertThat(object.fileName()).isEqualTo("files/world.txt");
assertThat(object.size()).isEqualTo(6);
assertThat(object.uploadTimestamp()).isEqualTo(new Date(1439083734000L));
assertThat(server.getRequestCount()).isEqualTo(2);
assertAuthentication(server);
assertRequest(server.takeRequest(), "POST", "/b2api/v1/b2_list_file_names", "/list_file_names_request.json");
} finally {
server.shutdown();
}
}
public void testListFileVersions() throws Exception {
MockWebServer server = createMockWebServer();
server.enqueue(new MockResponse().setBody(stringFromResource("/authorize_account_response.json")));
server.enqueue(new MockResponse().setBody(stringFromResource("/list_file_versions_response.json")));
try {
ObjectApi api = api(server.getUrl("/").toString(), "b2").getObjectApi();
String accountId = "d522aa47a10f";
B2ObjectList list = api.listFileVersions(BUCKET_ID, null, null, null);
assertThat(list.nextFileId()).isEqualTo("4_z27c88f1d182b150646ff0b16_f100920ddab886247_d20150809_m232316_c100_v0009990_t0003");
assertThat(list.nextFileName()).isEqualTo("files/world.txt");
assertThat(list.files()).hasSize(3);
B2ObjectList.Entry object = list.files().get(0);
assertThat(object.action()).isEqualTo(Action.UPLOAD);
assertThat(object.fileId()).isEqualTo("4_z27c88f1d182b150646ff0b16_f100920ddab886245_d20150809_m232316_c100_v0009990_t0003");
assertThat(object.fileName()).isEqualTo("files/hello.txt");
assertThat(object.size()).isEqualTo(6);
assertThat(object.uploadTimestamp()).isEqualTo(new Date(1439162596000L));
object = list.files().get(1);
assertThat(object.action()).isEqualTo(Action.HIDE);
assertThat(object.fileId()).isEqualTo("4_z27c88f1d182b150646ff0b16_f100920ddab886247_d20150809_m232323_c100_v0009990_t0005");
assertThat(object.fileName()).isEqualTo("files/world.txt");
assertThat(object.size()).isEqualTo(0);
assertThat(object.uploadTimestamp()).isEqualTo(new Date(1439162603000L));
object = list.files().get(2);
assertThat(object.action()).isEqualTo(Action.UPLOAD);
assertThat(object.fileId()).isEqualTo("4_z27c88f1d182b150646ff0b16_f100920ddab886246_d20150809_m232316_c100_v0009990_t0003");
assertThat(object.fileName()).isEqualTo("files/world.txt");
assertThat(object.size()).isEqualTo(6);
assertThat(object.uploadTimestamp()).isEqualTo(new Date(1439162596000L));
assertThat(server.getRequestCount()).isEqualTo(2);
assertAuthentication(server);
assertRequest(server.takeRequest(), "POST", "/b2api/v1/b2_list_file_versions", "/list_file_versions_request.json");
} finally {
server.shutdown();
}
}
public void testHideFile() throws Exception {
MockWebServer server = createMockWebServer();
server.enqueue(new MockResponse().setBody(stringFromResource("/authorize_account_response.json")));
server.enqueue(new MockResponse().setBody(stringFromResource("/hide_file_response.json")));
try {
ObjectApi api = api(server.getUrl("/").toString(), "b2").getObjectApi();
String accountId = "d522aa47a10f";
HideFileResponse response = api.hideFile(BUCKET_ID, FILE_NAME);
assertThat(response.action()).isEqualTo(Action.HIDE);
assertThat(response.fileId()).isEqualTo("4_h4a48fe8875c6214145260818_f000000000000472a_d20140104_m032022_c001_v0000123_t0104");
assertThat(response.fileName()).isEqualTo(FILE_NAME);
assertThat(response.uploadTimestamp()).isEqualTo(new Date(1437815673000L));
assertThat(server.getRequestCount()).isEqualTo(2);
assertAuthentication(server);
assertRequest(server.takeRequest(), "POST", "/b2api/v1/b2_hide_file", "/hide_file_request.json");
} finally {
server.shutdown();
}
}
}