| Index: chrome/browser/google_apis/gdata_wapi_requests_unittest.cc
|
| diff --git a/chrome/browser/google_apis/gdata_wapi_requests_unittest.cc b/chrome/browser/google_apis/gdata_wapi_requests_unittest.cc
|
| deleted file mode 100644
|
| index cbf89d4222a88d7fb19e702e4e181b50020a152c..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/google_apis/gdata_wapi_requests_unittest.cc
|
| +++ /dev/null
|
| @@ -1,1596 +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 <algorithm>
|
| -#include <map>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/file_util.h"
|
| -#include "base/files/file_path.h"
|
| -#include "base/files/scoped_temp_dir.h"
|
| -#include "base/json/json_reader.h"
|
| -#include "base/json/json_writer.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "base/run_loop.h"
|
| -#include "base/strings/string_number_conversions.h"
|
| -#include "base/strings/stringprintf.h"
|
| -#include "base/values.h"
|
| -#include "chrome/browser/google_apis/dummy_auth_service.h"
|
| -#include "chrome/browser/google_apis/gdata_wapi_parser.h"
|
| -#include "chrome/browser/google_apis/gdata_wapi_requests.h"
|
| -#include "chrome/browser/google_apis/gdata_wapi_url_generator.h"
|
| -#include "chrome/browser/google_apis/request_sender.h"
|
| -#include "chrome/browser/google_apis/test_util.h"
|
| -#include "net/base/escape.h"
|
| -#include "net/test/embedded_test_server/embedded_test_server.h"
|
| -#include "net/test/embedded_test_server/http_request.h"
|
| -#include "net/test/embedded_test_server/http_response.h"
|
| -#include "net/url_request/url_request_test_util.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace google_apis {
|
| -
|
| -namespace {
|
| -
|
| -const char kTestUserAgent[] = "test-user-agent";
|
| -const char kTestETag[] = "test_etag";
|
| -const char kTestDownloadPathPrefix[] = "/download/";
|
| -
|
| -class GDataWapiRequestsTest : public testing::Test {
|
| - public:
|
| - GDataWapiRequestsTest() {
|
| - }
|
| -
|
| - virtual void SetUp() OVERRIDE {
|
| - request_context_getter_ = new net::TestURLRequestContextGetter(
|
| - message_loop_.message_loop_proxy());
|
| -
|
| - request_sender_.reset(new RequestSender(new DummyAuthService,
|
| - request_context_getter_.get(),
|
| - message_loop_.message_loop_proxy(),
|
| - kTestUserAgent));
|
| -
|
| - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
|
| -
|
| - ASSERT_TRUE(test_server_.InitializeAndWaitUntilReady());
|
| - test_server_.RegisterRequestHandler(
|
| - base::Bind(&test_util::HandleDownloadFileRequest,
|
| - test_server_.base_url(),
|
| - base::Unretained(&http_request_)));
|
| - test_server_.RegisterRequestHandler(
|
| - base::Bind(&GDataWapiRequestsTest::HandleResourceFeedRequest,
|
| - base::Unretained(this)));
|
| - test_server_.RegisterRequestHandler(
|
| - base::Bind(&GDataWapiRequestsTest::HandleMetadataRequest,
|
| - base::Unretained(this)));
|
| - test_server_.RegisterRequestHandler(
|
| - base::Bind(&GDataWapiRequestsTest::HandleCreateSessionRequest,
|
| - base::Unretained(this)));
|
| - test_server_.RegisterRequestHandler(
|
| - base::Bind(&GDataWapiRequestsTest::HandleUploadRequest,
|
| - base::Unretained(this)));
|
| - test_server_.RegisterRequestHandler(
|
| - base::Bind(&GDataWapiRequestsTest::HandleDownloadRequest,
|
| - base::Unretained(this)));
|
| -
|
| - GURL test_base_url = test_util::GetBaseUrlForTesting(test_server_.port());
|
| - url_generator_.reset(new GDataWapiUrlGenerator(
|
| - test_base_url, test_base_url.Resolve(kTestDownloadPathPrefix)));
|
| -
|
| - received_bytes_ = 0;
|
| - content_length_ = 0;
|
| - }
|
| -
|
| - protected:
|
| - // Handles a request for fetching a resource feed.
|
| - scoped_ptr<net::test_server::HttpResponse> HandleResourceFeedRequest(
|
| - const net::test_server::HttpRequest& request) {
|
| - http_request_ = request;
|
| -
|
| - const GURL absolute_url = test_server_.GetURL(request.relative_url);
|
| - std::string remaining_path;
|
| - if (absolute_url.path() == "/feeds/default/private/full" &&
|
| - request.method == net::test_server::METHOD_POST) {
|
| - // This is a request for copying a document.
|
| - // TODO(satorux): we should generate valid JSON data for the newly
|
| - // copied document but for now, just return "file_entry.json"
|
| - scoped_ptr<net::test_server::BasicHttpResponse> result(
|
| - test_util::CreateHttpResponseFromFile(
|
| - test_util::GetTestFilePath("gdata/file_entry.json")));
|
| - return result.PassAs<net::test_server::HttpResponse>();
|
| - }
|
| -
|
| - if (!test_util::RemovePrefix(absolute_url.path(),
|
| - "/feeds/default/private/full",
|
| - &remaining_path)) {
|
| - return scoped_ptr<net::test_server::HttpResponse>();
|
| - }
|
| -
|
| - if (remaining_path.empty()) {
|
| - // Process the default feed.
|
| - scoped_ptr<net::test_server::BasicHttpResponse> result(
|
| - test_util::CreateHttpResponseFromFile(
|
| - test_util::GetTestFilePath("gdata/root_feed.json")));
|
| - return result.PassAs<net::test_server::HttpResponse>();
|
| - } else {
|
| - // Process a feed for a single resource ID.
|
| - const std::string resource_id = net::UnescapeURLComponent(
|
| - remaining_path.substr(1), net::UnescapeRule::URL_SPECIAL_CHARS);
|
| - if (resource_id == "file:2_file_resource_id") {
|
| - scoped_ptr<net::test_server::BasicHttpResponse> result(
|
| - test_util::CreateHttpResponseFromFile(
|
| - test_util::GetTestFilePath("gdata/file_entry.json")));
|
| - return result.PassAs<net::test_server::HttpResponse>();
|
| - } else if (resource_id == "folder:root/contents" &&
|
| - request.method == net::test_server::METHOD_POST) {
|
| - // This is a request for creating a directory in the root directory.
|
| - // TODO(satorux): we should generate valid JSON data for the newly
|
| - // created directory but for now, just return "directory_entry.json"
|
| - scoped_ptr<net::test_server::BasicHttpResponse> result(
|
| - test_util::CreateHttpResponseFromFile(
|
| - test_util::GetTestFilePath(
|
| - "gdata/directory_entry.json")));
|
| - return result.PassAs<net::test_server::HttpResponse>();
|
| - } else if (resource_id ==
|
| - "folder:root/contents/file:2_file_resource_id" &&
|
| - request.method == net::test_server::METHOD_DELETE) {
|
| - // This is a request for deleting a file from the root directory.
|
| - // TODO(satorux): Investigate what's returned from the server, and
|
| - // copy it. For now, just return a random file, as the contents don't
|
| - // matter.
|
| - scoped_ptr<net::test_server::BasicHttpResponse> result(
|
| - test_util::CreateHttpResponseFromFile(
|
| - test_util::GetTestFilePath("gdata/testfile.txt")));
|
| - return result.PassAs<net::test_server::HttpResponse>();
|
| - } else if (resource_id == "invalid_resource_id") {
|
| - // Check if this is an authorization request for an app.
|
| - // This emulates to return invalid formatted result from the server.
|
| - if (request.method == net::test_server::METHOD_PUT &&
|
| - request.content.find("<docs:authorizedApp>") != std::string::npos) {
|
| - scoped_ptr<net::test_server::BasicHttpResponse> result(
|
| - test_util::CreateHttpResponseFromFile(
|
| - test_util::GetTestFilePath("gdata/testfile.txt")));
|
| - return result.PassAs<net::test_server::HttpResponse>();
|
| - }
|
| - }
|
| - }
|
| -
|
| - return scoped_ptr<net::test_server::HttpResponse>();
|
| - }
|
| -
|
| - // Handles a request for fetching a metadata feed.
|
| - scoped_ptr<net::test_server::HttpResponse> HandleMetadataRequest(
|
| - const net::test_server::HttpRequest& request) {
|
| - http_request_ = request;
|
| -
|
| - const GURL absolute_url = test_server_.GetURL(request.relative_url);
|
| - if (absolute_url.path() != "/feeds/metadata/default")
|
| - return scoped_ptr<net::test_server::HttpResponse>();
|
| -
|
| - scoped_ptr<net::test_server::BasicHttpResponse> result(
|
| - test_util::CreateHttpResponseFromFile(
|
| - test_util::GetTestFilePath(
|
| - "gdata/account_metadata.json")));
|
| - if (absolute_url.query().find("include-installed-apps=true") ==
|
| - string::npos) {
|
| - // Exclude the list of installed apps.
|
| - scoped_ptr<base::Value> parsed_content(
|
| - base::JSONReader::Read(result->content(), base::JSON_PARSE_RFC));
|
| - CHECK(parsed_content);
|
| -
|
| - // Remove the install apps node.
|
| - base::DictionaryValue* dictionary_value;
|
| - CHECK(parsed_content->GetAsDictionary(&dictionary_value));
|
| - dictionary_value->Remove("entry.docs$installedApp", NULL);
|
| -
|
| - // Write back it as the content of the result.
|
| - std::string content;
|
| - base::JSONWriter::Write(parsed_content.get(), &content);
|
| - result->set_content(content);
|
| - }
|
| -
|
| - return result.PassAs<net::test_server::HttpResponse>();
|
| - }
|
| -
|
| - // Handles a request for creating a session for uploading.
|
| - scoped_ptr<net::test_server::HttpResponse> HandleCreateSessionRequest(
|
| - const net::test_server::HttpRequest& request) {
|
| - http_request_ = request;
|
| -
|
| - const GURL absolute_url = test_server_.GetURL(request.relative_url);
|
| - if (StartsWithASCII(absolute_url.path(),
|
| - "/feeds/upload/create-session/default/private/full",
|
| - true)) { // case sensitive
|
| - // This is an initiating upload URL.
|
| - scoped_ptr<net::test_server::BasicHttpResponse> http_response(
|
| - new net::test_server::BasicHttpResponse);
|
| -
|
| - // Check an ETag.
|
| - std::map<std::string, std::string>::const_iterator found =
|
| - request.headers.find("If-Match");
|
| - if (found != request.headers.end() &&
|
| - found->second != "*" &&
|
| - found->second != kTestETag) {
|
| - http_response->set_code(net::HTTP_PRECONDITION_FAILED);
|
| - return http_response.PassAs<net::test_server::HttpResponse>();
|
| - }
|
| -
|
| - // 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<net::test_server::HttpResponse>();
|
| - }
|
| - received_bytes_ = 0;
|
| -
|
| - http_response->set_code(net::HTTP_OK);
|
| - GURL upload_url;
|
| - // POST is used for a new file, and PUT is used for an existing file.
|
| - if (request.method == net::test_server::METHOD_POST) {
|
| - upload_url = test_server_.GetURL("/upload_new_file");
|
| - } else if (request.method == net::test_server::METHOD_PUT) {
|
| - upload_url = test_server_.GetURL("/upload_existing_file");
|
| - } else {
|
| - return scoped_ptr<net::test_server::HttpResponse>();
|
| - }
|
| - http_response->AddCustomHeader("Location", upload_url.spec());
|
| - return http_response.PassAs<net::test_server::HttpResponse>();
|
| - }
|
| -
|
| - return scoped_ptr<net::test_server::HttpResponse>();
|
| - }
|
| -
|
| - // Handles a request for uploading content.
|
| - scoped_ptr<net::test_server::HttpResponse> HandleUploadRequest(
|
| - const net::test_server::HttpRequest& request) {
|
| - http_request_ = request;
|
| -
|
| - const GURL absolute_url = test_server_.GetURL(request.relative_url);
|
| - if (absolute_url.path() != "/upload_new_file" &&
|
| - absolute_url.path() != "/upload_existing_file") {
|
| - return scoped_ptr<net::test_server::HttpResponse>();
|
| - }
|
| -
|
| - // TODO(satorux): We should create a correct JSON data for the uploaded
|
| - // file, but for now, just return file_entry.json.
|
| - scoped_ptr<net::test_server::BasicHttpResponse> response =
|
| - test_util::CreateHttpResponseFromFile(
|
| - test_util::GetTestFilePath("gdata/file_entry.json"));
|
| - // response.code() is set to SUCCESS. Change it to CREATED if it's a new
|
| - // file.
|
| - if (absolute_url.path() == "/upload_new_file")
|
| - response->set_code(net::HTTP_CREATED);
|
| -
|
| - // Check if the Content-Range header is present. This must be present if
|
| - // the request body is not empty.
|
| - if (!request.content.empty()) {
|
| - std::map<std::string, std::string>::const_iterator iter =
|
| - request.headers.find("Content-Range");
|
| - if (iter == request.headers.end())
|
| - return scoped_ptr<net::test_server::HttpResponse>();
|
| - int64 length = 0;
|
| - int64 start_position = 0;
|
| - int64 end_position = 0;
|
| - if (!test_util::ParseContentRangeHeader(iter->second,
|
| - &start_position,
|
| - &end_position,
|
| - &length)) {
|
| - return scoped_ptr<net::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.
|
| - // The header is annotated only when at least one byte is received.
|
| - if (received_bytes_ > 0) {
|
| - response->AddCustomHeader(
|
| - "Range",
|
| - "bytes=0-" + base::Int64ToString(received_bytes_ - 1));
|
| - }
|
| -
|
| - // Change the code to RESUME_INCOMPLETE if upload is not complete.
|
| - if (received_bytes_ < content_length_)
|
| - response->set_code(static_cast<net::HttpStatusCode>(308));
|
| -
|
| - return response.PassAs<net::test_server::HttpResponse>();
|
| - }
|
| -
|
| - // Handles a request for downloading a file.
|
| - scoped_ptr<net::test_server::HttpResponse> HandleDownloadRequest(
|
| - const net::test_server::HttpRequest& request) {
|
| - http_request_ = request;
|
| -
|
| - const GURL absolute_url = test_server_.GetURL(request.relative_url);
|
| - std::string id;
|
| - if (!test_util::RemovePrefix(absolute_url.path(),
|
| - kTestDownloadPathPrefix,
|
| - &id)) {
|
| - return scoped_ptr<net::test_server::HttpResponse>();
|
| - }
|
| -
|
| - // For testing, returns a text with |id| repeated 3 times.
|
| - scoped_ptr<net::test_server::BasicHttpResponse> response(
|
| - new net::test_server::BasicHttpResponse);
|
| - response->set_code(net::HTTP_OK);
|
| - response->set_content(id + id + id);
|
| - response->set_content_type("text/plain");
|
| - return response.PassAs<net::test_server::HttpResponse>();
|
| - }
|
| -
|
| - base::MessageLoopForIO message_loop_; // Test server needs IO thread.
|
| - net::test_server::EmbeddedTestServer test_server_;
|
| - scoped_ptr<RequestSender> request_sender_;
|
| - scoped_ptr<GDataWapiUrlGenerator> url_generator_;
|
| - scoped_refptr<net::TestURLRequestContextGetter> request_context_getter_;
|
| - base::ScopedTempDir temp_dir_;
|
| -
|
| - // These fields are used to keep the current upload state during a
|
| - // test case. These values are updated by the request from
|
| - // ResumeUploadRequest, and used to construct the response for
|
| - // both ResumeUploadRequest and GetUploadStatusRequest, 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 requests should use DELETE
|
| - // instead of GET).
|
| - net::test_server::HttpRequest http_request_;
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -TEST_F(GDataWapiRequestsTest, GetResourceListRequest_DefaultFeed) {
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| - scoped_ptr<ResourceList> result_data;
|
| -
|
| - {
|
| - base::RunLoop run_loop;
|
| - GetResourceListRequest* request = new GetResourceListRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - GURL(), // Pass an empty URL to use the default feed
|
| - 0, // start changestamp
|
| - std::string(), // search string
|
| - std::string(), // directory resource ID
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code, &result_data)));
|
| - request_sender_->StartRequestWithRetry(request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - EXPECT_EQ(HTTP_SUCCESS, result_code);
|
| - EXPECT_EQ(net::test_server::METHOD_GET, http_request_.method);
|
| - EXPECT_EQ("/feeds/default/private/full?v=3&alt=json&showroot=true&"
|
| - "showfolders=true&include-shared=true&max-results=500",
|
| - http_request_.relative_url);
|
| -
|
| - // Sanity check of the result.
|
| - scoped_ptr<ResourceList> expected(
|
| - ResourceList::ExtractAndParse(
|
| - *test_util::LoadJSONFile("gdata/root_feed.json")));
|
| - ASSERT_TRUE(result_data);
|
| - EXPECT_EQ(expected->title(), result_data->title());
|
| -}
|
| -
|
| -TEST_F(GDataWapiRequestsTest, GetResourceListRequest_ValidFeed) {
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| - scoped_ptr<ResourceList> result_data;
|
| -
|
| - {
|
| - base::RunLoop run_loop;
|
| - GetResourceListRequest* request = new GetResourceListRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - test_server_.GetURL("/files/gdata/root_feed.json"),
|
| - 0, // start changestamp
|
| - std::string(), // search string
|
| - std::string(), // directory resource ID
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code, &result_data)));
|
| - request_sender_->StartRequestWithRetry(request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - EXPECT_EQ(HTTP_SUCCESS, result_code);
|
| - EXPECT_EQ(net::test_server::METHOD_GET, http_request_.method);
|
| - EXPECT_EQ("/files/gdata/root_feed.json?v=3&alt=json&showroot=true&"
|
| - "showfolders=true&include-shared=true&max-results=500",
|
| - http_request_.relative_url);
|
| -
|
| - scoped_ptr<ResourceList> expected(
|
| - ResourceList::ExtractAndParse(
|
| - *test_util::LoadJSONFile("gdata/root_feed.json")));
|
| - ASSERT_TRUE(result_data);
|
| - EXPECT_EQ(expected->title(), result_data->title());
|
| -}
|
| -
|
| -TEST_F(GDataWapiRequestsTest, GetResourceListRequest_InvalidFeed) {
|
| - // testfile.txt exists but the response is not JSON, so it should
|
| - // emit a parse error instead.
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| - scoped_ptr<ResourceList> result_data;
|
| -
|
| - {
|
| - base::RunLoop run_loop;
|
| - GetResourceListRequest* request = new GetResourceListRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - test_server_.GetURL("/files/gdata/testfile.txt"),
|
| - 0, // start changestamp
|
| - std::string(), // search string
|
| - std::string(), // directory resource ID
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code, &result_data)));
|
| - request_sender_->StartRequestWithRetry(request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - EXPECT_EQ(GDATA_PARSE_ERROR, result_code);
|
| - EXPECT_EQ(net::test_server::METHOD_GET, http_request_.method);
|
| - EXPECT_EQ("/files/gdata/testfile.txt?v=3&alt=json&showroot=true&"
|
| - "showfolders=true&include-shared=true&max-results=500",
|
| - http_request_.relative_url);
|
| - EXPECT_FALSE(result_data);
|
| -}
|
| -
|
| -TEST_F(GDataWapiRequestsTest, SearchByTitleRequest) {
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| - scoped_ptr<ResourceList> result_data;
|
| -
|
| - {
|
| - base::RunLoop run_loop;
|
| - SearchByTitleRequest* request = new SearchByTitleRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - "search-title",
|
| - std::string(), // directory resource id
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code, &result_data)));
|
| - request_sender_->StartRequestWithRetry(request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - EXPECT_EQ(HTTP_SUCCESS, result_code);
|
| - EXPECT_EQ(net::test_server::METHOD_GET, http_request_.method);
|
| - EXPECT_EQ("/feeds/default/private/full?v=3&alt=json&showroot=true&"
|
| - "showfolders=true&include-shared=true&max-results=500"
|
| - "&title=search-title&title-exact=true",
|
| - http_request_.relative_url);
|
| - EXPECT_TRUE(result_data);
|
| -}
|
| -
|
| -TEST_F(GDataWapiRequestsTest, GetResourceEntryRequest_ValidResourceId) {
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| - scoped_ptr<base::Value> result_data;
|
| -
|
| - {
|
| - base::RunLoop run_loop;
|
| - GetResourceEntryRequest* request = new GetResourceEntryRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - "file:2_file_resource_id", // resource ID
|
| - GURL(), // embed origin
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code, &result_data)));
|
| - request_sender_->StartRequestWithRetry(request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - EXPECT_EQ(HTTP_SUCCESS, result_code);
|
| - EXPECT_EQ(net::test_server::METHOD_GET, http_request_.method);
|
| - EXPECT_EQ("/feeds/default/private/full/file%3A2_file_resource_id"
|
| - "?v=3&alt=json&showroot=true",
|
| - http_request_.relative_url);
|
| - scoped_ptr<base::Value> expected_json =
|
| - test_util::LoadJSONFile("gdata/file_entry.json");
|
| - ASSERT_TRUE(expected_json);
|
| - EXPECT_TRUE(result_data);
|
| - EXPECT_TRUE(base::Value::Equals(expected_json.get(), result_data.get()));
|
| -}
|
| -
|
| -TEST_F(GDataWapiRequestsTest, GetResourceEntryRequest_InvalidResourceId) {
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| - scoped_ptr<base::Value> result_data;
|
| -
|
| - {
|
| - base::RunLoop run_loop;
|
| - GetResourceEntryRequest* request = new GetResourceEntryRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - "<invalid>", // resource ID
|
| - GURL(), // embed origin
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code, &result_data)));
|
| - request_sender_->StartRequestWithRetry(request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - EXPECT_EQ(HTTP_NOT_FOUND, result_code);
|
| - EXPECT_EQ(net::test_server::METHOD_GET, http_request_.method);
|
| - EXPECT_EQ("/feeds/default/private/full/%3Cinvalid%3E?v=3&alt=json"
|
| - "&showroot=true",
|
| - http_request_.relative_url);
|
| - ASSERT_FALSE(result_data);
|
| -}
|
| -
|
| -TEST_F(GDataWapiRequestsTest, GetAccountMetadataRequest) {
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| - scoped_ptr<AccountMetadata> result_data;
|
| -
|
| - {
|
| - base::RunLoop run_loop;
|
| - GetAccountMetadataRequest* request = new GetAccountMetadataRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code, &result_data)),
|
| - true); // Include installed apps.
|
| - request_sender_->StartRequestWithRetry(request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - EXPECT_EQ(HTTP_SUCCESS, result_code);
|
| - EXPECT_EQ(net::test_server::METHOD_GET, http_request_.method);
|
| - EXPECT_EQ("/feeds/metadata/default?v=3&alt=json&showroot=true"
|
| - "&include-installed-apps=true",
|
| - http_request_.relative_url);
|
| -
|
| - scoped_ptr<AccountMetadata> expected(
|
| - AccountMetadata::CreateFrom(
|
| - *test_util::LoadJSONFile("gdata/account_metadata.json")));
|
| -
|
| - ASSERT_TRUE(result_data.get());
|
| - EXPECT_EQ(expected->largest_changestamp(),
|
| - result_data->largest_changestamp());
|
| - EXPECT_EQ(expected->quota_bytes_total(),
|
| - result_data->quota_bytes_total());
|
| - EXPECT_EQ(expected->quota_bytes_used(),
|
| - result_data->quota_bytes_used());
|
| -
|
| - // Sanity check for installed apps.
|
| - EXPECT_EQ(expected->installed_apps().size(),
|
| - result_data->installed_apps().size());
|
| -}
|
| -
|
| -TEST_F(GDataWapiRequestsTest,
|
| - GetAccountMetadataRequestWithoutInstalledApps) {
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| - scoped_ptr<AccountMetadata> result_data;
|
| -
|
| - {
|
| - base::RunLoop run_loop;
|
| - GetAccountMetadataRequest* request = new GetAccountMetadataRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code, &result_data)),
|
| - false); // Exclude installed apps.
|
| - request_sender_->StartRequestWithRetry(request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - EXPECT_EQ(HTTP_SUCCESS, result_code);
|
| - EXPECT_EQ(net::test_server::METHOD_GET, http_request_.method);
|
| - EXPECT_EQ("/feeds/metadata/default?v=3&alt=json&showroot=true",
|
| - http_request_.relative_url);
|
| -
|
| - scoped_ptr<AccountMetadata> expected(
|
| - AccountMetadata::CreateFrom(
|
| - *test_util::LoadJSONFile("gdata/account_metadata.json")));
|
| -
|
| - ASSERT_TRUE(result_data.get());
|
| - EXPECT_EQ(expected->largest_changestamp(),
|
| - result_data->largest_changestamp());
|
| - EXPECT_EQ(expected->quota_bytes_total(),
|
| - result_data->quota_bytes_total());
|
| - EXPECT_EQ(expected->quota_bytes_used(),
|
| - result_data->quota_bytes_used());
|
| -
|
| - // Installed apps shouldn't be included.
|
| - EXPECT_EQ(0U, result_data->installed_apps().size());
|
| -}
|
| -
|
| -TEST_F(GDataWapiRequestsTest, DeleteResourceRequest) {
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| -
|
| - {
|
| - base::RunLoop run_loop;
|
| - DeleteResourceRequest* request = new DeleteResourceRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code)),
|
| - "file:2_file_resource_id",
|
| - std::string());
|
| -
|
| - request_sender_->StartRequestWithRetry(request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - EXPECT_EQ(HTTP_SUCCESS, result_code);
|
| - EXPECT_EQ(net::test_server::METHOD_DELETE, http_request_.method);
|
| - EXPECT_EQ(
|
| - "/feeds/default/private/full/file%3A2_file_resource_id?v=3&alt=json"
|
| - "&showroot=true",
|
| - http_request_.relative_url);
|
| - EXPECT_EQ("*", http_request_.headers["If-Match"]);
|
| -}
|
| -
|
| -TEST_F(GDataWapiRequestsTest, DeleteResourceRequestWithETag) {
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| -
|
| - {
|
| - base::RunLoop run_loop;
|
| - DeleteResourceRequest* request = new DeleteResourceRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code)),
|
| - "file:2_file_resource_id",
|
| - "etag");
|
| -
|
| - request_sender_->StartRequestWithRetry(request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - EXPECT_EQ(HTTP_SUCCESS, result_code);
|
| - EXPECT_EQ(net::test_server::METHOD_DELETE, http_request_.method);
|
| - EXPECT_EQ(
|
| - "/feeds/default/private/full/file%3A2_file_resource_id?v=3&alt=json"
|
| - "&showroot=true",
|
| - http_request_.relative_url);
|
| - EXPECT_EQ("etag", http_request_.headers["If-Match"]);
|
| -}
|
| -
|
| -TEST_F(GDataWapiRequestsTest, CreateDirectoryRequest) {
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| - scoped_ptr<base::Value> result_data;
|
| -
|
| - // Create "new directory" in the root directory.
|
| - {
|
| - base::RunLoop run_loop;
|
| - CreateDirectoryRequest* request = new CreateDirectoryRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code, &result_data)),
|
| - "folder:root",
|
| - "new directory");
|
| -
|
| - request_sender_->StartRequestWithRetry(request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - EXPECT_EQ(HTTP_SUCCESS, result_code);
|
| - EXPECT_EQ(net::test_server::METHOD_POST, http_request_.method);
|
| - EXPECT_EQ("/feeds/default/private/full/folder%3Aroot/contents?v=3&alt=json"
|
| - "&showroot=true",
|
| - http_request_.relative_url);
|
| - EXPECT_EQ("application/atom+xml", http_request_.headers["Content-Type"]);
|
| -
|
| - EXPECT_TRUE(http_request_.has_content);
|
| - EXPECT_EQ("<?xml version=\"1.0\"?>\n"
|
| - "<entry xmlns=\"http://www.w3.org/2005/Atom\">\n"
|
| - " <category scheme=\"http://schemas.google.com/g/2005#kind\" "
|
| - "term=\"http://schemas.google.com/docs/2007#folder\"/>\n"
|
| - " <title>new directory</title>\n"
|
| - "</entry>\n",
|
| - http_request_.content);
|
| -}
|
| -
|
| -TEST_F(GDataWapiRequestsTest, CopyHostedDocumentRequest) {
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| - scoped_ptr<base::Value> result_data;
|
| -
|
| - // Copy a document with a new name "New Document".
|
| - {
|
| - base::RunLoop run_loop;
|
| - CopyHostedDocumentRequest* request = new CopyHostedDocumentRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code, &result_data)),
|
| - "document:5_document_resource_id", // source resource ID
|
| - "New Document");
|
| -
|
| - request_sender_->StartRequestWithRetry(request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - EXPECT_EQ(HTTP_SUCCESS, result_code);
|
| - EXPECT_EQ(net::test_server::METHOD_POST, http_request_.method);
|
| - EXPECT_EQ("/feeds/default/private/full?v=3&alt=json&showroot=true",
|
| - http_request_.relative_url);
|
| - EXPECT_EQ("application/atom+xml", http_request_.headers["Content-Type"]);
|
| -
|
| - EXPECT_TRUE(http_request_.has_content);
|
| - EXPECT_EQ("<?xml version=\"1.0\"?>\n"
|
| - "<entry xmlns=\"http://www.w3.org/2005/Atom\">\n"
|
| - " <id>document:5_document_resource_id</id>\n"
|
| - " <title>New Document</title>\n"
|
| - "</entry>\n",
|
| - http_request_.content);
|
| -}
|
| -
|
| -TEST_F(GDataWapiRequestsTest, RenameResourceRequest) {
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| -
|
| - // Rename a file with a new name "New File".
|
| - {
|
| - base::RunLoop run_loop;
|
| - RenameResourceRequest* request = new RenameResourceRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code)),
|
| - "file:2_file_resource_id",
|
| - "New File");
|
| -
|
| - request_sender_->StartRequestWithRetry(request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - EXPECT_EQ(HTTP_SUCCESS, result_code);
|
| - EXPECT_EQ(net::test_server::METHOD_PUT, http_request_.method);
|
| - EXPECT_EQ(
|
| - "/feeds/default/private/full/file%3A2_file_resource_id?v=3&alt=json"
|
| - "&showroot=true",
|
| - http_request_.relative_url);
|
| - EXPECT_EQ("application/atom+xml", http_request_.headers["Content-Type"]);
|
| - EXPECT_EQ("*", http_request_.headers["If-Match"]);
|
| -
|
| - EXPECT_TRUE(http_request_.has_content);
|
| - EXPECT_EQ("<?xml version=\"1.0\"?>\n"
|
| - "<entry xmlns=\"http://www.w3.org/2005/Atom\">\n"
|
| - " <title>New File</title>\n"
|
| - "</entry>\n",
|
| - http_request_.content);
|
| -}
|
| -
|
| -TEST_F(GDataWapiRequestsTest, AuthorizeAppRequest_ValidFeed) {
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| - GURL result_data;
|
| -
|
| - // Authorize an app with APP_ID to access to a document.
|
| - {
|
| - base::RunLoop run_loop;
|
| - AuthorizeAppRequest* request = new AuthorizeAppRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code, &result_data)),
|
| - "file:2_file_resource_id",
|
| - "the_app_id");
|
| -
|
| - request_sender_->StartRequestWithRetry(request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - EXPECT_EQ(HTTP_SUCCESS, result_code);
|
| - EXPECT_EQ(GURL("https://entry1_open_with_link/"), result_data);
|
| -
|
| - EXPECT_EQ(net::test_server::METHOD_PUT, http_request_.method);
|
| - EXPECT_EQ("/feeds/default/private/full/file%3A2_file_resource_id"
|
| - "?v=3&alt=json&showroot=true",
|
| - http_request_.relative_url);
|
| - EXPECT_EQ("application/atom+xml", http_request_.headers["Content-Type"]);
|
| - EXPECT_EQ("*", http_request_.headers["If-Match"]);
|
| -
|
| - 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"
|
| - " <docs:authorizedApp>the_app_id</docs:authorizedApp>\n"
|
| - "</entry>\n",
|
| - http_request_.content);
|
| -}
|
| -
|
| -TEST_F(GDataWapiRequestsTest, AuthorizeAppRequest_NotFound) {
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| - GURL result_data;
|
| -
|
| - // Authorize an app with APP_ID to access to a document.
|
| - {
|
| - base::RunLoop run_loop;
|
| - AuthorizeAppRequest* request = new AuthorizeAppRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code, &result_data)),
|
| - "file:2_file_resource_id",
|
| - "unauthorized_app_id");
|
| -
|
| - request_sender_->StartRequestWithRetry(request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - EXPECT_EQ(GDATA_OTHER_ERROR, result_code);
|
| - EXPECT_EQ(net::test_server::METHOD_PUT, http_request_.method);
|
| - EXPECT_EQ("/feeds/default/private/full/file%3A2_file_resource_id"
|
| - "?v=3&alt=json&showroot=true",
|
| - http_request_.relative_url);
|
| - EXPECT_EQ("application/atom+xml", http_request_.headers["Content-Type"]);
|
| - EXPECT_EQ("*", http_request_.headers["If-Match"]);
|
| -
|
| - 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"
|
| - " <docs:authorizedApp>unauthorized_app_id</docs:authorizedApp>\n"
|
| - "</entry>\n",
|
| - http_request_.content);
|
| -}
|
| -
|
| -TEST_F(GDataWapiRequestsTest, AuthorizeAppRequest_InvalidFeed) {
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| - GURL result_data;
|
| -
|
| - // Authorize an app with APP_ID to access to a document but an invalid feed.
|
| - {
|
| - base::RunLoop run_loop;
|
| - AuthorizeAppRequest* request = new AuthorizeAppRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code, &result_data)),
|
| - "invalid_resource_id",
|
| - "APP_ID");
|
| -
|
| - request_sender_->StartRequestWithRetry(request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - EXPECT_EQ(GDATA_PARSE_ERROR, result_code);
|
| - EXPECT_EQ(net::test_server::METHOD_PUT, http_request_.method);
|
| - EXPECT_EQ("/feeds/default/private/full/invalid_resource_id"
|
| - "?v=3&alt=json&showroot=true",
|
| - http_request_.relative_url);
|
| - EXPECT_EQ("application/atom+xml", http_request_.headers["Content-Type"]);
|
| - EXPECT_EQ("*", http_request_.headers["If-Match"]);
|
| -
|
| - 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"
|
| - " <docs:authorizedApp>APP_ID</docs:authorizedApp>\n"
|
| - "</entry>\n",
|
| - http_request_.content);
|
| -}
|
| -
|
| -TEST_F(GDataWapiRequestsTest, AddResourceToDirectoryRequest) {
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| -
|
| - // Add a file to the root directory.
|
| - {
|
| - base::RunLoop run_loop;
|
| - AddResourceToDirectoryRequest* request =
|
| - new AddResourceToDirectoryRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code)),
|
| - "folder:root",
|
| - "file:2_file_resource_id");
|
| -
|
| - request_sender_->StartRequestWithRetry(request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - EXPECT_EQ(HTTP_SUCCESS, result_code);
|
| - EXPECT_EQ(net::test_server::METHOD_POST, http_request_.method);
|
| - EXPECT_EQ("/feeds/default/private/full/folder%3Aroot/contents?v=3&alt=json"
|
| - "&showroot=true",
|
| - http_request_.relative_url);
|
| - EXPECT_EQ("application/atom+xml", http_request_.headers["Content-Type"]);
|
| -
|
| - EXPECT_TRUE(http_request_.has_content);
|
| - EXPECT_EQ(base::StringPrintf("<?xml version=\"1.0\"?>\n"
|
| - "<entry xmlns=\"http://www.w3.org/2005/Atom\">\n"
|
| - " <id>%sfeeds/default/private/full/"
|
| - "file%%3A2_file_resource_id</id>\n"
|
| - "</entry>\n",
|
| - test_server_.base_url().spec().c_str()),
|
| - http_request_.content);
|
| -}
|
| -
|
| -TEST_F(GDataWapiRequestsTest, RemoveResourceFromDirectoryRequest) {
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| -
|
| - // Remove a file from the root directory.
|
| - {
|
| - base::RunLoop run_loop;
|
| - RemoveResourceFromDirectoryRequest* request =
|
| - new RemoveResourceFromDirectoryRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code)),
|
| - "folder:root",
|
| - "file:2_file_resource_id");
|
| -
|
| - request_sender_->StartRequestWithRetry(request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - EXPECT_EQ(HTTP_SUCCESS, result_code);
|
| - // DELETE method should be used, without the body content.
|
| - EXPECT_EQ(net::test_server::METHOD_DELETE, http_request_.method);
|
| - EXPECT_EQ("/feeds/default/private/full/folder%3Aroot/contents/"
|
| - "file%3A2_file_resource_id?v=3&alt=json&showroot=true",
|
| - http_request_.relative_url);
|
| - EXPECT_EQ("*", http_request_.headers["If-Match"]);
|
| - EXPECT_FALSE(http_request_.has_content);
|
| -}
|
| -
|
| -// This test exercises InitiateUploadNewFileRequest and
|
| -// ResumeUploadRequest for a scenario of uploading a new file.
|
| -TEST_F(GDataWapiRequestsTest, UploadNewFile) {
|
| - const std::string kUploadContent = "hello";
|
| - const base::FilePath kTestFilePath =
|
| - temp_dir_.path().AppendASCII("upload_file.txt");
|
| - ASSERT_TRUE(test_util::WriteStringToFile(kTestFilePath, kUploadContent));
|
| -
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| - GURL upload_url;
|
| -
|
| - // 1) Get the upload URL for uploading a new file.
|
| - {
|
| - base::RunLoop run_loop;
|
| - InitiateUploadNewFileRequest* initiate_request =
|
| - new InitiateUploadNewFileRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code, &upload_url)),
|
| - "text/plain",
|
| - kUploadContent.size(),
|
| - "folder:id",
|
| - "New file");
|
| - request_sender_->StartRequestWithRetry(initiate_request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - EXPECT_EQ(HTTP_SUCCESS, result_code);
|
| - EXPECT_EQ(test_server_.GetURL("/upload_new_file"), upload_url);
|
| - EXPECT_EQ(net::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/folder%3Aid/contents"
|
| - "?convert=false&v=3&alt=json&showroot=true",
|
| - 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);
|
| -
|
| - // 2) Upload the content to the upload URL.
|
| - UploadRangeResponse response;
|
| - scoped_ptr<ResourceEntry> new_entry;
|
| -
|
| - {
|
| - base::RunLoop run_loop;
|
| - ResumeUploadRequest* resume_request = new ResumeUploadRequest(
|
| - request_sender_.get(),
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&response, &new_entry)),
|
| - ProgressCallback(),
|
| - upload_url,
|
| - 0, // start_position
|
| - kUploadContent.size(), // end_position (exclusive)
|
| - kUploadContent.size(), // content_length,
|
| - "text/plain", // content_type
|
| - kTestFilePath);
|
| -
|
| - request_sender_->StartRequestWithRetry(resume_request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - // METHOD_PUT should be used to upload data.
|
| - EXPECT_EQ(net::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 0-" +
|
| - base::Int64ToString(kUploadContent.size() -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(kUploadContent, http_request_.content);
|
| -
|
| - // Check the response.
|
| - 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);
|
| -}
|
| -
|
| -// This test exercises InitiateUploadNewFileRequest and ResumeUploadRequest
|
| -// for a scenario of uploading a new *large* file, which requires multiple
|
| -// requests of ResumeUploadRequest. GetUploadRequest is also tested in this
|
| -// test case.
|
| -TEST_F(GDataWapiRequestsTest, UploadNewLargeFile) {
|
| - const size_t kMaxNumBytes = 10;
|
| - // This is big enough to cause multiple requests of ResumeUploadRequest
|
| - // as we are going to send at most kMaxNumBytes at a time.
|
| - // So, sending "kMaxNumBytes * 2 + 1" bytes ensures three
|
| - // ResumeUploadRequests, which are start, middle and last requests.
|
| - const std::string kUploadContent(kMaxNumBytes * 2 + 1, 'a');
|
| - const base::FilePath kTestFilePath =
|
| - temp_dir_.path().AppendASCII("upload_file.txt");
|
| - ASSERT_TRUE(test_util::WriteStringToFile(kTestFilePath, kUploadContent));
|
| -
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| - GURL upload_url;
|
| -
|
| - // 1) Get the upload URL for uploading a new file.
|
| - {
|
| - base::RunLoop run_loop;
|
| - InitiateUploadNewFileRequest* initiate_request =
|
| - new InitiateUploadNewFileRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code, &upload_url)),
|
| - "text/plain",
|
| - kUploadContent.size(),
|
| - "folder:id",
|
| - "New file");
|
| - request_sender_->StartRequestWithRetry(initiate_request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - EXPECT_EQ(HTTP_SUCCESS, result_code);
|
| - EXPECT_EQ(test_server_.GetURL("/upload_new_file"), upload_url);
|
| - EXPECT_EQ(net::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/folder%3Aid/contents"
|
| - "?convert=false&v=3&alt=json&showroot=true",
|
| - 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);
|
| -
|
| - // 2) Before sending any data, check the current status.
|
| - // This is an edge case test for GetUploadStatusRequest
|
| - // (UploadRangeRequestBase).
|
| - {
|
| - UploadRangeResponse response;
|
| - scoped_ptr<ResourceEntry> new_entry;
|
| -
|
| - // Check the response by GetUploadStatusRequest.
|
| - {
|
| - base::RunLoop run_loop;
|
| - GetUploadStatusRequest* get_upload_status_request =
|
| - new GetUploadStatusRequest(
|
| - request_sender_.get(),
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&response, &new_entry)),
|
| - upload_url,
|
| - kUploadContent.size());
|
| - request_sender_->StartRequestWithRetry(get_upload_status_request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - // METHOD_PUT should be used to upload data.
|
| - EXPECT_EQ(net::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) {
|
| - 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();
|
| -
|
| - UploadRangeResponse response;
|
| - scoped_ptr<ResourceEntry> new_entry;
|
| -
|
| - {
|
| - base::RunLoop run_loop;
|
| - ResumeUploadRequest* resume_request = new ResumeUploadRequest(
|
| - request_sender_.get(),
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&response, &new_entry)),
|
| - ProgressCallback(),
|
| - upload_url,
|
| - start_position,
|
| - end_position,
|
| - kUploadContent.size(), // content_length,
|
| - "text/plain", // content_type
|
| - kTestFilePath);
|
| - request_sender_->StartRequestWithRetry(resume_request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - // METHOD_PUT should be used to upload data.
|
| - EXPECT_EQ(net::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(0, response.start_position_received);
|
| - EXPECT_EQ(static_cast<int64>(end_position),
|
| - response.end_position_received);
|
| -
|
| - // Check the response by GetUploadStatusRequest.
|
| - {
|
| - base::RunLoop run_loop;
|
| - GetUploadStatusRequest* get_upload_status_request =
|
| - new GetUploadStatusRequest(
|
| - request_sender_.get(),
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&response, &new_entry)),
|
| - upload_url,
|
| - kUploadContent.size());
|
| - request_sender_->StartRequestWithRetry(get_upload_status_request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - // METHOD_PUT should be used to upload data.
|
| - EXPECT_EQ(net::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(static_cast<int64>(end_position),
|
| - response.end_position_received);
|
| - }
|
| -
|
| - EXPECT_EQ(kUploadContent.size(), num_bytes_consumed);
|
| -}
|
| -
|
| -// This test exercises InitiateUploadNewFileRequest and ResumeUploadRequest
|
| -// for a scenario of uploading a new *empty* file.
|
| -//
|
| -// The test is almost identical to UploadNewFile. The only difference is the
|
| -// expectation for the Content-Range header.
|
| -TEST_F(GDataWapiRequestsTest, UploadNewEmptyFile) {
|
| - const std::string kUploadContent;
|
| - const base::FilePath kTestFilePath =
|
| - temp_dir_.path().AppendASCII("empty_file.txt");
|
| - ASSERT_TRUE(test_util::WriteStringToFile(kTestFilePath, kUploadContent));
|
| -
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| - GURL upload_url;
|
| -
|
| - // 1) Get the upload URL for uploading a new file.
|
| - {
|
| - base::RunLoop run_loop;
|
| - InitiateUploadNewFileRequest* initiate_request =
|
| - new InitiateUploadNewFileRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code, &upload_url)),
|
| - "text/plain",
|
| - kUploadContent.size(),
|
| - "folder:id",
|
| - "New file");
|
| - request_sender_->StartRequestWithRetry(initiate_request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - EXPECT_EQ(HTTP_SUCCESS, result_code);
|
| - EXPECT_EQ(test_server_.GetURL("/upload_new_file"), upload_url);
|
| - EXPECT_EQ(net::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/folder%3Aid/contents"
|
| - "?convert=false&v=3&alt=json&showroot=true",
|
| - 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);
|
| -
|
| - // 2) Upload the content to the upload URL.
|
| - UploadRangeResponse response;
|
| - scoped_ptr<ResourceEntry> new_entry;
|
| -
|
| - {
|
| - base::RunLoop run_loop;
|
| - ResumeUploadRequest* resume_request = new ResumeUploadRequest(
|
| - request_sender_.get(),
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&response, &new_entry)),
|
| - ProgressCallback(),
|
| - upload_url,
|
| - 0, // start_position
|
| - kUploadContent.size(), // end_position (exclusive)
|
| - kUploadContent.size(), // content_length,
|
| - "text/plain", // content_type
|
| - kTestFilePath);
|
| - request_sender_->StartRequestWithRetry(resume_request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - // METHOD_PUT should be used to upload data.
|
| - EXPECT_EQ(net::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 not exit if the content is empty.
|
| - // We should not generate the header with an invalid value "bytes 0--1/0".
|
| - EXPECT_EQ(0U, http_request_.headers.count("Content-Range"));
|
| - // The upload content should be set in the HTTP request.
|
| - EXPECT_TRUE(http_request_.has_content);
|
| - EXPECT_EQ(kUploadContent, http_request_.content);
|
| -
|
| - // Check the response.
|
| - 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);
|
| -}
|
| -
|
| -// This test exercises InitiateUploadExistingFileRequest and
|
| -// ResumeUploadRequest for a scenario of updating an existing file.
|
| -TEST_F(GDataWapiRequestsTest, UploadExistingFile) {
|
| - const std::string kUploadContent = "hello";
|
| - const base::FilePath kTestFilePath =
|
| - temp_dir_.path().AppendASCII("upload_file.txt");
|
| - ASSERT_TRUE(test_util::WriteStringToFile(kTestFilePath, kUploadContent));
|
| -
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| - GURL upload_url;
|
| -
|
| - // 1) Get the upload URL for uploading an existing file.
|
| - {
|
| - base::RunLoop run_loop;
|
| - InitiateUploadExistingFileRequest* initiate_request =
|
| - new InitiateUploadExistingFileRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code, &upload_url)),
|
| - "text/plain",
|
| - kUploadContent.size(),
|
| - "file:foo",
|
| - std::string() /* etag */);
|
| - request_sender_->StartRequestWithRetry(initiate_request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - EXPECT_EQ(HTTP_SUCCESS, result_code);
|
| - EXPECT_EQ(test_server_.GetURL("/upload_existing_file"), upload_url);
|
| - // For updating an existing file, METHOD_PUT should be used.
|
| - EXPECT_EQ(net::test_server::METHOD_PUT, http_request_.method);
|
| - // convert=false should be passed as files should be uploaded as-is.
|
| - EXPECT_EQ("/feeds/upload/create-session/default/private/full/file%3Afoo"
|
| - "?convert=false&v=3&alt=json&showroot=true",
|
| - http_request_.relative_url);
|
| - // Even though the body is empty, the content type should be set to
|
| - // "text/plain".
|
| - EXPECT_EQ("text/plain", http_request_.headers["Content-Type"]);
|
| - EXPECT_EQ("text/plain", http_request_.headers["X-Upload-Content-Type"]);
|
| - EXPECT_EQ(base::Int64ToString(kUploadContent.size()),
|
| - http_request_.headers["X-Upload-Content-Length"]);
|
| - // For updating an existing file, an empty body should be attached (PUT
|
| - // requires a body)
|
| - EXPECT_TRUE(http_request_.has_content);
|
| - EXPECT_EQ("", http_request_.content);
|
| - EXPECT_EQ("*", http_request_.headers["If-Match"]);
|
| -
|
| - // 2) Upload the content to the upload URL.
|
| - UploadRangeResponse response;
|
| - scoped_ptr<ResourceEntry> new_entry;
|
| -
|
| - {
|
| - base::RunLoop run_loop;
|
| - ResumeUploadRequest* resume_request = new ResumeUploadRequest(
|
| - request_sender_.get(),
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&response, &new_entry)),
|
| - ProgressCallback(),
|
| - upload_url,
|
| - 0, // start_position
|
| - kUploadContent.size(), // end_position (exclusive)
|
| - kUploadContent.size(), // content_length,
|
| - "text/plain", // content_type
|
| - kTestFilePath);
|
| -
|
| - request_sender_->StartRequestWithRetry(resume_request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - // METHOD_PUT should be used to upload data.
|
| - EXPECT_EQ(net::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 0-" +
|
| - base::Int64ToString(kUploadContent.size() -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(kUploadContent, http_request_.content);
|
| -
|
| - // Check the response.
|
| - EXPECT_EQ(HTTP_SUCCESS, response.code); // Because it's an existing 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);
|
| -}
|
| -
|
| -// This test exercises InitiateUploadExistingFileRequest and
|
| -// ResumeUploadRequest for a scenario of updating an existing file.
|
| -TEST_F(GDataWapiRequestsTest, UploadExistingFileWithETag) {
|
| - const std::string kUploadContent = "hello";
|
| - const base::FilePath kTestFilePath =
|
| - temp_dir_.path().AppendASCII("upload_file.txt");
|
| - ASSERT_TRUE(test_util::WriteStringToFile(kTestFilePath, kUploadContent));
|
| -
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| - GURL upload_url;
|
| -
|
| - // 1) Get the upload URL for uploading an existing file.
|
| - {
|
| - base::RunLoop run_loop;
|
| - InitiateUploadExistingFileRequest* initiate_request =
|
| - new InitiateUploadExistingFileRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code, &upload_url)),
|
| - "text/plain",
|
| - kUploadContent.size(),
|
| - "file:foo",
|
| - kTestETag);
|
| - request_sender_->StartRequestWithRetry(initiate_request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - EXPECT_EQ(HTTP_SUCCESS, result_code);
|
| - EXPECT_EQ(test_server_.GetURL("/upload_existing_file"), upload_url);
|
| - // For updating an existing file, METHOD_PUT should be used.
|
| - EXPECT_EQ(net::test_server::METHOD_PUT, http_request_.method);
|
| - // convert=false should be passed as files should be uploaded as-is.
|
| - EXPECT_EQ("/feeds/upload/create-session/default/private/full/file%3Afoo"
|
| - "?convert=false&v=3&alt=json&showroot=true",
|
| - http_request_.relative_url);
|
| - // Even though the body is empty, the content type should be set to
|
| - // "text/plain".
|
| - EXPECT_EQ("text/plain", http_request_.headers["Content-Type"]);
|
| - EXPECT_EQ("text/plain", http_request_.headers["X-Upload-Content-Type"]);
|
| - EXPECT_EQ(base::Int64ToString(kUploadContent.size()),
|
| - http_request_.headers["X-Upload-Content-Length"]);
|
| - // For updating an existing file, an empty body should be attached (PUT
|
| - // requires a body)
|
| - EXPECT_TRUE(http_request_.has_content);
|
| - EXPECT_EQ("", http_request_.content);
|
| - EXPECT_EQ(kTestETag, http_request_.headers["If-Match"]);
|
| -
|
| - // 2) Upload the content to the upload URL.
|
| - UploadRangeResponse response;
|
| - scoped_ptr<ResourceEntry> new_entry;
|
| -
|
| - {
|
| - base::RunLoop run_loop;
|
| - ResumeUploadRequest* resume_request = new ResumeUploadRequest(
|
| - request_sender_.get(),
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&response, &new_entry)),
|
| - ProgressCallback(),
|
| - upload_url,
|
| - 0, // start_position
|
| - kUploadContent.size(), // end_position (exclusive)
|
| - kUploadContent.size(), // content_length,
|
| - "text/plain", // content_type
|
| - kTestFilePath);
|
| - request_sender_->StartRequestWithRetry(resume_request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - // METHOD_PUT should be used to upload data.
|
| - EXPECT_EQ(net::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 0-" +
|
| - base::Int64ToString(kUploadContent.size() -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(kUploadContent, http_request_.content);
|
| -
|
| - // Check the response.
|
| - EXPECT_EQ(HTTP_SUCCESS, response.code); // Because it's an existing 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);
|
| -}
|
| -
|
| -// This test exercises InitiateUploadExistingFileRequest for a scenario of
|
| -// confliction on updating an existing file.
|
| -TEST_F(GDataWapiRequestsTest, UploadExistingFileWithETagConflict) {
|
| - const std::string kUploadContent = "hello";
|
| - const std::string kWrongETag = "wrong_etag";
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| - GURL upload_url;
|
| -
|
| - {
|
| - base::RunLoop run_loop;
|
| - InitiateUploadExistingFileRequest* initiate_request =
|
| - new InitiateUploadExistingFileRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code, &upload_url)),
|
| - "text/plain",
|
| - kUploadContent.size(),
|
| - "file:foo",
|
| - kWrongETag);
|
| - request_sender_->StartRequestWithRetry(initiate_request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - EXPECT_EQ(HTTP_PRECONDITION, result_code);
|
| - // For updating an existing file, METHOD_PUT should be used.
|
| - EXPECT_EQ(net::test_server::METHOD_PUT, http_request_.method);
|
| - // convert=false should be passed as files should be uploaded as-is.
|
| - EXPECT_EQ("/feeds/upload/create-session/default/private/full/file%3Afoo"
|
| - "?convert=false&v=3&alt=json&showroot=true",
|
| - http_request_.relative_url);
|
| - // Even though the body is empty, the content type should be set to
|
| - // "text/plain".
|
| - EXPECT_EQ("text/plain", http_request_.headers["Content-Type"]);
|
| - EXPECT_EQ("text/plain", http_request_.headers["X-Upload-Content-Type"]);
|
| - EXPECT_EQ(base::Int64ToString(kUploadContent.size()),
|
| - http_request_.headers["X-Upload-Content-Length"]);
|
| - // For updating an existing file, an empty body should be attached (PUT
|
| - // requires a body)
|
| - EXPECT_TRUE(http_request_.has_content);
|
| - EXPECT_EQ("", http_request_.content);
|
| - EXPECT_EQ(kWrongETag, http_request_.headers["If-Match"]);
|
| -}
|
| -
|
| -TEST_F(GDataWapiRequestsTest, DownloadFileRequest) {
|
| - const base::FilePath kDownloadedFilePath =
|
| - temp_dir_.path().AppendASCII("cache_file");
|
| - const std::string kTestIdWithTypeLabel("file:dummyId");
|
| - const std::string kTestId("dummyId");
|
| -
|
| - GDataErrorCode result_code = GDATA_OTHER_ERROR;
|
| - base::FilePath temp_file;
|
| - {
|
| - base::RunLoop run_loop;
|
| - DownloadFileRequest* request = new DownloadFileRequest(
|
| - request_sender_.get(),
|
| - *url_generator_,
|
| - test_util::CreateQuitCallback(
|
| - &run_loop,
|
| - test_util::CreateCopyResultCallback(&result_code, &temp_file)),
|
| - GetContentCallback(),
|
| - ProgressCallback(),
|
| - kTestIdWithTypeLabel,
|
| - kDownloadedFilePath);
|
| - request_sender_->StartRequestWithRetry(request);
|
| - run_loop.Run();
|
| - }
|
| -
|
| - std::string contents;
|
| - base::ReadFileToString(temp_file, &contents);
|
| - base::DeleteFile(temp_file, false);
|
| -
|
| - EXPECT_EQ(HTTP_SUCCESS, result_code);
|
| - EXPECT_EQ(net::test_server::METHOD_GET, http_request_.method);
|
| - EXPECT_EQ(kTestDownloadPathPrefix + kTestId, http_request_.relative_url);
|
| - EXPECT_EQ(kDownloadedFilePath, temp_file);
|
| -
|
| - const std::string expected_contents = kTestId + kTestId + kTestId;
|
| - EXPECT_EQ(expected_contents, contents);
|
| -}
|
| -
|
| -} // namespace google_apis
|
|
|