• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 <errno.h>
6 
7 #include <string>
8 
9 #include "chrome/browser/chromeos/login/client_login_response_handler.h"
10 #include "chrome/browser/chromeos/login/cookie_fetcher.h"
11 #include "chrome/browser/chromeos/login/issue_response_handler.h"
12 #include "chrome/browser/chromeos/login/mock_auth_response_handler.h"
13 #include "chrome/common/net/url_fetcher.h"
14 #include "chrome/test/testing_profile.h"
15 #include "content/browser/browser_thread.h"
16 #include "googleurl/src/gurl.h"
17 #include "net/url_request/url_request_status.h"
18 #include "testing/gmock/include/gmock/gmock.h"
19 #include "testing/gtest/include/gtest/gtest.h"
20 
21 namespace chromeos {
22 using ::testing::Return;
23 using ::testing::Invoke;
24 using ::testing::Unused;
25 using ::testing::_;
26 
27 class CookieFetcherTest : public ::testing::Test {
28  public:
CookieFetcherTest()29   CookieFetcherTest()
30       : iat_url_(AuthResponseHandler::kIssueAuthTokenUrl),
31         ta_url_(AuthResponseHandler::kTokenAuthUrl),
32         client_login_data_("SID n' LSID"),
33         token_("auth token"),
34         ui_thread_(BrowserThread::UI, &message_loop_) {
35   }
36 
37   const GURL iat_url_;
38   const GURL ta_url_;
39   const std::string client_login_data_;
40   const std::string token_;
41   MessageLoopForUI message_loop_;
42   BrowserThread ui_thread_;
43   TestingProfile profile_;
44 };
45 
46 // Check that successful HTTP responses from both end points results in
47 // the browser window getting put up.
TEST_F(CookieFetcherTest,SuccessfulFetchTest)48 TEST_F(CookieFetcherTest, SuccessfulFetchTest) {
49   net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0);
50 
51   MockAuthResponseHandler* cl_handler =
52       new MockAuthResponseHandler(iat_url_, status, kHttpSuccess, token_);
53   MockAuthResponseHandler* i_handler =
54       new MockAuthResponseHandler(ta_url_, status, kHttpSuccess, std::string());
55 
56   CookieFetcher* cf = new CookieFetcher(NULL, cl_handler, i_handler);
57 
58   EXPECT_CALL(*cl_handler, Handle(client_login_data_, cf))
59       .Times(1);
60 
61   EXPECT_CALL(*i_handler, CanHandle(iat_url_))
62       .WillOnce(Return(true));
63   EXPECT_CALL(*i_handler, CanHandle(ta_url_))
64       .WillOnce(Return(false));
65   EXPECT_CALL(*i_handler, Handle(token_, cf))
66       .Times(1);
67 
68   cf->AttemptFetch(client_login_data_);
69   message_loop_.RunAllPending();
70 }
71 
72 // Check that a network failure when trying IssueAuthToken results in us bailing
73 // and putting up the browser window.
TEST_F(CookieFetcherTest,IssueAuthTokenNetworkFailureTest)74 TEST_F(CookieFetcherTest, IssueAuthTokenNetworkFailureTest) {
75   net::URLRequestStatus failed(net::URLRequestStatus::FAILED, ECONNRESET);
76 
77   MockAuthResponseHandler* cl_handler =
78       new MockAuthResponseHandler(iat_url_, failed, kHttpSuccess, token_);
79   // I expect nothing in i_handler to get called anyway
80   MockAuthResponseHandler* i_handler =
81       new MockAuthResponseHandler(ta_url_, failed, kHttpSuccess, std::string());
82 
83   CookieFetcher* cf = new CookieFetcher(&profile_,
84                                         cl_handler,
85                                         i_handler);
86 
87   EXPECT_CALL(*cl_handler, Handle(client_login_data_, cf))
88       .Times(1);
89 
90   cf->AttemptFetch(client_login_data_);
91   message_loop_.RunAllPending();
92 }
93 
94 // Check that a network failure when trying TokenAuth results in us bailing
95 // and putting up the browser window.
TEST_F(CookieFetcherTest,TokenAuthNetworkFailureTest)96 TEST_F(CookieFetcherTest, TokenAuthNetworkFailureTest) {
97   net::URLRequestStatus success;
98   net::URLRequestStatus failed(net::URLRequestStatus::FAILED, ECONNRESET);
99 
100   MockAuthResponseHandler* cl_handler =
101       new MockAuthResponseHandler(iat_url_, success, kHttpSuccess, token_);
102   MockAuthResponseHandler* i_handler =
103       new MockAuthResponseHandler(ta_url_, failed, 0, std::string());
104 
105   CookieFetcher* cf = new CookieFetcher(&profile_,
106                                         cl_handler,
107                                         i_handler);
108 
109   EXPECT_CALL(*cl_handler, Handle(client_login_data_, cf))
110       .Times(1);
111 
112   EXPECT_CALL(*i_handler, CanHandle(iat_url_))
113       .WillOnce(Return(true));
114   EXPECT_CALL(*i_handler, Handle(token_, cf))
115       .Times(1);
116 
117   cf->AttemptFetch(client_login_data_);
118   message_loop_.RunAllPending();
119 }
120 
121 // Check that an unsuccessful HTTP response when trying IssueAuthToken results
122 // in us bailing and putting up the browser window.
TEST_F(CookieFetcherTest,IssueAuthTokenDeniedTest)123 TEST_F(CookieFetcherTest, IssueAuthTokenDeniedTest) {
124   net::URLRequestStatus success;
125 
126   MockAuthResponseHandler* cl_handler =
127       new MockAuthResponseHandler(iat_url_, success, 403, std::string());
128   // I expect nothing in i_handler to get called anyway.
129   MockAuthResponseHandler* i_handler =
130       new MockAuthResponseHandler(ta_url_, success, 0, std::string());
131 
132   CookieFetcher* cf = new CookieFetcher(&profile_,
133                                         cl_handler,
134                                         i_handler);
135 
136   EXPECT_CALL(*cl_handler, Handle(client_login_data_, cf))
137       .Times(1);
138 
139   cf->AttemptFetch(client_login_data_);
140   message_loop_.RunAllPending();
141 }
142 
143 // Check that an unsuccessful HTTP response when trying TokenAuth results
144 // in us bailing and putting up the browser window.
TEST_F(CookieFetcherTest,TokenAuthDeniedTest)145 TEST_F(CookieFetcherTest, TokenAuthDeniedTest) {
146   net::URLRequestStatus success;
147 
148   MockAuthResponseHandler* cl_handler =
149       new MockAuthResponseHandler(iat_url_,
150                                   success,
151                                   kHttpSuccess,
152                                   token_);
153   MockAuthResponseHandler* i_handler =
154       new MockAuthResponseHandler(ta_url_, success, 403, std::string());
155 
156   CookieFetcher* cf = new CookieFetcher(&profile_,
157                                         cl_handler,
158                                         i_handler);
159 
160   EXPECT_CALL(*cl_handler, Handle(client_login_data_, cf))
161       .Times(1);
162 
163   EXPECT_CALL(*i_handler, CanHandle(iat_url_))
164       .WillOnce(Return(true));
165   EXPECT_CALL(*i_handler, Handle(token_, cf))
166       .Times(1);
167 
168   cf->AttemptFetch(client_login_data_);
169   message_loop_.RunAllPending();
170 }
171 
TEST_F(CookieFetcherTest,ClientLoginResponseHandlerTest)172 TEST_F(CookieFetcherTest, ClientLoginResponseHandlerTest) {
173   ClientLoginResponseHandler handler(NULL);
174   std::string input("a\nb\n");
175   std::string expected("a&b&");
176   expected.append(ClientLoginResponseHandler::kService);
177 
178   scoped_ptr<URLFetcher> fetcher(handler.Handle(input, NULL));
179   EXPECT_EQ(expected, handler.payload());
180 }
181 
TEST_F(CookieFetcherTest,IssueResponseHandlerTest)182 TEST_F(CookieFetcherTest, IssueResponseHandlerTest) {
183   IssueResponseHandler handler(NULL);
184   std::string input("a\n");
185   std::string expected(IssueResponseHandler::kTokenAuthUrl);
186   expected.append(input);
187 
188   scoped_ptr<URLFetcher> fetcher(handler.Handle(input, NULL));
189   EXPECT_EQ(expected, handler.token_url());
190 }
191 
192 }  // namespace chromeos
193