blob: b646a9f1c6306b9ee9679ccdf7fd6f7bf96a21a6 [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.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.Collection;
import java.util.Date;
import java.util.Map;
import okhttp3.mockwebserver.MockResponse;
import okhttp3.mockwebserver.MockWebServer;
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.GetUploadPartResponse;
import org.jclouds.b2.domain.ListPartsResponse;
import org.jclouds.b2.domain.ListUnfinishedLargeFilesResponse;
import org.jclouds.b2.domain.MultipartUploadResponse;
import org.jclouds.b2.domain.UploadPartResponse;
import org.jclouds.utils.TestUtils;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
@Test(groups = "unit", testName = "MultipartApiMockTest")
public final class MultipartApiMockTest {
private static final String ACCOUNT_ID = "YOUR_ACCOUNT_ID";
private static final String AUTHORIZATION_TOKEN = "3_20160409004829_42b8f80ba60fb4323dcaad98_ec81302316fccc2260201cbf17813247f312cf3b_000_uplg";
private static final String BUCKET_NAME = "BUCKET_NAME";
private static final String BUCKET_ID = "e73ede9c9c8412db49f60715";
private static final String CONTENT_TYPE = "b2/x-auto";
private static final String FILE_ID = "4_za71f544e781e6891531b001a_f200ec353a2184825_d20160409_m004829_c000_v0001016_t0028";
private static final Map<String, String> FILE_INFO = ImmutableMap.of("author", "unknown");
private static final String FILE_NAME = "bigfile.dat";
private static final String SHA1 = "062685a84ab248d2488f02f6b01b948de2514ad8";
private static final Date UPLOAD_TIMESTAMP = new Date(1460162909000L);
public void testStartLargeFile() throws Exception {
MockWebServer server = createMockWebServer();
server.enqueue(new MockResponse().setBody(stringFromResource("/authorize_account_response.json")));
server.enqueue(new MockResponse().setBody(stringFromResource("/start_large_file_response.json")));
try {
MultipartApi api = api(server.url("/").toString(), "b2").getMultipartApi();
MultipartUploadResponse response = api.startLargeFile(BUCKET_ID, FILE_NAME, CONTENT_TYPE, FILE_INFO);
assertThat(response.accountId()).isEqualTo(ACCOUNT_ID);
assertThat(response.bucketId()).isEqualTo(BUCKET_ID);
assertThat(response.contentType()).isEqualTo(CONTENT_TYPE);
assertThat(response.fileId()).isEqualTo(FILE_ID);
assertThat(response.fileInfo()).isEqualTo(FILE_INFO);
assertThat(response.fileName()).isEqualTo(FILE_NAME);
assertThat(response.uploadTimestamp()).isEqualTo(UPLOAD_TIMESTAMP);
assertThat(server.getRequestCount()).isEqualTo(2);
assertAuthentication(server);
assertRequest(server.takeRequest(), "POST", "/b2api/v2/b2_start_large_file", "/start_large_file_request.json");
} finally {
server.shutdown();
}
}
public void testCancelLargeFile() throws Exception {
MockWebServer server = createMockWebServer();
server.enqueue(new MockResponse().setBody(stringFromResource("/authorize_account_response.json")));
server.enqueue(new MockResponse().setBody(stringFromResource("/cancel_large_file_response.json")));
try {
MultipartApi api = api(server.url("/").toString(), "b2").getMultipartApi();
B2Object response = api.cancelLargeFile(FILE_ID);
assertThat(response.accountId()).isEqualTo(ACCOUNT_ID);
assertThat(response.bucketId()).isEqualTo(BUCKET_ID);
assertThat(response.fileId()).isEqualTo(FILE_ID);
assertThat(response.fileName()).isEqualTo(FILE_NAME);
assertThat(server.getRequestCount()).isEqualTo(2);
assertAuthentication(server);
assertRequest(server.takeRequest(), "POST", "/b2api/v2/b2_cancel_large_file", "/cancel_large_file_request.json");
} finally {
server.shutdown();
}
}
public void testFinishLargeFile() throws Exception {
MockWebServer server = createMockWebServer();
server.enqueue(new MockResponse().setBody(stringFromResource("/authorize_account_response.json")));
server.enqueue(new MockResponse().setBody(stringFromResource("/finish_large_file_response.json")));
Collection<String> sha1 = ImmutableList.of(
"0000000000000000000000000000000000000000",
"ffffffffffffffffffffffffffffffffffffffff");
try {
MultipartApi api = api(server.url("/").toString(), "b2").getMultipartApi();
B2Object response = api.finishLargeFile(FILE_ID, sha1);
assertThat(response.accountId()).isEqualTo(ACCOUNT_ID);
assertThat(response.action()).isEqualTo(Action.UPLOAD);
assertThat(response.bucketId()).isEqualTo(BUCKET_ID);
assertThat(response.contentLength()).isEqualTo(208158542);
assertThat(response.contentSha1()).isEqualTo("none");
assertThat(response.contentType()).isEqualTo(CONTENT_TYPE);
assertThat(response.fileId()).isEqualTo(FILE_ID);
assertThat(response.fileInfo()).isEqualTo(FILE_INFO);
assertThat(response.fileName()).isEqualTo(FILE_NAME);
assertThat(response.uploadTimestamp()).isEqualTo(UPLOAD_TIMESTAMP);
assertThat(server.getRequestCount()).isEqualTo(2);
assertAuthentication(server);
assertRequest(server.takeRequest(), "POST", "/b2api/v2/b2_finish_large_file", "/finish_large_file_request.json");
} finally {
server.shutdown();
}
}
public void testGetUploadPartUrl() throws Exception {
MockWebServer server = createMockWebServer();
server.enqueue(new MockResponse().setBody(stringFromResource("/authorize_account_response.json")));
server.enqueue(new MockResponse().setBody(stringFromResource("/get_upload_part_url_response.json")));
try {
MultipartApi api = api(server.url("/").toString(), "b2").getMultipartApi();
GetUploadPartResponse response = api.getUploadPartUrl(FILE_ID);
assertThat(response.authorizationToken()).isEqualTo(AUTHORIZATION_TOKEN);
assertThat(response.fileId()).isEqualTo(FILE_ID);
assertThat(response.uploadUrl()).isEqualTo(URI.create("https://pod-000-1016-09.backblaze.com/b2api/v2/b2_upload_part/4_ze73ede9c9c8412db49f60715_f100b4e93fbae6252_d20150824_m224353_c900_v8881000_t0001/0037"));
assertThat(server.getRequestCount()).isEqualTo(2);
assertAuthentication(server);
assertRequest(server.takeRequest(), "POST", "/b2api/v2/b2_get_upload_part_url", "/get_upload_part_url_request.json");
} finally {
server.shutdown();
}
}
public void testUploadPart() throws Exception {
MockWebServer server = createMockWebServer();
server.enqueue(new MockResponse().setBody(stringFromResource("/upload_part_response.json")));
try {
MultipartApi api = api(server.url("/").toString(), "b2").getMultipartApi();
GetUploadPartResponse uploadPart = GetUploadPartResponse.create(FILE_ID, server.url("/b2api/v2/b2_upload_part/4a48fe8875c6214145260818/c001_v0001007_t0042").uri(), AUTHORIZATION_TOKEN);
long contentLength = 100 * 1000 * 1000;
Payload payload = Payloads.newByteSourcePayload(TestUtils.randomByteSource().slice(0, contentLength));
payload.getContentMetadata().setContentLength(contentLength);
UploadPartResponse response = api.uploadPart(uploadPart, 1, SHA1, payload);
assertThat(response.contentLength()).isEqualTo(contentLength);
assertThat(response.contentSha1()).isEqualTo(SHA1);
assertThat(response.fileId()).isEqualTo(FILE_ID);
assertThat(response.partNumber()).isEqualTo(1);
assertThat(server.getRequestCount()).isEqualTo(1);
assertRequest(server.takeRequest(), "POST", "/b2api/v2/b2_upload_part/4a48fe8875c6214145260818/c001_v0001007_t0042");
} finally {
server.shutdown();
}
}
public void testListParts() throws Exception {
MockWebServer server = createMockWebServer();
server.enqueue(new MockResponse().setBody(stringFromResource("/authorize_account_response.json")));
server.enqueue(new MockResponse().setBody(stringFromResource("/list_parts_response.json")));
try {
MultipartApi api = api(server.url("/").toString(), "b2").getMultipartApi();
ListPartsResponse response = api.listParts(FILE_ID, 1, 1000);
assertThat(response.nextPartNumber()).isNull();
assertThat(response.parts()).hasSize(3);
ListPartsResponse.Entry entry = response.parts().get(0);
assertThat(entry.contentLength()).isEqualTo(100000000);
assertThat(entry.contentSha1()).isEqualTo("062685a84ab248d2488f02f6b01b948de2514ad8");
assertThat(entry.fileId()).isEqualTo("4_ze73ede9c9c8412db49f60715_f100b4e93fbae6252_d20150824_m224353_c900_v8881000_t0001");
assertThat(entry.partNumber()).isEqualTo(1);
assertThat(entry.uploadTimestamp()).isEqualTo(new Date(1462212185000L));
entry = response.parts().get(1);
assertThat(entry.contentLength()).isEqualTo(100000000);
assertThat(entry.contentSha1()).isEqualTo("cf634751c3d9f6a15344f23cbf13f3fc9542addf");
assertThat(entry.fileId()).isEqualTo("4_ze73ede9c9c8412db49f60715_f100b4e93fbae6252_d20150824_m224353_c900_v8881000_t0001");
assertThat(entry.partNumber()).isEqualTo(2);
assertThat(entry.uploadTimestamp()).isEqualTo(new Date(1462212296000L));
entry = response.parts().get(2);
assertThat(entry.contentLength()).isEqualTo(8158554);
assertThat(entry.contentSha1()).isEqualTo("00ad164147cbbd60aedb2b04ff66b0f74f962753");
assertThat(entry.fileId()).isEqualTo("4_ze73ede9c9c8412db49f60715_f100b4e93fbae6252_d20150824_m224353_c900_v8881000_t0001");
assertThat(entry.partNumber()).isEqualTo(3);
assertThat(entry.uploadTimestamp()).isEqualTo(new Date(1462212327000L));
assertThat(server.getRequestCount()).isEqualTo(2);
assertAuthentication(server);
assertRequest(server.takeRequest(), "POST", "/b2api/v2/b2_list_parts", "/list_parts_request.json");
} finally {
server.shutdown();
}
}
public void testListUnfinishedLargeFiles() throws Exception {
MockWebServer server = createMockWebServer();
server.enqueue(new MockResponse().setBody(stringFromResource("/authorize_account_response.json")));
server.enqueue(new MockResponse().setBody(stringFromResource("/list_unfinished_large_files_response.json")));
try {
MultipartApi api = api(server.url("/").toString(), "b2").getMultipartApi();
ListUnfinishedLargeFilesResponse response = api.listUnfinishedLargeFiles(BUCKET_ID, FILE_ID, 1000);
assertThat(response.nextFileId()).isNull();
assertThat(response.files()).hasSize(1);
ListUnfinishedLargeFilesResponse.Entry entry = response.files().get(0);
assertThat(entry.accountId()).isEqualTo(ACCOUNT_ID);
assertThat(entry.bucketId()).isEqualTo(BUCKET_ID);
assertThat(entry.contentType()).isEqualTo("application/octet-stream");
assertThat(entry.fileId()).isEqualTo("4_ze73ede9c9c8412db49f60715_f100b4e93fbae6252_d20150824_m224353_c900_v8881000_t0001");
assertThat(entry.fileInfo()).isEqualTo(FILE_INFO);
assertThat(entry.fileName()).isEqualTo(FILE_NAME);
assertThat(entry.uploadTimestamp()).isEqualTo(new Date(1462212184000L));
assertThat(server.getRequestCount()).isEqualTo(2);
assertAuthentication(server);
assertRequest(server.takeRequest(), "POST", "/b2api/v2/b2_list_unfinished_large_files", "/list_unfinished_large_files_request.json");
} finally {
server.shutdown();
}
}
}