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