| Index: chrome/browser/google_apis/gdata_wapi_operations_unittest.cc
|
| diff --git a/chrome/browser/google_apis/gdata_wapi_operations_unittest.cc b/chrome/browser/google_apis/gdata_wapi_operations_unittest.cc
|
| index 8dae695de0824c2c8be839d17a1e65b92e7de507..c1b10094de3edf4b07d25d67dd9e4ea6e3824ac6 100644
|
| --- a/chrome/browser/google_apis/gdata_wapi_operations_unittest.cc
|
| +++ b/chrome/browser/google_apis/gdata_wapi_operations_unittest.cc
|
| @@ -841,6 +841,7 @@ TEST_F(GDataWapiOperationsTest, UploadNewFile) {
|
| kUploadContent.size(), // content_length,
|
| "text/plain", // content_type
|
| buffer,
|
| + 0, // buf_offset
|
| upload_url,
|
| FilePath::FromUTF8Unsafe("drive/newfile.txt"));
|
|
|
| @@ -956,6 +957,7 @@ TEST_F(GDataWapiOperationsTest, UploadNewLargeFile) {
|
| kUploadContent.size(), // content_length,
|
| "text/plain", // content_type
|
| buffer,
|
| + 0, // buf_offset
|
| upload_url,
|
| FilePath::FromUTF8Unsafe("drive/newfile.txt"));
|
|
|
| @@ -1106,6 +1108,7 @@ TEST_F(GDataWapiOperationsTest, UploadNewEmptyFile) {
|
| kUploadContent.size(), // content_length,
|
| "text/plain", // content_type
|
| buffer,
|
| + 0, // buf_offset
|
| upload_url,
|
| FilePath::FromUTF8Unsafe("drive/newfile.txt"));
|
|
|
| @@ -1203,6 +1206,7 @@ TEST_F(GDataWapiOperationsTest, UploadExistingFile) {
|
| kUploadContent.size(), // content_length,
|
| "text/plain", // content_type
|
| buffer,
|
| + 0, // buf_offset
|
| upload_url,
|
| FilePath::FromUTF8Unsafe("drive/existingfile.txt"));
|
|
|
| @@ -1302,6 +1306,7 @@ TEST_F(GDataWapiOperationsTest, UploadExistingFileWithETag) {
|
| kUploadContent.size(), // content_length,
|
| "text/plain", // content_type
|
| buffer,
|
| + 0, // buf_offset
|
| upload_url,
|
| FilePath::FromUTF8Unsafe("drive/existingfile.txt"));
|
|
|
| @@ -1392,4 +1397,171 @@ TEST_F(GDataWapiOperationsTest, UploadExistingFileWithETagConflict) {
|
| EXPECT_EQ(kWrongETag, http_request_.headers["If-Match"]);
|
| }
|
|
|
| +TEST_F(GDataWapiOperationsTest, ResumeUploadOperationBufOffset) {
|
| + const size_t kMaxNumBytes = 2;
|
| + // This is big enough to cause multiple requests of ResumeUploadOperation
|
| + // as we are going to send at most kMaxNumBytes at a time.
|
| + const std::string kUploadContent = "abcdefghi";
|
| + GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| + GURL upload_url;
|
| +
|
| + // 1) Get the upload URL for uploading a new file.
|
| + InitiateUploadParams initiate_params(
|
| + UPLOAD_NEW_FILE,
|
| + "New file",
|
| + "text/plain",
|
| + kUploadContent.size(),
|
| + test_server_.GetURL("/feeds/upload/create-session/default/private/full"),
|
| + FilePath::FromUTF8Unsafe("drive/newfile.txt"),
|
| + "" /* etag */);
|
| +
|
| + InitiateUploadOperation* initiate_operation = new InitiateUploadOperation(
|
| + &operation_registry_,
|
| + request_context_getter_.get(),
|
| + base::Bind(&CopyResultFromInitiateUploadCallbackAndQuit,
|
| + &result_code,
|
| + &upload_url),
|
| + initiate_params);
|
| +
|
| + initiate_operation->Start(
|
| + kTestGDataAuthToken, kTestUserAgent,
|
| + base::Bind(&test_util::DoNothingForReAuthenticateCallback));
|
| + MessageLoop::current()->Run();
|
| +
|
| + EXPECT_EQ(HTTP_SUCCESS, result_code);
|
| + EXPECT_EQ(test_server_.GetURL("/upload_new_file"), upload_url);
|
| + EXPECT_EQ(test_server::METHOD_POST, http_request_.method);
|
| + // convert=false should be passed as files should be uploaded as-is.
|
| + EXPECT_EQ("/feeds/upload/create-session/default/private/full?convert=false"
|
| + "&v=3&alt=json",
|
| + http_request_.relative_url);
|
| + EXPECT_EQ("text/plain", http_request_.headers["X-Upload-Content-Type"]);
|
| + EXPECT_EQ("application/atom+xml", http_request_.headers["Content-Type"]);
|
| + EXPECT_EQ(base::Int64ToString(kUploadContent.size()),
|
| + http_request_.headers["X-Upload-Content-Length"]);
|
| +
|
| + EXPECT_TRUE(http_request_.has_content);
|
| + EXPECT_EQ("<?xml version=\"1.0\"?>\n"
|
| + "<entry xmlns=\"http://www.w3.org/2005/Atom\" "
|
| + "xmlns:docs=\"http://schemas.google.com/docs/2007\">\n"
|
| + " <title>New file</title>\n"
|
| + "</entry>\n",
|
| + http_request_.content);
|
| +
|
| + // Keep only one buffer instance and reuse it. The sent data range should
|
| + // be specified via buf_offset.
|
| + scoped_refptr<net::IOBuffer> buffer =
|
| + new net::StringIOBuffer(kUploadContent);
|
| +
|
| + // 2) Upload the content to the upload URL with multiple requests.
|
| + size_t num_bytes_consumed = 0;
|
| + for (size_t start_position = 0; start_position < kUploadContent.size();
|
| + start_position += kMaxNumBytes) {
|
| + SCOPED_TRACE(testing::Message("start_position: ") << start_position);
|
| +
|
| + // The payload is at most kMaxNumBytes.
|
| + const size_t remaining_size = kUploadContent.size() - start_position;
|
| + const std::string payload = kUploadContent.substr(
|
| + start_position, std::min(kMaxNumBytes, remaining_size));
|
| + num_bytes_consumed += payload.size();
|
| + // The end position is exclusive.
|
| + const size_t end_position = start_position + payload.size();
|
| +
|
| + ResumeUploadParams resume_params(
|
| + UPLOAD_NEW_FILE,
|
| + start_position,
|
| + end_position,
|
| + kUploadContent.size(), // content_length,
|
| + "text/plain", // content_type
|
| + buffer,
|
| + start_position, // buf_offset
|
| + upload_url,
|
| + FilePath::FromUTF8Unsafe("drive/newfile.txt"));
|
| +
|
| + UploadRangeResponse response;
|
| + scoped_ptr<ResourceEntry> new_entry;
|
| +
|
| + ResumeUploadOperation* resume_operation = new ResumeUploadOperation(
|
| + &operation_registry_,
|
| + request_context_getter_.get(),
|
| + base::Bind(&CopyResultFromUploadRangeCallbackAndQuit,
|
| + &response,
|
| + &new_entry),
|
| + resume_params);
|
| +
|
| + resume_operation->Start(
|
| + kTestGDataAuthToken, kTestUserAgent,
|
| + base::Bind(&test_util::DoNothingForReAuthenticateCallback));
|
| + MessageLoop::current()->Run();
|
| +
|
| + // METHOD_PUT should be used to upload data.
|
| + EXPECT_EQ(test_server::METHOD_PUT, http_request_.method);
|
| + // Request should go to the upload URL.
|
| + EXPECT_EQ(upload_url.path(), http_request_.relative_url);
|
| + // Content-Range header should be added.
|
| + EXPECT_EQ("bytes " +
|
| + base::Int64ToString(start_position) + "-" +
|
| + base::Int64ToString(end_position - 1) + "/" +
|
| + base::Int64ToString(kUploadContent.size()),
|
| + http_request_.headers["Content-Range"]);
|
| + // The upload content should be set in the HTTP request.
|
| + EXPECT_TRUE(http_request_.has_content);
|
| + EXPECT_EQ(payload, http_request_.content);
|
| +
|
| + // Check the response.
|
| + if (payload.size() == remaining_size) {
|
| + EXPECT_EQ(HTTP_CREATED, response.code); // Because it's a new file.
|
| + // The start and end positions should be set to -1, if an upload is
|
| + // complete.
|
| + EXPECT_EQ(-1, response.start_position_received);
|
| + EXPECT_EQ(-1, response.end_position_received);
|
| + // The upload process is completed, so exit from the loop.
|
| + break;
|
| + }
|
| +
|
| + EXPECT_EQ(HTTP_RESUME_INCOMPLETE, response.code);
|
| + EXPECT_EQ(static_cast<int64>(start_position),
|
| + response.start_position_received);
|
| + EXPECT_EQ(static_cast<int64>(end_position),
|
| + response.end_position_received);
|
| +
|
| + // Check the response by GetUploadStatusOperation.
|
| + GetUploadStatusOperation* get_upload_status_operation =
|
| + new GetUploadStatusOperation(
|
| + &operation_registry_,
|
| + request_context_getter_.get(),
|
| + base::Bind(&CopyResultFromUploadRangeCallbackAndQuit,
|
| + &response,
|
| + &new_entry),
|
| + UPLOAD_NEW_FILE,
|
| + FilePath::FromUTF8Unsafe("drive/newfile.txt"),
|
| + upload_url,
|
| + kUploadContent.size());
|
| + get_upload_status_operation->Start(
|
| + kTestGDataAuthToken, kTestUserAgent,
|
| + base::Bind(&test_util::DoNothingForReAuthenticateCallback));
|
| + MessageLoop::current()->Run();
|
| +
|
| + // METHOD_PUT should be used to upload data.
|
| + EXPECT_EQ(test_server::METHOD_PUT, http_request_.method);
|
| + // Request should go to the upload URL.
|
| + EXPECT_EQ(upload_url.path(), http_request_.relative_url);
|
| + // Content-Range header should be added.
|
| + EXPECT_EQ("bytes */" + base::Int64ToString(kUploadContent.size()),
|
| + http_request_.headers["Content-Range"]);
|
| + EXPECT_TRUE(http_request_.has_content);
|
| + EXPECT_TRUE(http_request_.content.empty());
|
| +
|
| + // Check the response.
|
| + EXPECT_EQ(HTTP_RESUME_INCOMPLETE, response.code);
|
| + EXPECT_EQ(static_cast<int64>(start_position),
|
| + response.start_position_received);
|
| + EXPECT_EQ(static_cast<int64>(end_position),
|
| + response.end_position_received);
|
| + }
|
| +
|
| + EXPECT_EQ(kUploadContent.size(), num_bytes_consumed);
|
| +}
|
| +
|
| +
|
| } // namespace google_apis
|
|
|