| Index: chrome/browser/drive/drive_uploader_unittest.cc
|
| diff --git a/chrome/browser/drive/drive_uploader_unittest.cc b/chrome/browser/drive/drive_uploader_unittest.cc
|
| deleted file mode 100644
|
| index 41b73b27ff105641497a2624043f171611f2a478..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/drive/drive_uploader_unittest.cc
|
| +++ /dev/null
|
| @@ -1,955 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/drive/drive_uploader.h"
|
| -
|
| -#include <algorithm>
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/files/scoped_temp_dir.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "base/run_loop.h"
|
| -#include "base/thread_task_runner_handle.h"
|
| -#include "base/values.h"
|
| -#include "chrome/browser/drive/dummy_drive_service.h"
|
| -#include "google_apis/drive/drive_api_parser.h"
|
| -#include "google_apis/drive/test_util.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -using google_apis::CancelCallback;
|
| -using google_apis::FileResource;
|
| -using google_apis::DriveApiErrorCode;
|
| -using google_apis::DRIVE_NO_CONNECTION;
|
| -using google_apis::DRIVE_OTHER_ERROR;
|
| -using google_apis::HTTP_CONFLICT;
|
| -using google_apis::HTTP_CREATED;
|
| -using google_apis::HTTP_NOT_FOUND;
|
| -using google_apis::HTTP_PRECONDITION;
|
| -using google_apis::HTTP_RESUME_INCOMPLETE;
|
| -using google_apis::HTTP_SUCCESS;
|
| -using google_apis::InitiateUploadCallback;
|
| -using google_apis::ProgressCallback;
|
| -using google_apis::UploadRangeResponse;
|
| -using google_apis::drive::UploadRangeCallback;
|
| -namespace test_util = google_apis::test_util;
|
| -
|
| -namespace drive {
|
| -
|
| -namespace {
|
| -
|
| -const char kTestDummyMd5[] = "dummy_md5";
|
| -const char kTestDocumentTitle[] = "Hello world";
|
| -const char kTestInitiateUploadParentResourceId[] = "parent_resource_id";
|
| -const char kTestInitiateUploadResourceId[] = "resource_id";
|
| -const char kTestMimeType[] = "text/plain";
|
| -const char kTestUploadNewFileURL[] = "http://test/upload_location/new_file";
|
| -const char kTestUploadExistingFileURL[] =
|
| - "http://test/upload_location/existing_file";
|
| -const int64 kUploadChunkSize = 1024 * 1024 * 1024;
|
| -const char kTestETag[] = "test_etag";
|
| -
|
| -CancelCallback SendMultipartUploadResult(
|
| - DriveApiErrorCode response_code,
|
| - int64 content_length,
|
| - const google_apis::FileResourceCallback& callback,
|
| - const google_apis::ProgressCallback& progress_callback) {
|
| - // Callback progress
|
| - if (!progress_callback.is_null()) {
|
| - // For the testing purpose, it always notifies the progress at the end of
|
| - // whole file uploading.
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(progress_callback, content_length, content_length));
|
| - }
|
| -
|
| - // MultipartUploadXXXFile is an asynchronous function, so don't callback
|
| - // directly.
|
| - scoped_ptr<FileResource> entry;
|
| - entry.reset(new FileResource);
|
| - entry->set_md5_checksum(kTestDummyMd5);
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(callback, response_code, base::Passed(&entry)));
|
| - return CancelCallback();
|
| -}
|
| -
|
| -// Mock DriveService that verifies if the uploaded content matches the preset
|
| -// expectation.
|
| -class MockDriveServiceWithUploadExpectation : public DummyDriveService {
|
| - public:
|
| - // Sets up an expected upload content. InitiateUpload and ResumeUpload will
|
| - // verify that the specified data is correctly uploaded.
|
| - MockDriveServiceWithUploadExpectation(
|
| - const base::FilePath& expected_upload_file,
|
| - int64 expected_content_length)
|
| - : expected_upload_file_(expected_upload_file),
|
| - expected_content_length_(expected_content_length),
|
| - received_bytes_(0),
|
| - resume_upload_call_count_(0),
|
| - multipart_upload_call_count_(0) {}
|
| -
|
| - int64 received_bytes() const { return received_bytes_; }
|
| - void set_received_bytes(int64 received_bytes) {
|
| - received_bytes_ = received_bytes;
|
| - }
|
| -
|
| - int64 resume_upload_call_count() const { return resume_upload_call_count_; }
|
| - int64 multipart_upload_call_count() const {
|
| - return multipart_upload_call_count_;
|
| - }
|
| -
|
| - private:
|
| - // DriveServiceInterface overrides.
|
| - // Handles a request for obtaining an upload location URL.
|
| - CancelCallback InitiateUploadNewFile(
|
| - const std::string& content_type,
|
| - int64 content_length,
|
| - const std::string& parent_resource_id,
|
| - const std::string& title,
|
| - const UploadNewFileOptions& options,
|
| - const InitiateUploadCallback& callback) override {
|
| - EXPECT_EQ(kTestDocumentTitle, title);
|
| - EXPECT_EQ(kTestMimeType, content_type);
|
| - EXPECT_EQ(expected_content_length_, content_length);
|
| - EXPECT_EQ(kTestInitiateUploadParentResourceId, parent_resource_id);
|
| -
|
| - // Calls back the upload URL for subsequent ResumeUpload requests.
|
| - // InitiateUpload is an asynchronous function, so don't callback directly.
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
|
| - base::Bind(callback, HTTP_SUCCESS, GURL(kTestUploadNewFileURL)));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - CancelCallback InitiateUploadExistingFile(
|
| - const std::string& content_type,
|
| - int64 content_length,
|
| - const std::string& resource_id,
|
| - const UploadExistingFileOptions& options,
|
| - const InitiateUploadCallback& callback) override {
|
| - EXPECT_EQ(kTestMimeType, content_type);
|
| - EXPECT_EQ(expected_content_length_, content_length);
|
| - EXPECT_EQ(kTestInitiateUploadResourceId, resource_id);
|
| -
|
| - if (!options.etag.empty() && options.etag != kTestETag) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
|
| - base::Bind(callback, HTTP_PRECONDITION, GURL()));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - // Calls back the upload URL for subsequent ResumeUpload requests.
|
| - // InitiateUpload is an asynchronous function, so don't callback directly.
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
|
| - base::Bind(callback, HTTP_SUCCESS, GURL(kTestUploadExistingFileURL)));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - // Handles a request for uploading a chunk of bytes.
|
| - CancelCallback ResumeUpload(
|
| - const GURL& upload_location,
|
| - int64 start_position,
|
| - int64 end_position,
|
| - int64 content_length,
|
| - const std::string& content_type,
|
| - const base::FilePath& local_file_path,
|
| - const UploadRangeCallback& callback,
|
| - const ProgressCallback& progress_callback) override {
|
| - // The upload range should start from the current first unreceived byte.
|
| - EXPECT_EQ(received_bytes_, start_position);
|
| - EXPECT_EQ(expected_upload_file_, local_file_path);
|
| -
|
| - // The upload data must be split into 512KB chunks.
|
| - const int64 expected_chunk_end =
|
| - std::min(received_bytes_ + kUploadChunkSize, expected_content_length_);
|
| - EXPECT_EQ(expected_chunk_end, end_position);
|
| -
|
| - // The upload URL returned by InitiateUpload() must be used.
|
| - EXPECT_TRUE(GURL(kTestUploadNewFileURL) == upload_location ||
|
| - GURL(kTestUploadExistingFileURL) == upload_location);
|
| -
|
| - // Other parameters should be the exact values passed to DriveUploader.
|
| - EXPECT_EQ(expected_content_length_, content_length);
|
| - EXPECT_EQ(kTestMimeType, content_type);
|
| -
|
| - // Update the internal status of the current upload session.
|
| - resume_upload_call_count_++;
|
| - received_bytes_ = end_position;
|
| -
|
| - // Callback progress
|
| - if (!progress_callback.is_null()) {
|
| - // For the testing purpose, it always notifies the progress at the end of
|
| - // each chunk uploading.
|
| - int64 chunk_size = end_position - start_position;
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
|
| - base::Bind(progress_callback, chunk_size, chunk_size));
|
| - }
|
| -
|
| - SendUploadRangeResponse(upload_location, callback);
|
| - return CancelCallback();
|
| - }
|
| -
|
| - // Handles a request to fetch the current upload status.
|
| - CancelCallback GetUploadStatus(const GURL& upload_location,
|
| - int64 content_length,
|
| - const UploadRangeCallback& callback) override {
|
| - EXPECT_EQ(expected_content_length_, content_length);
|
| - // The upload URL returned by InitiateUpload() must be used.
|
| - EXPECT_TRUE(GURL(kTestUploadNewFileURL) == upload_location ||
|
| - GURL(kTestUploadExistingFileURL) == upload_location);
|
| -
|
| - SendUploadRangeResponse(upload_location, callback);
|
| - return CancelCallback();
|
| - }
|
| -
|
| - // Runs |callback| with the current upload status.
|
| - void SendUploadRangeResponse(const GURL& upload_location,
|
| - const UploadRangeCallback& callback) {
|
| - // Callback with response.
|
| - UploadRangeResponse response;
|
| - scoped_ptr<FileResource> entry;
|
| - if (received_bytes_ == expected_content_length_) {
|
| - DriveApiErrorCode response_code =
|
| - upload_location == GURL(kTestUploadNewFileURL) ?
|
| - HTTP_CREATED : HTTP_SUCCESS;
|
| - response = UploadRangeResponse(response_code, -1, -1);
|
| -
|
| - entry.reset(new FileResource);
|
| - entry->set_md5_checksum(kTestDummyMd5);
|
| - } else {
|
| - response = UploadRangeResponse(
|
| - HTTP_RESUME_INCOMPLETE, 0, received_bytes_);
|
| - }
|
| - // ResumeUpload is an asynchronous function, so don't callback directly.
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
|
| - base::Bind(callback, response, base::Passed(&entry)));
|
| - }
|
| -
|
| - CancelCallback MultipartUploadNewFile(
|
| - const std::string& content_type,
|
| - int64 content_length,
|
| - const std::string& parent_resource_id,
|
| - const std::string& title,
|
| - const base::FilePath& local_file_path,
|
| - const UploadNewFileOptions& options,
|
| - const google_apis::FileResourceCallback& callback,
|
| - const google_apis::ProgressCallback& progress_callback) override {
|
| - EXPECT_EQ(kTestMimeType, content_type);
|
| - EXPECT_EQ(expected_content_length_, content_length);
|
| - EXPECT_EQ(kTestInitiateUploadParentResourceId, parent_resource_id);
|
| - EXPECT_EQ(kTestDocumentTitle, title);
|
| - EXPECT_EQ(expected_upload_file_, local_file_path);
|
| -
|
| - received_bytes_ = content_length;
|
| - multipart_upload_call_count_++;
|
| - return SendMultipartUploadResult(HTTP_CREATED, content_length, callback,
|
| - progress_callback);
|
| - }
|
| -
|
| - CancelCallback MultipartUploadExistingFile(
|
| - const std::string& content_type,
|
| - int64 content_length,
|
| - const std::string& resource_id,
|
| - const base::FilePath& local_file_path,
|
| - const UploadExistingFileOptions& options,
|
| - const google_apis::FileResourceCallback& callback,
|
| - const google_apis::ProgressCallback& progress_callback) override {
|
| - EXPECT_EQ(kTestMimeType, content_type);
|
| - EXPECT_EQ(expected_content_length_, content_length);
|
| - EXPECT_EQ(kTestInitiateUploadResourceId, resource_id);
|
| - EXPECT_EQ(expected_upload_file_, local_file_path);
|
| -
|
| - if (!options.etag.empty() && options.etag != kTestETag) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, HTTP_PRECONDITION,
|
| - base::Passed(make_scoped_ptr<FileResource>(NULL))));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - received_bytes_ = content_length;
|
| - multipart_upload_call_count_++;
|
| - return SendMultipartUploadResult(HTTP_SUCCESS, content_length, callback,
|
| - progress_callback);
|
| - }
|
| -
|
| - const base::FilePath expected_upload_file_;
|
| - const int64 expected_content_length_;
|
| - int64 received_bytes_;
|
| - int64 resume_upload_call_count_;
|
| - int64 multipart_upload_call_count_;
|
| -};
|
| -
|
| -// Mock DriveService that returns a failure at InitiateUpload().
|
| -class MockDriveServiceNoConnectionAtInitiate : public DummyDriveService {
|
| - // Returns error.
|
| - CancelCallback InitiateUploadNewFile(
|
| - const std::string& content_type,
|
| - int64 content_length,
|
| - const std::string& parent_resource_id,
|
| - const std::string& title,
|
| - const UploadNewFileOptions& options,
|
| - const InitiateUploadCallback& callback) override {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
|
| - base::Bind(callback, DRIVE_NO_CONNECTION, GURL()));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - CancelCallback InitiateUploadExistingFile(
|
| - const std::string& content_type,
|
| - int64 content_length,
|
| - const std::string& resource_id,
|
| - const UploadExistingFileOptions& options,
|
| - const InitiateUploadCallback& callback) override {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
|
| - base::Bind(callback, DRIVE_NO_CONNECTION, GURL()));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - // Should not be used.
|
| - CancelCallback ResumeUpload(
|
| - const GURL& upload_url,
|
| - int64 start_position,
|
| - int64 end_position,
|
| - int64 content_length,
|
| - const std::string& content_type,
|
| - const base::FilePath& local_file_path,
|
| - const UploadRangeCallback& callback,
|
| - const ProgressCallback& progress_callback) override {
|
| - NOTREACHED();
|
| - return CancelCallback();
|
| - }
|
| -
|
| - CancelCallback MultipartUploadNewFile(
|
| - const std::string& content_type,
|
| - int64 content_length,
|
| - const std::string& parent_resource_id,
|
| - const std::string& title,
|
| - const base::FilePath& local_file_path,
|
| - const UploadNewFileOptions& options,
|
| - const google_apis::FileResourceCallback& callback,
|
| - const google_apis::ProgressCallback& progress_callback) override {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, DRIVE_NO_CONNECTION,
|
| - base::Passed(make_scoped_ptr<FileResource>(NULL))));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - CancelCallback MultipartUploadExistingFile(
|
| - const std::string& content_type,
|
| - int64 content_length,
|
| - const std::string& resource_id,
|
| - const base::FilePath& local_file_path,
|
| - const UploadExistingFileOptions& options,
|
| - const google_apis::FileResourceCallback& callback,
|
| - const google_apis::ProgressCallback& progress_callback) override {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, DRIVE_NO_CONNECTION,
|
| - base::Passed(make_scoped_ptr<FileResource>(NULL))));
|
| - return CancelCallback();
|
| - }
|
| -};
|
| -
|
| -// Mock DriveService that returns a failure at ResumeUpload().
|
| -class MockDriveServiceNoConnectionAtResume : public DummyDriveService {
|
| - // Succeeds and returns an upload location URL.
|
| - CancelCallback InitiateUploadNewFile(
|
| - const std::string& content_type,
|
| - int64 content_length,
|
| - const std::string& parent_resource_id,
|
| - const std::string& title,
|
| - const UploadNewFileOptions& options,
|
| - const InitiateUploadCallback& callback) override {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
|
| - base::Bind(callback, HTTP_SUCCESS, GURL(kTestUploadNewFileURL)));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - CancelCallback InitiateUploadExistingFile(
|
| - const std::string& content_type,
|
| - int64 content_length,
|
| - const std::string& resource_id,
|
| - const UploadExistingFileOptions& options,
|
| - const InitiateUploadCallback& callback) override {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
|
| - base::Bind(callback, HTTP_SUCCESS, GURL(kTestUploadExistingFileURL)));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - // Returns error.
|
| - CancelCallback ResumeUpload(
|
| - const GURL& upload_url,
|
| - int64 start_position,
|
| - int64 end_position,
|
| - int64 content_length,
|
| - const std::string& content_type,
|
| - const base::FilePath& local_file_path,
|
| - const UploadRangeCallback& callback,
|
| - const ProgressCallback& progress_callback) override {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
|
| - base::Bind(callback,
|
| - UploadRangeResponse(DRIVE_NO_CONNECTION, -1, -1),
|
| - base::Passed(scoped_ptr<FileResource>())));
|
| - return CancelCallback();
|
| - }
|
| -};
|
| -
|
| -// Mock DriveService that returns a failure at GetUploadStatus().
|
| -class MockDriveServiceNoConnectionAtGetUploadStatus : public DummyDriveService {
|
| - // Returns error.
|
| - CancelCallback GetUploadStatus(const GURL& upload_url,
|
| - int64 content_length,
|
| - const UploadRangeCallback& callback) override {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
|
| - base::Bind(callback,
|
| - UploadRangeResponse(DRIVE_NO_CONNECTION, -1, -1),
|
| - base::Passed(scoped_ptr<FileResource>())));
|
| - return CancelCallback();
|
| - }
|
| -};
|
| -
|
| -class DriveUploaderTest : public testing::Test {
|
| - public:
|
| - void SetUp() override { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); }
|
| -
|
| - protected:
|
| - base::MessageLoop message_loop_;
|
| - base::ScopedTempDir temp_dir_;
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -TEST_F(DriveUploaderTest, UploadExisting0KB) {
|
| - base::FilePath local_path;
|
| - std::string data;
|
| - ASSERT_TRUE(test_util::CreateFileOfSpecifiedSize(
|
| - temp_dir_.path(), 0, &local_path, &data));
|
| -
|
| - DriveApiErrorCode error = DRIVE_OTHER_ERROR;
|
| - GURL upload_location;
|
| - scoped_ptr<FileResource> entry;
|
| -
|
| - MockDriveServiceWithUploadExpectation mock_service(local_path, data.size());
|
| - DriveUploader uploader(&mock_service,
|
| - base::ThreadTaskRunnerHandle::Get().get());
|
| - std::vector<test_util::ProgressInfo> upload_progress_values;
|
| - uploader.UploadExistingFile(
|
| - kTestInitiateUploadResourceId, local_path, kTestMimeType,
|
| - UploadExistingFileOptions(),
|
| - test_util::CreateCopyResultCallback(&error, &upload_location, &entry),
|
| - base::Bind(&test_util::AppendProgressCallbackResult,
|
| - &upload_progress_values));
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - EXPECT_EQ(0, mock_service.resume_upload_call_count());
|
| - EXPECT_EQ(1, mock_service.multipart_upload_call_count());
|
| - EXPECT_EQ(0, mock_service.received_bytes());
|
| - EXPECT_EQ(HTTP_SUCCESS, error);
|
| - EXPECT_TRUE(upload_location.is_empty());
|
| - ASSERT_TRUE(entry);
|
| - EXPECT_EQ(kTestDummyMd5, entry->md5_checksum());
|
| - ASSERT_EQ(1U, upload_progress_values.size());
|
| - EXPECT_EQ(test_util::ProgressInfo(0, 0), upload_progress_values[0]);
|
| -}
|
| -
|
| -TEST_F(DriveUploaderTest, UploadExisting512KB) {
|
| - base::FilePath local_path;
|
| - std::string data;
|
| - ASSERT_TRUE(test_util::CreateFileOfSpecifiedSize(
|
| - temp_dir_.path(), 512 * 1024, &local_path, &data));
|
| -
|
| - DriveApiErrorCode error = DRIVE_OTHER_ERROR;
|
| - GURL upload_location;
|
| - scoped_ptr<FileResource> entry;
|
| -
|
| - MockDriveServiceWithUploadExpectation mock_service(local_path, data.size());
|
| - DriveUploader uploader(&mock_service,
|
| - base::ThreadTaskRunnerHandle::Get().get());
|
| - std::vector<test_util::ProgressInfo> upload_progress_values;
|
| - uploader.UploadExistingFile(
|
| - kTestInitiateUploadResourceId, local_path, kTestMimeType,
|
| - UploadExistingFileOptions(),
|
| - test_util::CreateCopyResultCallback(&error, &upload_location, &entry),
|
| - base::Bind(&test_util::AppendProgressCallbackResult,
|
| - &upload_progress_values));
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - // 512KB upload should be uploaded as multipart body.
|
| - EXPECT_EQ(0, mock_service.resume_upload_call_count());
|
| - EXPECT_EQ(1, mock_service.multipart_upload_call_count());
|
| - EXPECT_EQ(512 * 1024, mock_service.received_bytes());
|
| - EXPECT_EQ(HTTP_SUCCESS, error);
|
| - EXPECT_TRUE(upload_location.is_empty());
|
| - ASSERT_TRUE(entry);
|
| - EXPECT_EQ(kTestDummyMd5, entry->md5_checksum());
|
| - ASSERT_EQ(1U, upload_progress_values.size());
|
| - EXPECT_EQ(test_util::ProgressInfo(512 * 1024, 512 * 1024),
|
| - upload_progress_values[0]);
|
| -}
|
| -
|
| -TEST_F(DriveUploaderTest, UploadExisting2MB) {
|
| - base::FilePath local_path;
|
| - std::string data;
|
| - ASSERT_TRUE(test_util::CreateFileOfSpecifiedSize(
|
| - temp_dir_.path(), 2 * 1024 * 1024, &local_path, &data));
|
| -
|
| - DriveApiErrorCode error = DRIVE_OTHER_ERROR;
|
| - GURL upload_location;
|
| - scoped_ptr<FileResource> entry;
|
| -
|
| - MockDriveServiceWithUploadExpectation mock_service(local_path, data.size());
|
| - DriveUploader uploader(&mock_service,
|
| - base::ThreadTaskRunnerHandle::Get().get());
|
| - std::vector<test_util::ProgressInfo> upload_progress_values;
|
| - uploader.UploadExistingFile(
|
| - kTestInitiateUploadResourceId, local_path, kTestMimeType,
|
| - UploadExistingFileOptions(),
|
| - test_util::CreateCopyResultCallback(&error, &upload_location, &entry),
|
| - base::Bind(&test_util::AppendProgressCallbackResult,
|
| - &upload_progress_values));
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - // 2MB upload should not be split into multiple chunks.
|
| - EXPECT_EQ(1, mock_service.resume_upload_call_count());
|
| - EXPECT_EQ(0, mock_service.multipart_upload_call_count());
|
| - EXPECT_EQ(2 * 1024 * 1024, mock_service.received_bytes());
|
| - EXPECT_EQ(HTTP_SUCCESS, error);
|
| - EXPECT_TRUE(upload_location.is_empty());
|
| - ASSERT_TRUE(entry);
|
| - EXPECT_EQ(kTestDummyMd5, entry->md5_checksum());
|
| - ASSERT_EQ(1U, upload_progress_values.size());
|
| - EXPECT_EQ(test_util::ProgressInfo(2 * 1024 * 1024, 2 * 1024 * 1024),
|
| - upload_progress_values[0]);
|
| -}
|
| -
|
| -TEST_F(DriveUploaderTest, InitiateUploadFail) {
|
| - base::FilePath local_path;
|
| - std::string data;
|
| - ASSERT_TRUE(test_util::CreateFileOfSpecifiedSize(
|
| - temp_dir_.path(), 2 * 1024 * 1024, &local_path, &data));
|
| -
|
| - DriveApiErrorCode error = HTTP_SUCCESS;
|
| - GURL upload_location;
|
| - scoped_ptr<FileResource> entry;
|
| -
|
| - MockDriveServiceNoConnectionAtInitiate mock_service;
|
| - DriveUploader uploader(&mock_service,
|
| - base::ThreadTaskRunnerHandle::Get().get());
|
| - uploader.UploadExistingFile(
|
| - kTestInitiateUploadResourceId, local_path, kTestMimeType,
|
| - UploadExistingFileOptions(),
|
| - test_util::CreateCopyResultCallback(&error, &upload_location, &entry),
|
| - google_apis::ProgressCallback());
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - EXPECT_EQ(DRIVE_NO_CONNECTION, error);
|
| - EXPECT_TRUE(upload_location.is_empty());
|
| - EXPECT_FALSE(entry);
|
| -}
|
| -
|
| -TEST_F(DriveUploaderTest, MultipartUploadFail) {
|
| - base::FilePath local_path;
|
| - std::string data;
|
| - ASSERT_TRUE(test_util::CreateFileOfSpecifiedSize(temp_dir_.path(), 512 * 1024,
|
| - &local_path, &data));
|
| -
|
| - DriveApiErrorCode error = HTTP_SUCCESS;
|
| - GURL upload_location;
|
| - scoped_ptr<FileResource> entry;
|
| -
|
| - MockDriveServiceNoConnectionAtInitiate mock_service;
|
| - DriveUploader uploader(&mock_service,
|
| - base::ThreadTaskRunnerHandle::Get().get());
|
| - uploader.UploadExistingFile(
|
| - kTestInitiateUploadResourceId, local_path, kTestMimeType,
|
| - UploadExistingFileOptions(),
|
| - test_util::CreateCopyResultCallback(&error, &upload_location, &entry),
|
| - google_apis::ProgressCallback());
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - EXPECT_EQ(DRIVE_NO_CONNECTION, error);
|
| - EXPECT_TRUE(upload_location.is_empty());
|
| - EXPECT_FALSE(entry);
|
| -}
|
| -
|
| -TEST_F(DriveUploaderTest, InitiateUploadNoConflict) {
|
| - base::FilePath local_path;
|
| - std::string data;
|
| - ASSERT_TRUE(test_util::CreateFileOfSpecifiedSize(
|
| - temp_dir_.path(), 512 * 1024, &local_path, &data));
|
| -
|
| - DriveApiErrorCode error = DRIVE_OTHER_ERROR;
|
| - GURL upload_location;
|
| - scoped_ptr<FileResource> entry;
|
| -
|
| - MockDriveServiceWithUploadExpectation mock_service(local_path, data.size());
|
| - DriveUploader uploader(&mock_service,
|
| - base::ThreadTaskRunnerHandle::Get().get());
|
| - UploadExistingFileOptions options;
|
| - options.etag = kTestETag;
|
| - uploader.UploadExistingFile(kTestInitiateUploadResourceId,
|
| - local_path,
|
| - kTestMimeType,
|
| - options,
|
| - test_util::CreateCopyResultCallback(
|
| - &error, &upload_location, &entry),
|
| - google_apis::ProgressCallback());
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - EXPECT_EQ(HTTP_SUCCESS, error);
|
| - EXPECT_TRUE(upload_location.is_empty());
|
| -}
|
| -
|
| -TEST_F(DriveUploaderTest, MultipartUploadConflict) {
|
| - base::FilePath local_path;
|
| - std::string data;
|
| - ASSERT_TRUE(test_util::CreateFileOfSpecifiedSize(
|
| - temp_dir_.path(), 512 * 1024, &local_path, &data));
|
| - const std::string kDestinationETag("destination_etag");
|
| -
|
| - DriveApiErrorCode error = DRIVE_OTHER_ERROR;
|
| - GURL upload_location;
|
| - scoped_ptr<FileResource> entry;
|
| -
|
| - MockDriveServiceWithUploadExpectation mock_service(local_path, data.size());
|
| - DriveUploader uploader(&mock_service,
|
| - base::ThreadTaskRunnerHandle::Get().get());
|
| - UploadExistingFileOptions options;
|
| - options.etag = kDestinationETag;
|
| - uploader.UploadExistingFile(kTestInitiateUploadResourceId,
|
| - local_path,
|
| - kTestMimeType,
|
| - options,
|
| - test_util::CreateCopyResultCallback(
|
| - &error, &upload_location, &entry),
|
| - google_apis::ProgressCallback());
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - EXPECT_EQ(HTTP_CONFLICT, error);
|
| - EXPECT_TRUE(upload_location.is_empty());
|
| -}
|
| -
|
| -TEST_F(DriveUploaderTest, InitiateUploadConflict) {
|
| - base::FilePath local_path;
|
| - std::string data;
|
| - ASSERT_TRUE(test_util::CreateFileOfSpecifiedSize(
|
| - temp_dir_.path(), 2 * 1024 * 1024, &local_path, &data));
|
| - const std::string kDestinationETag("destination_etag");
|
| -
|
| - DriveApiErrorCode error = DRIVE_OTHER_ERROR;
|
| - GURL upload_location;
|
| - scoped_ptr<FileResource> entry;
|
| -
|
| - MockDriveServiceWithUploadExpectation mock_service(local_path, data.size());
|
| - DriveUploader uploader(&mock_service,
|
| - base::ThreadTaskRunnerHandle::Get().get());
|
| - UploadExistingFileOptions options;
|
| - options.etag = kDestinationETag;
|
| - uploader.UploadExistingFile(
|
| - kTestInitiateUploadResourceId, local_path, kTestMimeType, options,
|
| - test_util::CreateCopyResultCallback(&error, &upload_location, &entry),
|
| - google_apis::ProgressCallback());
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - EXPECT_EQ(HTTP_CONFLICT, error);
|
| - EXPECT_TRUE(upload_location.is_empty());
|
| -}
|
| -
|
| -TEST_F(DriveUploaderTest, ResumeUploadFail) {
|
| - base::FilePath local_path;
|
| - std::string data;
|
| - ASSERT_TRUE(test_util::CreateFileOfSpecifiedSize(
|
| - temp_dir_.path(), 2 * 1024 * 1024, &local_path, &data));
|
| -
|
| - DriveApiErrorCode error = HTTP_SUCCESS;
|
| - GURL upload_location;
|
| - scoped_ptr<FileResource> entry;
|
| -
|
| - MockDriveServiceNoConnectionAtResume mock_service;
|
| - DriveUploader uploader(&mock_service,
|
| - base::ThreadTaskRunnerHandle::Get().get());
|
| - uploader.UploadExistingFile(
|
| - kTestInitiateUploadResourceId, local_path, kTestMimeType,
|
| - UploadExistingFileOptions(),
|
| - test_util::CreateCopyResultCallback(&error, &upload_location, &entry),
|
| - google_apis::ProgressCallback());
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - EXPECT_EQ(DRIVE_NO_CONNECTION, error);
|
| - EXPECT_EQ(GURL(kTestUploadExistingFileURL), upload_location);
|
| -}
|
| -
|
| -TEST_F(DriveUploaderTest, GetUploadStatusFail) {
|
| - base::FilePath local_path;
|
| - std::string data;
|
| - ASSERT_TRUE(test_util::CreateFileOfSpecifiedSize(
|
| - temp_dir_.path(), 2 * 1024 * 1024, &local_path, &data));
|
| -
|
| - DriveApiErrorCode error = HTTP_SUCCESS;
|
| - GURL upload_location;
|
| - scoped_ptr<FileResource> entry;
|
| -
|
| - MockDriveServiceNoConnectionAtGetUploadStatus mock_service;
|
| - DriveUploader uploader(&mock_service,
|
| - base::ThreadTaskRunnerHandle::Get().get());
|
| - uploader.ResumeUploadFile(GURL(kTestUploadExistingFileURL),
|
| - local_path,
|
| - kTestMimeType,
|
| - test_util::CreateCopyResultCallback(
|
| - &error, &upload_location, &entry),
|
| - google_apis::ProgressCallback());
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - EXPECT_EQ(DRIVE_NO_CONNECTION, error);
|
| - EXPECT_TRUE(upload_location.is_empty());
|
| -}
|
| -
|
| -TEST_F(DriveUploaderTest, NonExistingSourceFile) {
|
| - DriveApiErrorCode error = DRIVE_OTHER_ERROR;
|
| - GURL upload_location;
|
| - scoped_ptr<FileResource> entry;
|
| -
|
| - DriveUploader uploader(NULL, // NULL, the service won't be used.
|
| - base::ThreadTaskRunnerHandle::Get().get());
|
| - uploader.UploadExistingFile(
|
| - kTestInitiateUploadResourceId,
|
| - temp_dir_.path().AppendASCII("_this_path_should_not_exist_"),
|
| - kTestMimeType, UploadExistingFileOptions(),
|
| - test_util::CreateCopyResultCallback(&error, &upload_location, &entry),
|
| - google_apis::ProgressCallback());
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - // Should return failure without doing any attempt to connect to the server.
|
| - EXPECT_EQ(HTTP_NOT_FOUND, error);
|
| - EXPECT_TRUE(upload_location.is_empty());
|
| -}
|
| -
|
| -TEST_F(DriveUploaderTest, ResumeUpload) {
|
| - base::FilePath local_path;
|
| - std::string data;
|
| - ASSERT_TRUE(test_util::CreateFileOfSpecifiedSize(
|
| - temp_dir_.path(), 1024 * 1024, &local_path, &data));
|
| -
|
| - DriveApiErrorCode error = DRIVE_OTHER_ERROR;
|
| - GURL upload_location;
|
| - scoped_ptr<FileResource> entry;
|
| -
|
| - MockDriveServiceWithUploadExpectation mock_service(local_path, data.size());
|
| - DriveUploader uploader(&mock_service,
|
| - base::ThreadTaskRunnerHandle::Get().get());
|
| - // Emulate the situation that the only first part is successfully uploaded,
|
| - // but not the latter half.
|
| - mock_service.set_received_bytes(512 * 1024);
|
| -
|
| - std::vector<test_util::ProgressInfo> upload_progress_values;
|
| - uploader.ResumeUploadFile(
|
| - GURL(kTestUploadExistingFileURL),
|
| - local_path,
|
| - kTestMimeType,
|
| - test_util::CreateCopyResultCallback(
|
| - &error, &upload_location, &entry),
|
| - base::Bind(&test_util::AppendProgressCallbackResult,
|
| - &upload_progress_values));
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - EXPECT_EQ(1, mock_service.resume_upload_call_count());
|
| - EXPECT_EQ(1024 * 1024, mock_service.received_bytes());
|
| - EXPECT_EQ(HTTP_SUCCESS, error);
|
| - EXPECT_TRUE(upload_location.is_empty());
|
| - ASSERT_TRUE(entry);
|
| - EXPECT_EQ(kTestDummyMd5, entry->md5_checksum());
|
| - ASSERT_EQ(1U, upload_progress_values.size());
|
| - EXPECT_EQ(test_util::ProgressInfo(1024 * 1024, 1024 * 1024),
|
| - upload_progress_values[0]);
|
| -}
|
| -
|
| -class MockDriveServiceForBatchProcessing : public DummyDriveService {
|
| - public:
|
| - struct UploadFileInfo {
|
| - enum { NEW_FILE, EXISTING_FILE } type;
|
| - std::string content_type;
|
| - uint64 content_length;
|
| - std::string parent_resource_id;
|
| - std::string resource_id;
|
| - std::string title;
|
| - base::FilePath local_file_path;
|
| - google_apis::FileResourceCallback callback;
|
| - google_apis::ProgressCallback progress_callback;
|
| - };
|
| -
|
| - class BatchRequestConfigurator : public BatchRequestConfiguratorInterface {
|
| - public:
|
| - explicit BatchRequestConfigurator(
|
| - MockDriveServiceForBatchProcessing* service)
|
| - : service(service) {}
|
| -
|
| - CancelCallback MultipartUploadNewFile(
|
| - const std::string& content_type,
|
| - int64 content_length,
|
| - const std::string& parent_resource_id,
|
| - const std::string& title,
|
| - const base::FilePath& local_file_path,
|
| - const UploadNewFileOptions& options,
|
| - const google_apis::FileResourceCallback& callback,
|
| - const google_apis::ProgressCallback& progress_callback) override {
|
| - UploadFileInfo info;
|
| - info.type = UploadFileInfo::NEW_FILE;
|
| - info.content_type = content_type;
|
| - info.content_length = content_length;
|
| - info.parent_resource_id = parent_resource_id;
|
| - info.title = title;
|
| - info.local_file_path = local_file_path;
|
| - info.callback = callback;
|
| - info.progress_callback = progress_callback;
|
| - service->files.push_back(info);
|
| - return CancelCallback();
|
| - }
|
| -
|
| - CancelCallback MultipartUploadExistingFile(
|
| - const std::string& content_type,
|
| - int64 content_length,
|
| - const std::string& resource_id,
|
| - const base::FilePath& local_file_path,
|
| - const UploadExistingFileOptions& options,
|
| - const google_apis::FileResourceCallback& callback,
|
| - const google_apis::ProgressCallback& progress_callback) override {
|
| - UploadFileInfo info;
|
| - info.type = UploadFileInfo::EXISTING_FILE;
|
| - info.content_type = content_type;
|
| - info.content_length = content_length;
|
| - info.resource_id = resource_id;
|
| - info.local_file_path = local_file_path;
|
| - info.callback = callback;
|
| - info.progress_callback = progress_callback;
|
| - service->files.push_back(info);
|
| - return CancelCallback();
|
| - }
|
| -
|
| - void Commit() override {
|
| - ASSERT_FALSE(service->committed);
|
| - service->committed = true;
|
| - for (const auto& file : service->files) {
|
| - SendMultipartUploadResult(HTTP_SUCCESS, file.content_length,
|
| - file.callback, file.progress_callback);
|
| - }
|
| - }
|
| -
|
| - private:
|
| - MockDriveServiceForBatchProcessing* service;
|
| - };
|
| -
|
| - public:
|
| - scoped_ptr<BatchRequestConfiguratorInterface> StartBatchRequest() override {
|
| - committed = false;
|
| - return scoped_ptr<BatchRequestConfiguratorInterface>(
|
| - new BatchRequestConfigurator(this));
|
| - }
|
| -
|
| - std::vector<UploadFileInfo> files;
|
| - bool committed;
|
| -};
|
| -
|
| -TEST_F(DriveUploaderTest, BatchProcessing) {
|
| - // Preapre test file.
|
| - const size_t kTestFileSize = 1024 * 512;
|
| - base::FilePath local_path;
|
| - std::string data;
|
| - ASSERT_TRUE(test_util::CreateFileOfSpecifiedSize(
|
| - temp_dir_.path(), kTestFileSize, &local_path, &data));
|
| -
|
| - // Prepare test target.
|
| - MockDriveServiceForBatchProcessing service;
|
| - DriveUploader uploader(&service, base::ThreadTaskRunnerHandle::Get().get());
|
| -
|
| - struct {
|
| - DriveApiErrorCode error;
|
| - GURL resume_url;
|
| - scoped_ptr<FileResource> file;
|
| - UploadCompletionCallback callback() {
|
| - return test_util::CreateCopyResultCallback(&error, &resume_url, &file);
|
| - }
|
| - } results[2];
|
| -
|
| - uploader.StartBatchProcessing();
|
| - uploader.UploadNewFile("parent_resource_id", local_path, "title",
|
| - kTestMimeType, UploadNewFileOptions(),
|
| - results[0].callback(),
|
| - google_apis::ProgressCallback());
|
| - uploader.UploadExistingFile(
|
| - "resource_id", local_path, kTestMimeType, UploadExistingFileOptions(),
|
| - results[1].callback(), google_apis::ProgressCallback());
|
| - uploader.StopBatchProcessing();
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - ASSERT_EQ(2u, service.files.size());
|
| - EXPECT_TRUE(service.committed);
|
| -
|
| - EXPECT_EQ(MockDriveServiceForBatchProcessing::UploadFileInfo::NEW_FILE,
|
| - service.files[0].type);
|
| - EXPECT_EQ(kTestMimeType, service.files[0].content_type);
|
| - EXPECT_EQ(kTestFileSize, service.files[0].content_length);
|
| - EXPECT_EQ("parent_resource_id", service.files[0].parent_resource_id);
|
| - EXPECT_EQ("", service.files[0].resource_id);
|
| - EXPECT_EQ("title", service.files[0].title);
|
| - EXPECT_EQ(local_path.value(), service.files[0].local_file_path.value());
|
| -
|
| - EXPECT_EQ(MockDriveServiceForBatchProcessing::UploadFileInfo::EXISTING_FILE,
|
| - service.files[1].type);
|
| - EXPECT_EQ(kTestMimeType, service.files[1].content_type);
|
| - EXPECT_EQ(kTestFileSize, service.files[1].content_length);
|
| - EXPECT_EQ("", service.files[1].parent_resource_id);
|
| - EXPECT_EQ("resource_id", service.files[1].resource_id);
|
| - EXPECT_EQ("", service.files[1].title);
|
| - EXPECT_EQ(local_path.value(), service.files[1].local_file_path.value());
|
| -
|
| - EXPECT_EQ(HTTP_SUCCESS, results[0].error);
|
| - EXPECT_TRUE(results[0].resume_url.is_empty());
|
| - EXPECT_TRUE(results[0].file);
|
| -
|
| - EXPECT_EQ(HTTP_SUCCESS, results[1].error);
|
| - EXPECT_TRUE(results[1].resume_url.is_empty());
|
| - EXPECT_TRUE(results[1].file);
|
| -}
|
| -
|
| -TEST_F(DriveUploaderTest, BatchProcessingWithError) {
|
| - // Prepare test target.
|
| - MockDriveServiceForBatchProcessing service;
|
| - DriveUploader uploader(&service, base::ThreadTaskRunnerHandle::Get().get());
|
| -
|
| - struct {
|
| - DriveApiErrorCode error;
|
| - GURL resume_url;
|
| - scoped_ptr<FileResource> file;
|
| - UploadCompletionCallback callback() {
|
| - return test_util::CreateCopyResultCallback(&error, &resume_url, &file);
|
| - }
|
| - } results[2];
|
| -
|
| - uploader.StartBatchProcessing();
|
| - uploader.UploadNewFile("parent_resource_id",
|
| - base::FilePath(FILE_PATH_LITERAL("/path/non_exists")),
|
| - "title", kTestMimeType, UploadNewFileOptions(),
|
| - results[0].callback(),
|
| - google_apis::ProgressCallback());
|
| - uploader.UploadExistingFile(
|
| - "resource_id", base::FilePath(FILE_PATH_LITERAL("/path/non_exists")),
|
| - kTestMimeType, UploadExistingFileOptions(), results[1].callback(),
|
| - google_apis::ProgressCallback());
|
| - uploader.StopBatchProcessing();
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - EXPECT_EQ(0u, service.files.size());
|
| - EXPECT_TRUE(service.committed);
|
| -
|
| - EXPECT_EQ(HTTP_NOT_FOUND, results[0].error);
|
| - EXPECT_TRUE(results[0].resume_url.is_empty());
|
| - EXPECT_FALSE(results[0].file);
|
| -
|
| - EXPECT_EQ(HTTP_NOT_FOUND, results[1].error);
|
| - EXPECT_TRUE(results[1].resume_url.is_empty());
|
| - EXPECT_FALSE(results[1].file);
|
| -}
|
| -} // namespace drive
|
|
|