12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/base_requests.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/message_loop/message_loop.h" 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/run_loop.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/dummy_auth_service.h" 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/request_sender.h" 14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/test_util.h" 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "net/test/embedded_test_server/embedded_test_server.h" 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "net/test/embedded_test_server/http_request.h" 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "net/test/embedded_test_server/http_response.h" 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "net/url_request/url_request_test_util.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace google_apis { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kValidJsonString[] = "{ \"test\": 123 }"; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kInvalidJsonString[] = "$$$"; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class FakeUrlFetchRequest : public UrlFetchRequestBase { 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) FakeUrlFetchRequest(RequestSender* sender, 316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const EntryActionCallback& callback, 326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const GURL& url) 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : UrlFetchRequestBase(sender), 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) callback_(callback), 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) url_(url) { 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~FakeUrlFetchRequest() { 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected: 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual GURL GetURL() const OVERRIDE { return url_; } 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void ProcessURLFetchResults(const net::URLFetcher* source) OVERRIDE { 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) callback_.Run(GetErrorCode()); 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void RunCallbackOnPrematureFailure(GDataErrorCode code) OVERRIDE { 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) callback_.Run(code); 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EntryActionCallback callback_; 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GURL url_; 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class BaseRequestsTest : public testing::Test { 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BaseRequestsTest() : response_code_(net::HTTP_OK) {} 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUp() OVERRIDE { 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) request_context_getter_ = new net::TestURLRequestContextGetter( 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) message_loop_.message_loop_proxy()); 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 649ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch sender_.reset(new RequestSender(new DummyAuthService, 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) request_context_getter_.get(), 667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch message_loop_.message_loop_proxy(), 677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string() /* custom user agent */)); 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(test_server_.InitializeAndWaitUntilReady()); 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_server_.RegisterRequestHandler( 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&BaseRequestsTest::HandleRequest, base::Unretained(this))); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<net::test_server::HttpResponse> HandleRequest( 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const net::test_server::HttpRequest& request) { 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<net::test_server::BasicHttpResponse> response( 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new net::test_server::BasicHttpResponse); 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) response->set_code(response_code_); 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) response->set_content(response_body_); 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) response->set_content_type("application/json"); 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return response.PassAs<net::test_server::HttpResponse>(); 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::MessageLoopForIO message_loop_; 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<net::TestURLRequestContextGetter> request_context_getter_; 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<RequestSender> sender_; 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::test_server::EmbeddedTestServer test_server_; 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::HttpStatusCode response_code_; 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string response_body_; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(BaseRequestsTest, ParseValidJson) { 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<base::Value> json(ParseJson(kValidJsonString)); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* root_dict = NULL; 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(json); 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(json->GetAsDictionary(&root_dict)); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int int_value = 0; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(root_dict->GetInteger("test", &int_value)); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(123, int_value); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(BaseRequestsTest, ParseInvalidJson) { 1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(ParseJson(kInvalidJsonString)); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(BaseRequestsTest, UrlFetchRequestBaseResponseCodeOverride) { 110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) response_code_ = net::HTTP_FORBIDDEN; 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) response_body_ = 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "{\"error\": {\n" 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) " \"errors\": [\n" 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) " {\n" 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) " \"domain\": \"usageLimits\",\n" 116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) " \"reason\": \"rateLimitExceeded\",\n" 117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) " \"message\": \"Rate Limit Exceeded\"\n" 118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) " }\n" 119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) " ],\n" 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) " \"code\": 403,\n" 121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) " \"message\": \"Rate Limit Exceeded\"\n" 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) " }\n" 123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "}\n"; 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GDataErrorCode error = GDATA_OTHER_ERROR; 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::RunLoop run_loop; 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) sender_->StartRequestWithRetry( 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new FakeUrlFetchRequest( 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) sender_.get(), 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_util::CreateQuitCallback( 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) &run_loop, test_util::CreateCopyResultCallback(&error)), 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_server_.base_url())); 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) run_loop.Run(); 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // HTTP_FORBIDDEN (403) is overridden by the error reason. 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(HTTP_SERVICE_UNAVAILABLE, error); 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace google_apis 140