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