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 26397d9d35e9337fefcb1fa5c76aa04e66845132..244b539e3224248fad7ad92f04788b020b8fdd26 100644 |
--- a/chrome/browser/google_apis/gdata_wapi_operations_unittest.cc |
+++ b/chrome/browser/google_apis/gdata_wapi_operations_unittest.cc |
@@ -127,6 +127,9 @@ class GDataWapiOperationsTest : public testing::Test { |
url_generator_.reset(new GDataWapiUrlGenerator( |
test_util::GetBaseUrlForTesting(test_server_.port()))); |
+ |
+ received_bytes_ = 0; |
+ content_length_ = 0; |
} |
virtual void TearDown() OVERRIDE { |
@@ -225,6 +228,7 @@ class GDataWapiOperationsTest : public testing::Test { |
scoped_ptr<test_server::HttpResponse> http_response( |
new test_server::HttpResponse); |
+ // Check an ETag. |
std::map<std::string, std::string>::const_iterator found = |
request.headers.find("If-Match"); |
if (found != request.headers.end() && |
@@ -234,6 +238,15 @@ class GDataWapiOperationsTest : public testing::Test { |
return http_response.Pass(); |
} |
+ // Check if the X-Upload-Content-Length is present. If yes, store the |
+ // length of the file. |
+ found = request.headers.find("X-Upload-Content-Length"); |
+ if (found == request.headers.end() || |
+ !base::StringToInt64(found->second, &content_length_)) { |
+ return scoped_ptr<test_server::HttpResponse>(); |
+ } |
+ received_bytes_ = 0; |
+ |
http_response->set_code(test_server::SUCCESS); |
GURL upload_url; |
// POST is used for a new file, and PUT is used for an existing file. |
@@ -279,29 +292,34 @@ class GDataWapiOperationsTest : public testing::Test { |
request.headers.find("Content-Range"); |
if (iter == request.headers.end()) |
return scoped_ptr<test_server::HttpResponse>(); |
+ int64 length = 0; |
int64 start_position = 0; |
int64 end_position = 0; |
- int64 length = 0; |
if (!ParseContentRangeHeader(iter->second, |
&start_position, |
&end_position, |
&length)) { |
return scoped_ptr<test_server::HttpResponse>(); |
} |
+ EXPECT_EQ(start_position, received_bytes_); |
+ EXPECT_EQ(length, content_length_); |
+ // end_position is inclusive, but so +1 to change the range to byte size. |
+ received_bytes_ = end_position + 1; |
+ } |
- // Add Range header to the response, based on the values of |
- // Content-Range header in the request. |
+ // Add Range header to the response, based on the values of |
+ // Content-Range header in the request. |
+ // The header is annotated only when at least one byte is received. |
+ if (received_bytes_ > 0) { |
response->AddCustomHeader( |
"Range", |
- "bytes=" + |
- base::Int64ToString(start_position) + "-" + |
- base::Int64ToString(end_position)); |
- |
- // Change the code to RESUME_INCOMPLETE if upload is not complete. |
- if (end_position + 1 < length) |
- response->set_code(test_server::RESUME_INCOMPLETE); |
+ "bytes=0-" + base::Int64ToString(received_bytes_ - 1)); |
kinaba
2013/02/08 10:19:43
Is 0- the expected response when we have non-empty
hidehiko
2013/02/08 11:53:10
The actual server returns 0-end if there is (one o
|
} |
+ // Change the code to RESUME_INCOMPLETE if upload is not complete. |
+ if (received_bytes_ < content_length_) |
+ response->set_code(test_server::RESUME_INCOMPLETE); |
+ |
return response.Pass(); |
} |
@@ -315,6 +333,14 @@ class GDataWapiOperationsTest : public testing::Test { |
scoped_ptr<GDataWapiUrlGenerator> url_generator_; |
scoped_refptr<net::TestURLRequestContextGetter> request_context_getter_; |
+ // These fields are used to keep the current upload state during a |
+ // test case. These values are updated by the request from |
+ // ResumeUploadOperation, and used to construct the response for |
+ // both ResumeUploadOperation and GetUploadStatusOperation, to emulate |
+ // the WAPI server. |
+ int64 received_bytes_; |
+ int64 content_length_; |
+ |
// The incoming HTTP request is saved so tests can verify the request |
// parameters like HTTP method (ex. some operations should use DELETE |
// instead of GET). |
@@ -866,7 +892,8 @@ TEST_F(GDataWapiOperationsTest, UploadNewFile) { |
// This test exercises InitiateUploadOperation and ResumeUploadOperation for |
// a scenario of uploading a new *large* file, which requires multiple requests |
-// of ResumeUploadOperation. |
+// of ResumeUploadOperation. GetUploadOperation is also tested in this test |
+// case. |
TEST_F(GDataWapiOperationsTest, UploadNewLargeFile) { |
const size_t kMaxNumBytes = 10; |
// This is big enough to cause multiple requests of ResumeUploadOperation |
@@ -918,7 +945,44 @@ TEST_F(GDataWapiOperationsTest, UploadNewLargeFile) { |
"</entry>\n", |
http_request_.content); |
- // 2) Upload the content to the upload URL with multiple requests. |
+ // 2) Before sending any data, check the current status. |
hidehiko
2013/02/08 09:17:00
Hmm, the diff looks not good.
What I did is insert
|
+ // This is an edge case test for GetUploadStatusOperation |
+ // (UploadRangeOperationBase). |
+ { |
+ // 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(0, response.start_position_received); |
+ EXPECT_EQ(0, response.end_position_received); |
+ } |
+ |
+ // 3) 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) { |
@@ -980,13 +1044,49 @@ TEST_F(GDataWapiOperationsTest, UploadNewLargeFile) { |
// complete. |
EXPECT_EQ(-1, response.start_position_received); |
EXPECT_EQ(-1, response.end_position_received); |
- } else { |
- 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); |
+ // 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); |