Home | History | Annotate | Download | only in drive
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/bind.h"
      6 #include "base/message_loop/message_loop.h"
      7 #include "base/run_loop.h"
      8 #include "base/values.h"
      9 #include "google_apis/drive/dummy_auth_service.h"
     10 #include "google_apis/drive/gdata_wapi_parser.h"
     11 #include "google_apis/drive/gdata_wapi_requests.h"
     12 #include "google_apis/drive/gdata_wapi_url_generator.h"
     13 #include "google_apis/drive/request_sender.h"
     14 #include "google_apis/drive/test_util.h"
     15 #include "net/base/escape.h"
     16 #include "net/test/embedded_test_server/embedded_test_server.h"
     17 #include "net/test/embedded_test_server/http_request.h"
     18 #include "net/test/embedded_test_server/http_response.h"
     19 #include "net/url_request/url_request_test_util.h"
     20 #include "testing/gtest/include/gtest/gtest.h"
     21 
     22 namespace google_apis {
     23 
     24 namespace {
     25 
     26 const char kTestUserAgent[] = "test-user-agent";
     27 
     28 class GDataWapiRequestsTest : public testing::Test {
     29  public:
     30   virtual void SetUp() OVERRIDE {
     31     request_context_getter_ = new net::TestURLRequestContextGetter(
     32         message_loop_.message_loop_proxy());
     33 
     34     request_sender_.reset(new RequestSender(new DummyAuthService,
     35                                             request_context_getter_.get(),
     36                                             message_loop_.message_loop_proxy(),
     37                                             kTestUserAgent));
     38 
     39     ASSERT_TRUE(test_server_.InitializeAndWaitUntilReady());
     40     test_server_.RegisterRequestHandler(
     41         base::Bind(&GDataWapiRequestsTest::HandleResourceFeedRequest,
     42                    base::Unretained(this)));
     43 
     44     GURL test_base_url = test_util::GetBaseUrlForTesting(test_server_.port());
     45     url_generator_.reset(new GDataWapiUrlGenerator(test_base_url));
     46   }
     47 
     48  protected:
     49   // Handles a request for fetching a resource feed.
     50   scoped_ptr<net::test_server::HttpResponse> HandleResourceFeedRequest(
     51       const net::test_server::HttpRequest& request) {
     52     http_request_ = request;
     53 
     54     const GURL absolute_url = test_server_.GetURL(request.relative_url);
     55     std::string remaining_path;
     56 
     57     if (!test_util::RemovePrefix(absolute_url.path(),
     58                                  "/feeds/default/private/full",
     59                                  &remaining_path)) {
     60       return scoped_ptr<net::test_server::HttpResponse>();
     61     }
     62 
     63     // Process a feed for a single resource ID.
     64     const std::string resource_id = net::UnescapeURLComponent(
     65         remaining_path.substr(1), net::UnescapeRule::URL_SPECIAL_CHARS);
     66     if (resource_id == "file:2_file_resource_id") {
     67       scoped_ptr<net::test_server::BasicHttpResponse> result(
     68           test_util::CreateHttpResponseFromFile(
     69               test_util::GetTestFilePath("gdata/file_entry.json")));
     70       return result.PassAs<net::test_server::HttpResponse>();
     71     } else if (resource_id == "invalid_resource_id") {
     72       // Check if this is an authorization request for an app.
     73       // This emulates to return invalid formatted result from the server.
     74       if (request.method == net::test_server::METHOD_PUT &&
     75           request.content.find("<docs:authorizedApp>") != std::string::npos) {
     76         scoped_ptr<net::test_server::BasicHttpResponse> result(
     77             test_util::CreateHttpResponseFromFile(
     78                 test_util::GetTestFilePath("gdata/testfile.txt")));
     79         return result.PassAs<net::test_server::HttpResponse>();
     80       }
     81     }
     82 
     83     return scoped_ptr<net::test_server::HttpResponse>();
     84   }
     85 
     86   base::MessageLoopForIO message_loop_;  // Test server needs IO thread.
     87   net::test_server::EmbeddedTestServer test_server_;
     88   scoped_ptr<RequestSender> request_sender_;
     89   scoped_ptr<GDataWapiUrlGenerator> url_generator_;
     90   scoped_refptr<net::TestURLRequestContextGetter> request_context_getter_;
     91 
     92   // The incoming HTTP request is saved so tests can verify the request
     93   // parameters like HTTP method (ex. some requests should use DELETE
     94   // instead of GET).
     95   net::test_server::HttpRequest http_request_;
     96 };
     97 
     98 }  // namespace
     99 
    100 TEST_F(GDataWapiRequestsTest, GetResourceEntryRequest_ValidResourceId) {
    101   GDataErrorCode result_code = GDATA_OTHER_ERROR;
    102   scoped_ptr<base::Value> result_data;
    103 
    104   {
    105     base::RunLoop run_loop;
    106     GetResourceEntryRequest* request = new GetResourceEntryRequest(
    107         request_sender_.get(),
    108         *url_generator_,
    109         "file:2_file_resource_id",  // resource ID
    110         GURL(),  // embed origin
    111         test_util::CreateQuitCallback(
    112             &run_loop,
    113             test_util::CreateCopyResultCallback(&result_code, &result_data)));
    114     request_sender_->StartRequestWithRetry(request);
    115     run_loop.Run();
    116   }
    117 
    118   EXPECT_EQ(HTTP_SUCCESS, result_code);
    119   EXPECT_EQ(net::test_server::METHOD_GET, http_request_.method);
    120   EXPECT_EQ("/feeds/default/private/full/file%3A2_file_resource_id"
    121             "?v=3&alt=json&showroot=true",
    122             http_request_.relative_url);
    123   scoped_ptr<base::Value> expected_json =
    124       test_util::LoadJSONFile("gdata/file_entry.json");
    125   ASSERT_TRUE(expected_json);
    126   EXPECT_TRUE(result_data);
    127   EXPECT_TRUE(base::Value::Equals(expected_json.get(), result_data.get()));
    128 }
    129 
    130 TEST_F(GDataWapiRequestsTest, GetResourceEntryRequest_InvalidResourceId) {
    131   GDataErrorCode result_code = GDATA_OTHER_ERROR;
    132   scoped_ptr<base::Value> result_data;
    133 
    134   {
    135     base::RunLoop run_loop;
    136     GetResourceEntryRequest* request = new GetResourceEntryRequest(
    137         request_sender_.get(),
    138         *url_generator_,
    139         "<invalid>",  // resource ID
    140         GURL(),  // embed origin
    141         test_util::CreateQuitCallback(
    142             &run_loop,
    143             test_util::CreateCopyResultCallback(&result_code, &result_data)));
    144     request_sender_->StartRequestWithRetry(request);
    145     run_loop.Run();
    146   }
    147 
    148   EXPECT_EQ(HTTP_NOT_FOUND, result_code);
    149   EXPECT_EQ(net::test_server::METHOD_GET, http_request_.method);
    150   EXPECT_EQ("/feeds/default/private/full/%3Cinvalid%3E?v=3&alt=json"
    151             "&showroot=true",
    152             http_request_.relative_url);
    153   ASSERT_FALSE(result_data);
    154 }
    155 
    156 }  // namespace google_apis
    157