privet_confirm_api_flow_unittest.cc revision 0529e5d033099cbfc42635f6f6183833b09dff6e
1// Copyright 2013 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 "chrome/browser/local_discovery/privet_confirm_api_flow.h"
8#include "content/public/test/test_browser_thread.h"
9#include "google_apis/gaia/fake_oauth2_token_service.h"
10#include "google_apis/gaia/google_service_auth_error.h"
11#include "net/base/host_port_pair.h"
12#include "net/base/net_errors.h"
13#include "net/http/http_request_headers.h"
14#include "net/url_request/test_url_fetcher_factory.h"
15#include "net/url_request/url_request_test_util.h"
16#include "testing/gmock/include/gmock/gmock.h"
17#include "testing/gtest/include/gtest/gtest.h"
18
19using testing::NiceMock;
20
21namespace local_discovery {
22
23namespace {
24
25const char kSampleConfirmResponse[] = "{"
26    "   \"success\": true"
27    "}";
28
29const char kFailedConfirmResponse[] = "{"
30    "   \"success\": false"
31    "}";
32
33const char kFailedConfirmResponseBadJson[] = "["
34    "   \"success\""
35    "]";
36
37const char kGCDConfirmResponse[] =
38    "{"
39    "   \"kind\": \"clouddevices#registrationTicket\""
40    "}";
41
42const char kAccountId[] = "account_id";
43
44class MockableConfirmCallback {
45 public:
46  MOCK_METHOD1(ConfirmCallback, void(GCDBaseApiFlow::Status));
47
48  PrivetConfirmApiCallFlow::ResponseCallback callback() {
49    return base::Bind(&MockableConfirmCallback::ConfirmCallback,
50                      base::Unretained(this));
51  }
52};
53
54class PrivetConfirmApiFlowTest : public testing::Test {
55 public:
56  PrivetConfirmApiFlowTest()
57      : ui_thread_(content::BrowserThread::UI,
58                   &loop_),
59        request_context_(new net::TestURLRequestContextGetter(
60            base::MessageLoopProxy::current())),
61        account_id_(kAccountId) {
62    token_service_.set_request_context(request_context_.get());
63    token_service_.AddAccount(account_id_);
64    ui_thread_.Stop();  // HACK: Fake being on the UI thread
65  }
66
67  virtual ~PrivetConfirmApiFlowTest() {
68  }
69
70 protected:
71  base::MessageLoopForUI loop_;
72  content::TestBrowserThread ui_thread_;
73  scoped_refptr<net::TestURLRequestContextGetter> request_context_;
74  net::TestURLFetcherFactory fetcher_factory_;
75  FakeOAuth2TokenService token_service_;
76  MockableConfirmCallback callback_;
77  std::string account_id_;
78};
79
80TEST_F(PrivetConfirmApiFlowTest, SuccessOAuth2) {
81  PrivetConfirmApiCallFlow confirm_flow(request_context_.get(),
82                                        &token_service_,
83                                        account_id_,
84                                        true,
85                                        "SomeToken",
86                                        callback_.callback());
87  GCDBaseApiFlow* cloudprint_flow = confirm_flow.GetBaseApiFlowForTests();
88
89  confirm_flow.Start();
90
91  cloudprint_flow->OnGetTokenSuccess(NULL, "SomeToken", base::Time());
92  net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
93
94  EXPECT_EQ(GURL("https://www.google.com/cloudprint/confirm?token=SomeToken"),
95            fetcher->GetOriginalURL());
96
97  net::HttpRequestHeaders headers;
98  fetcher->GetExtraRequestHeaders(&headers);
99  std::string oauth_header;
100  std::string proxy;
101  EXPECT_TRUE(headers.GetHeader("Authorization", &oauth_header));
102  EXPECT_EQ("Bearer SomeToken", oauth_header);
103  EXPECT_TRUE(headers.GetHeader("X-Cloudprint-Proxy", &proxy));
104  EXPECT_EQ("Chrome", proxy);
105
106  fetcher->SetResponseString(kSampleConfirmResponse);
107  fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
108                                            net::OK));
109  fetcher->set_response_code(200);
110
111  EXPECT_CALL(callback_, ConfirmCallback(GCDBaseApiFlow::SUCCESS));
112
113  fetcher->delegate()->OnURLFetchComplete(fetcher);
114}
115
116TEST_F(PrivetConfirmApiFlowTest, BadToken) {
117  PrivetConfirmApiCallFlow confirm_flow(request_context_.get(),
118                                        &token_service_,
119                                        account_id_,
120                                        true,
121                                        "SomeCloudprintToken",
122                                        callback_.callback());
123
124  confirm_flow.Start();
125
126  GCDBaseApiFlow* cloudprint_flow = confirm_flow.GetBaseApiFlowForTests();
127
128  EXPECT_CALL(callback_, ConfirmCallback(GCDBaseApiFlow::ERROR_TOKEN));
129  cloudprint_flow->OnGetTokenFailure(NULL, GoogleServiceAuthError(
130      GoogleServiceAuthError::USER_NOT_SIGNED_UP));
131}
132
133TEST_F(PrivetConfirmApiFlowTest, ServerFailure) {
134  PrivetConfirmApiCallFlow confirm_flow(request_context_.get(),
135                                        &token_service_,
136                                        account_id_,
137                                        true,
138                                        "SomeToken",
139                                        callback_.callback());
140
141  confirm_flow.Start();
142
143  GCDBaseApiFlow* cloudprint_flow = confirm_flow.GetBaseApiFlowForTests();
144
145  cloudprint_flow->OnGetTokenSuccess(NULL, "SomeToken", base::Time());
146  net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
147
148  EXPECT_EQ(GURL("https://www.google.com/cloudprint/confirm?token=SomeToken"),
149            fetcher->GetOriginalURL());
150
151  fetcher->SetResponseString(kFailedConfirmResponse);
152  fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
153                                            net::OK));
154  fetcher->set_response_code(200);
155
156  EXPECT_CALL(callback_, ConfirmCallback(GCDBaseApiFlow::ERROR_FROM_SERVER));
157
158  fetcher->delegate()->OnURLFetchComplete(fetcher);
159}
160
161TEST_F(PrivetConfirmApiFlowTest, BadJson) {
162  PrivetConfirmApiCallFlow confirm_flow(request_context_.get(),
163                                        &token_service_,
164                                        account_id_,
165                                        true,
166                                        "SomeToken",
167                                        callback_.callback());
168
169  confirm_flow.Start();
170
171  GCDBaseApiFlow* cloudprint_flow = confirm_flow.GetBaseApiFlowForTests();
172
173  cloudprint_flow->OnGetTokenSuccess(NULL, "SomeToken", base::Time());
174  net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
175
176  EXPECT_EQ(GURL("https://www.google.com/cloudprint/confirm?token=SomeToken"),
177            fetcher->GetOriginalURL());
178
179  fetcher->SetResponseString(kFailedConfirmResponseBadJson);
180  fetcher->set_status(net::URLRequestStatus(
181      net::URLRequestStatus::SUCCESS,
182      net::OK));
183  fetcher->set_response_code(200);
184
185  EXPECT_CALL(callback_,
186              ConfirmCallback(GCDBaseApiFlow::ERROR_MALFORMED_RESPONSE));
187
188  fetcher->delegate()->OnURLFetchComplete(fetcher);
189}
190
191TEST_F(PrivetConfirmApiFlowTest, SuccessGCD) {
192  PrivetConfirmApiCallFlow confirm_flow(request_context_.get(),
193                                        &token_service_,
194                                        account_id_,
195                                        false,
196                                        "SomeGcdToken",
197                                        callback_.callback());
198  GCDBaseApiFlow* gcd_flow = confirm_flow.GetBaseApiFlowForTests();
199
200  confirm_flow.Start();
201
202  gcd_flow->OnGetTokenSuccess(NULL, "SomeToken", base::Time());
203  net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
204
205  EXPECT_EQ(GURL("https://www.googleapis.com/clouddevices/v1/"
206                 "registrationTickets/SomeGcdToken"),
207            fetcher->GetOriginalURL());
208
209  EXPECT_EQ("{ \"userEmail\": \"me\" }", fetcher->upload_data());
210
211  net::HttpRequestHeaders headers;
212  fetcher->GetExtraRequestHeaders(&headers);
213  std::string oauth_header;
214  std::string proxy;
215  EXPECT_TRUE(headers.GetHeader("Authorization", &oauth_header));
216  EXPECT_EQ("Bearer SomeToken", oauth_header);
217  EXPECT_FALSE(headers.GetHeader("X-Cloudprint-Proxy", &proxy));
218
219  fetcher->SetResponseString(kGCDConfirmResponse);
220  fetcher->set_status(
221      net::URLRequestStatus(net::URLRequestStatus::SUCCESS, net::OK));
222  fetcher->set_response_code(200);
223
224  EXPECT_CALL(callback_, ConfirmCallback(GCDBaseApiFlow::SUCCESS));
225
226  fetcher->delegate()->OnURLFetchComplete(fetcher);
227}
228
229}  // namespace
230
231}  // namespace local_discovery
232