privet_confirm_api_flow_unittest.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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 kAccountId[] = "account_id"; 38 39class MockableConfirmCallback { 40 public: 41 MOCK_METHOD1(ConfirmCallback, void(CloudPrintBaseApiFlow::Status)); 42 43 PrivetConfirmApiCallFlow::ResponseCallback callback() { 44 return base::Bind(&MockableConfirmCallback::ConfirmCallback, 45 base::Unretained(this)); 46 } 47}; 48 49class PrivetConfirmApiFlowTest : public testing::Test { 50 public: 51 PrivetConfirmApiFlowTest() 52 : ui_thread_(content::BrowserThread::UI, 53 &loop_), 54 request_context_(new net::TestURLRequestContextGetter( 55 base::MessageLoopProxy::current())), 56 account_id_(kAccountId) { 57 token_service_.set_request_context(request_context_.get()); 58 token_service_.AddAccount(account_id_); 59 ui_thread_.Stop(); // HACK: Fake being on the UI thread 60 } 61 62 virtual ~PrivetConfirmApiFlowTest() { 63 } 64 65 protected: 66 base::MessageLoopForUI loop_; 67 content::TestBrowserThread ui_thread_; 68 scoped_refptr<net::TestURLRequestContextGetter> request_context_; 69 net::TestURLFetcherFactory fetcher_factory_; 70 FakeOAuth2TokenService token_service_; 71 MockableConfirmCallback callback_; 72 std::string account_id_; 73}; 74 75TEST_F(PrivetConfirmApiFlowTest, SuccessOAuth2) { 76 PrivetConfirmApiCallFlow confirm_flow(request_context_.get(), 77 &token_service_, 78 account_id_, 79 GURL("http://SoMeUrL.com"), 80 callback_.callback()); 81 CloudPrintBaseApiFlow* cloudprint_flow = 82 confirm_flow.GetBaseApiFlowForTests(); 83 84 confirm_flow.Start(); 85 86 cloudprint_flow->OnGetTokenSuccess(NULL, "SomeToken", base::Time()); 87 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); 88 89 EXPECT_EQ(GURL("http://SoMeUrL.com"), fetcher->GetOriginalURL()); 90 91 net::HttpRequestHeaders headers; 92 fetcher->GetExtraRequestHeaders(&headers); 93 std::string oauth_header; 94 std::string proxy; 95 EXPECT_TRUE(headers.GetHeader("Authorization", &oauth_header)); 96 EXPECT_EQ("Bearer SomeToken", oauth_header); 97 EXPECT_TRUE(headers.GetHeader("X-Cloudprint-Proxy", &proxy)); 98 EXPECT_EQ("Chrome", proxy); 99 100 fetcher->SetResponseString(kSampleConfirmResponse); 101 fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 102 net::OK)); 103 fetcher->set_response_code(200); 104 105 EXPECT_CALL(callback_, ConfirmCallback(CloudPrintBaseApiFlow::SUCCESS)); 106 107 fetcher->delegate()->OnURLFetchComplete(fetcher); 108} 109 110TEST_F(PrivetConfirmApiFlowTest, SuccessCookies) { 111 PrivetConfirmApiCallFlow confirm_flow(request_context_.get(), 112 1, 113 "SomeToken", 114 GURL("http://SoMeUrL.com?token=tkn"), 115 callback_.callback()); 116 117 confirm_flow.Start(); 118 119 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); 120 121 EXPECT_EQ(GURL("http://SoMeUrL.com?token=tkn&xsrf=SomeToken&user=1"), 122 fetcher->GetOriginalURL()); 123 124 net::HttpRequestHeaders headers; 125 fetcher->GetExtraRequestHeaders(&headers); 126 std::string proxy; 127 EXPECT_TRUE(headers.GetHeader("X-Cloudprint-Proxy", &proxy)); 128 EXPECT_EQ("Chrome", proxy); 129 130 fetcher->SetResponseString(kSampleConfirmResponse); 131 fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 132 net::OK)); 133 fetcher->set_response_code(200); 134 135 EXPECT_CALL(callback_, ConfirmCallback(CloudPrintBaseApiFlow::SUCCESS)); 136 137 fetcher->delegate()->OnURLFetchComplete(fetcher); 138} 139 140TEST_F(PrivetConfirmApiFlowTest, BadToken) { 141 PrivetConfirmApiCallFlow confirm_flow(request_context_.get(), 142 &token_service_, 143 account_id_, 144 GURL("http://SoMeUrL.com"), 145 callback_.callback()); 146 147 confirm_flow.Start(); 148 149 CloudPrintBaseApiFlow* cloudprint_flow = 150 confirm_flow.GetBaseApiFlowForTests(); 151 152 EXPECT_CALL(callback_, 153 ConfirmCallback(CloudPrintBaseApiFlow::ERROR_TOKEN)); 154 cloudprint_flow->OnGetTokenFailure(NULL, GoogleServiceAuthError( 155 GoogleServiceAuthError::USER_NOT_SIGNED_UP)); 156} 157 158TEST_F(PrivetConfirmApiFlowTest, ServerFailure) { 159 PrivetConfirmApiCallFlow confirm_flow(request_context_.get(), 160 &token_service_, 161 account_id_, 162 GURL("http://SoMeUrL.com"), 163 callback_.callback()); 164 165 confirm_flow.Start(); 166 167 CloudPrintBaseApiFlow* cloudprint_flow = 168 confirm_flow.GetBaseApiFlowForTests(); 169 170 cloudprint_flow->OnGetTokenSuccess(NULL, "SomeToken", base::Time()); 171 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); 172 173 EXPECT_EQ(GURL("http://SoMeUrL.com"), fetcher->GetOriginalURL()); 174 175 fetcher->SetResponseString(kFailedConfirmResponse); 176 fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 177 net::OK)); 178 fetcher->set_response_code(200); 179 180 EXPECT_CALL(callback_, 181 ConfirmCallback(CloudPrintBaseApiFlow::ERROR_FROM_SERVER)); 182 183 fetcher->delegate()->OnURLFetchComplete(fetcher); 184} 185 186TEST_F(PrivetConfirmApiFlowTest, BadJson) { 187 PrivetConfirmApiCallFlow confirm_flow(request_context_.get(), 188 &token_service_, 189 account_id_, 190 GURL("http://SoMeUrL.com"), 191 callback_.callback()); 192 193 confirm_flow.Start(); 194 195 CloudPrintBaseApiFlow* cloudprint_flow = 196 confirm_flow.GetBaseApiFlowForTests(); 197 198 cloudprint_flow->OnGetTokenSuccess(NULL, "SomeToken", base::Time()); 199 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); 200 201 EXPECT_EQ(GURL("http://SoMeUrL.com"), fetcher->GetOriginalURL()); 202 203 fetcher->SetResponseString(kFailedConfirmResponseBadJson); 204 fetcher->set_status(net::URLRequestStatus( 205 net::URLRequestStatus::SUCCESS, 206 net::OK)); 207 fetcher->set_response_code(200); 208 209 EXPECT_CALL(callback_, ConfirmCallback 210 (CloudPrintBaseApiFlow::ERROR_MALFORMED_RESPONSE)); 211 212 fetcher->delegate()->OnURLFetchComplete(fetcher); 213} 214 215} // namespace 216 217} // namespace local_discovery 218