OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 // | 4 // |
5 // A complete set of unit tests for GaiaAuthenticator2. | 5 // A complete set of unit tests for GaiaAuthenticator2. |
6 // Originally ported from GoogleAuthenticator tests. | 6 // Originally ported from GoogleAuthenticator tests. |
7 | 7 |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
11 #include "base/string_util.h" | 11 #include "base/string_util.h" |
12 #include "chrome/common/net/gaia/gaia_auth_consumer.h" | 12 #include "chrome/common/net/gaia/gaia_auth_consumer.h" |
13 #include "chrome/common/net/gaia/gaia_authenticator2.h" | 13 #include "chrome/common/net/gaia/gaia_authenticator2.h" |
14 #include "chrome/common/net/gaia/gaia_authenticator2_unittest.h" | 14 #include "chrome/common/net/gaia/gaia_authenticator2_unittest.h" |
15 #include "chrome/common/net/http_return.h" | 15 #include "chrome/common/net/http_return.h" |
16 #include "chrome/common/net/test_url_fetcher_factory.h" | 16 #include "chrome/common/net/test_url_fetcher_factory.h" |
17 #include "chrome/common/net/url_fetcher.h" | 17 #include "chrome/common/net/url_fetcher.h" |
18 #include "chrome/test/testing_profile.h" | 18 #include "chrome/test/testing_profile.h" |
19 #include "googleurl/src/gurl.h" | 19 #include "googleurl/src/gurl.h" |
20 #include "net/base/net_errors.h" | 20 #include "net/base/net_errors.h" |
21 #include "net/url_request/url_request_status.h" | 21 #include "net/url_request/url_request_status.h" |
22 #include "testing/gmock/include/gmock/gmock.h" | 22 #include "testing/gmock/include/gmock/gmock.h" |
23 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
24 | 24 |
25 using ::testing::_; | 25 using ::testing::_; |
26 | 26 |
27 class GaiaAuthenticator2Test : public testing::Test { | 27 class GaiaAuthenticator2Test : public testing::Test { |
28 public: | 28 public: |
29 GaiaAuthenticator2Test() | 29 GaiaAuthenticator2Test() |
30 : source_(GaiaAuthenticator2::kClientLoginUrl) {} | 30 : client_login_source_(GaiaAuthenticator2::kClientLoginUrl), |
| 31 issue_auth_token_source_(GaiaAuthenticator2::kIssueAuthTokenUrl) {} |
31 | 32 |
32 void RunParsingTest(const std::string& data, | 33 void RunParsingTest(const std::string& data, |
33 const std::string& sid, | 34 const std::string& sid, |
34 const std::string& lsid, | 35 const std::string& lsid, |
35 const std::string& token) { | 36 const std::string& token) { |
36 std::string out_sid; | 37 std::string out_sid; |
37 std::string out_lsid; | 38 std::string out_lsid; |
38 std::string out_token; | 39 std::string out_token; |
39 | 40 |
40 GaiaAuthenticator2::ParseClientLoginResponse(data, | 41 GaiaAuthenticator2::ParseClientLoginResponse(data, |
41 &out_sid, | 42 &out_sid, |
42 &out_lsid, | 43 &out_lsid, |
43 &out_token); | 44 &out_token); |
44 EXPECT_EQ(lsid, out_lsid); | 45 EXPECT_EQ(lsid, out_lsid); |
45 EXPECT_EQ(sid, out_sid); | 46 EXPECT_EQ(sid, out_sid); |
46 EXPECT_EQ(token, out_token); | 47 EXPECT_EQ(token, out_token); |
47 } | 48 } |
48 | 49 |
49 ResponseCookies cookies_; | 50 ResponseCookies cookies_; |
50 GURL source_; | 51 GURL client_login_source_; |
| 52 GURL issue_auth_token_source_; |
51 TestingProfile profile_; | 53 TestingProfile profile_; |
52 }; | 54 }; |
53 | 55 |
54 class MockGaiaConsumer : public GaiaAuthConsumer { | 56 class MockGaiaConsumer : public GaiaAuthConsumer { |
55 public: | 57 public: |
56 MockGaiaConsumer() {} | 58 MockGaiaConsumer() {} |
57 ~MockGaiaConsumer() {} | 59 ~MockGaiaConsumer() {} |
58 MOCK_METHOD1(OnClientLoginFailure, void(const ClientLoginError& error)); | 60 |
59 MOCK_METHOD1(OnClientLoginSuccess, void(const ClientLoginResult& result)); | 61 MOCK_METHOD1(OnClientLoginSuccess, void(const ClientLoginResult& result)); |
| 62 MOCK_METHOD2(OnIssueAuthTokenSuccess, void(const std::string& service, |
| 63 const std::string& token)); |
| 64 MOCK_METHOD1(OnClientLoginFailure, void(const GaiaAuthError& error)); |
| 65 MOCK_METHOD2(OnIssueAuthTokenFailure, void(const std::string& service, |
| 66 const GaiaAuthError& error)); |
60 }; | 67 }; |
61 | 68 |
62 TEST_F(GaiaAuthenticator2Test, ErrorComparator) { | 69 TEST_F(GaiaAuthenticator2Test, ErrorComparator) { |
63 GaiaAuthConsumer::ClientLoginError expected_error; | 70 GaiaAuthConsumer::GaiaAuthError expected_error; |
64 expected_error.code = GaiaAuthConsumer::NETWORK_ERROR; | 71 expected_error.code = GaiaAuthConsumer::NETWORK_ERROR; |
65 expected_error.network_error = -101; | 72 expected_error.network_error = -101; |
66 | 73 |
67 GaiaAuthConsumer::ClientLoginError matching_error; | 74 GaiaAuthConsumer::GaiaAuthError matching_error; |
68 matching_error.code = GaiaAuthConsumer::NETWORK_ERROR; | 75 matching_error.code = GaiaAuthConsumer::NETWORK_ERROR; |
69 matching_error.network_error = -101; | 76 matching_error.network_error = -101; |
70 | 77 |
71 EXPECT_TRUE(expected_error == matching_error); | 78 EXPECT_TRUE(expected_error == matching_error); |
72 | 79 |
73 expected_error.network_error = 6; | 80 expected_error.network_error = 6; |
74 | 81 |
75 EXPECT_FALSE(expected_error == matching_error); | 82 EXPECT_FALSE(expected_error == matching_error); |
76 | 83 |
77 expected_error.code = GaiaAuthConsumer::PERMISSION_DENIED; | 84 expected_error.code = GaiaAuthConsumer::PERMISSION_DENIED; |
78 matching_error.code = GaiaAuthConsumer::PERMISSION_DENIED; | 85 matching_error.code = GaiaAuthConsumer::PERMISSION_DENIED; |
79 | 86 |
80 EXPECT_TRUE(expected_error == matching_error); | 87 EXPECT_TRUE(expected_error == matching_error); |
81 } | 88 } |
82 | 89 |
83 TEST_F(GaiaAuthenticator2Test, LoginNetFailure) { | 90 TEST_F(GaiaAuthenticator2Test, LoginNetFailure) { |
84 int error_no = net::ERR_CONNECTION_RESET; | 91 int error_no = net::ERR_CONNECTION_RESET; |
85 URLRequestStatus status(URLRequestStatus::FAILED, error_no); | 92 URLRequestStatus status(URLRequestStatus::FAILED, error_no); |
86 | 93 |
87 GaiaAuthConsumer::ClientLoginError expected_error; | 94 GaiaAuthConsumer::GaiaAuthError expected_error; |
88 expected_error.code = GaiaAuthConsumer::NETWORK_ERROR; | 95 expected_error.code = GaiaAuthConsumer::NETWORK_ERROR; |
89 expected_error.network_error = error_no; | 96 expected_error.network_error = error_no; |
90 | 97 |
91 MockGaiaConsumer consumer; | 98 MockGaiaConsumer consumer; |
92 EXPECT_CALL(consumer, OnClientLoginFailure(expected_error)) | 99 EXPECT_CALL(consumer, OnClientLoginFailure(expected_error)) |
93 .Times(1); | 100 .Times(1); |
94 | 101 |
95 GaiaAuthenticator2 auth(&consumer, std::string(), | 102 GaiaAuthenticator2 auth(&consumer, std::string(), |
96 profile_.GetRequestContext()); | 103 profile_.GetRequestContext()); |
97 | 104 |
98 auth.OnURLFetchComplete(NULL, source_, status, 0, cookies_, std::string()); | 105 auth.OnURLFetchComplete(NULL, |
| 106 client_login_source_, |
| 107 status, |
| 108 0, |
| 109 cookies_, |
| 110 std::string()); |
| 111 } |
| 112 |
| 113 TEST_F(GaiaAuthenticator2Test, TokenNetFailure) { |
| 114 int error_no = net::ERR_CONNECTION_RESET; |
| 115 URLRequestStatus status(URLRequestStatus::FAILED, error_no); |
| 116 |
| 117 GaiaAuthConsumer::GaiaAuthError expected_error; |
| 118 expected_error.code = GaiaAuthConsumer::NETWORK_ERROR; |
| 119 expected_error.network_error = error_no; |
| 120 |
| 121 MockGaiaConsumer consumer; |
| 122 EXPECT_CALL(consumer, OnIssueAuthTokenFailure(_, expected_error)) |
| 123 .Times(1); |
| 124 |
| 125 GaiaAuthenticator2 auth(&consumer, std::string(), |
| 126 profile_.GetRequestContext()); |
| 127 |
| 128 auth.OnURLFetchComplete(NULL, |
| 129 issue_auth_token_source_, |
| 130 status, |
| 131 0, |
| 132 cookies_, |
| 133 std::string()); |
99 } | 134 } |
100 | 135 |
101 | 136 |
102 TEST_F(GaiaAuthenticator2Test, LoginDenied) { | 137 TEST_F(GaiaAuthenticator2Test, LoginDenied) { |
103 std::string data("Error: NO!"); | 138 std::string data("Error: NO!"); |
104 URLRequestStatus status(URLRequestStatus::SUCCESS, 0); | 139 URLRequestStatus status(URLRequestStatus::SUCCESS, 0); |
105 | 140 |
106 GaiaAuthConsumer::ClientLoginError expected_error; | 141 GaiaAuthConsumer::GaiaAuthError expected_error; |
107 expected_error.code = GaiaAuthConsumer::PERMISSION_DENIED; | 142 expected_error.code = GaiaAuthConsumer::PERMISSION_DENIED; |
108 | 143 |
109 MockGaiaConsumer consumer; | 144 MockGaiaConsumer consumer; |
110 EXPECT_CALL(consumer, OnClientLoginFailure(expected_error)) | 145 EXPECT_CALL(consumer, OnClientLoginFailure(expected_error)) |
111 .Times(1); | 146 .Times(1); |
112 | 147 |
113 GaiaAuthenticator2 auth(&consumer, std::string(), | 148 GaiaAuthenticator2 auth(&consumer, std::string(), |
114 profile_.GetRequestContext()); | 149 profile_.GetRequestContext()); |
115 auth.OnURLFetchComplete(NULL, source_, status, RC_FORBIDDEN, cookies_, data); | 150 auth.OnURLFetchComplete(NULL, |
| 151 client_login_source_, |
| 152 status, |
| 153 RC_FORBIDDEN, |
| 154 cookies_, |
| 155 data); |
116 } | 156 } |
117 | 157 |
118 TEST_F(GaiaAuthenticator2Test, ParseRequest) { | 158 TEST_F(GaiaAuthenticator2Test, ParseRequest) { |
119 RunParsingTest("SID=sid\nLSID=lsid\nAuth=auth\n", "sid", "lsid", "auth"); | 159 RunParsingTest("SID=sid\nLSID=lsid\nAuth=auth\n", "sid", "lsid", "auth"); |
120 RunParsingTest("LSID=lsid\nSID=sid\nAuth=auth\n", "sid", "lsid", "auth"); | 160 RunParsingTest("LSID=lsid\nSID=sid\nAuth=auth\n", "sid", "lsid", "auth"); |
121 RunParsingTest("SID=sid\nLSID=lsid\nAuth=auth", "sid", "lsid", "auth"); | 161 RunParsingTest("SID=sid\nLSID=lsid\nAuth=auth", "sid", "lsid", "auth"); |
122 RunParsingTest("SID=sid\nAuth=auth\n", "sid", "", "auth"); | 162 RunParsingTest("SID=sid\nAuth=auth\n", "sid", "", "auth"); |
123 RunParsingTest("LSID=lsid\nAuth=auth\n", "", "lsid", "auth"); | 163 RunParsingTest("LSID=lsid\nAuth=auth\n", "", "lsid", "auth"); |
124 RunParsingTest("\nAuth=auth\n", "", "", "auth"); | 164 RunParsingTest("\nAuth=auth\n", "", "", "auth"); |
125 RunParsingTest("SID=sid", "sid", "", ""); | 165 RunParsingTest("SID=sid", "sid", "", ""); |
126 } | 166 } |
127 | 167 |
128 TEST_F(GaiaAuthenticator2Test, OnlineLogin) { | 168 TEST_F(GaiaAuthenticator2Test, OnlineLogin) { |
129 std::string data("SID=sid\nLSID=lsid\nAuth=auth\n"); | 169 std::string data("SID=sid\nLSID=lsid\nAuth=auth\n"); |
130 | 170 |
131 GaiaAuthConsumer::ClientLoginResult result; | 171 GaiaAuthConsumer::ClientLoginResult result; |
132 result.lsid = "lsid"; | 172 result.lsid = "lsid"; |
133 result.sid = "sid"; | 173 result.sid = "sid"; |
134 result.token = "auth"; | 174 result.token = "auth"; |
135 result.data = data; | 175 result.data = data; |
136 | 176 |
137 MockGaiaConsumer consumer; | 177 MockGaiaConsumer consumer; |
138 EXPECT_CALL(consumer, OnClientLoginSuccess(result)) | 178 EXPECT_CALL(consumer, OnClientLoginSuccess(result)) |
139 .Times(1); | 179 .Times(1); |
140 | 180 |
141 GaiaAuthenticator2 auth(&consumer, std::string(), | 181 GaiaAuthenticator2 auth(&consumer, std::string(), |
142 profile_.GetRequestContext()); | 182 profile_.GetRequestContext()); |
143 URLRequestStatus status(URLRequestStatus::SUCCESS, 0); | 183 URLRequestStatus status(URLRequestStatus::SUCCESS, 0); |
144 auth.OnURLFetchComplete(NULL, | 184 auth.OnURLFetchComplete(NULL, |
145 source_, | 185 client_login_source_, |
146 status, | 186 status, |
147 RC_REQUEST_OK, | 187 RC_REQUEST_OK, |
148 cookies_, | 188 cookies_, |
149 data); | 189 data); |
150 } | 190 } |
151 | 191 |
| 192 TEST_F(GaiaAuthenticator2Test, WorkingIssueAuthToken) { |
| 193 MockGaiaConsumer consumer; |
| 194 EXPECT_CALL(consumer, OnIssueAuthTokenSuccess(_, "token")) |
| 195 .Times(1); |
| 196 |
| 197 GaiaAuthenticator2 auth(&consumer, std::string(), |
| 198 profile_.GetRequestContext()); |
| 199 URLRequestStatus status(URLRequestStatus::SUCCESS, 0); |
| 200 auth.OnURLFetchComplete(NULL, |
| 201 issue_auth_token_source_, |
| 202 status, |
| 203 RC_REQUEST_OK, |
| 204 cookies_, |
| 205 "token"); |
| 206 } |
| 207 |
152 TEST_F(GaiaAuthenticator2Test, CheckTwoFactorResponse) { | 208 TEST_F(GaiaAuthenticator2Test, CheckTwoFactorResponse) { |
153 std::string response = | 209 std::string response = |
154 StringPrintf("Error=BadAuthentication\n%s\n", | 210 StringPrintf("Error=BadAuthentication\n%s\n", |
155 GaiaAuthenticator2::kSecondFactor); | 211 GaiaAuthenticator2::kSecondFactor); |
156 EXPECT_TRUE(GaiaAuthenticator2::IsSecondFactorSuccess(response)); | 212 EXPECT_TRUE(GaiaAuthenticator2::IsSecondFactorSuccess(response)); |
157 } | 213 } |
158 | 214 |
159 TEST_F(GaiaAuthenticator2Test, CheckNormalErrorCode) { | 215 TEST_F(GaiaAuthenticator2Test, CheckNormalErrorCode) { |
160 std::string response = "Error=BadAuthentication\n"; | 216 std::string response = "Error=BadAuthentication\n"; |
161 EXPECT_FALSE(GaiaAuthenticator2::IsSecondFactorSuccess(response)); | 217 EXPECT_FALSE(GaiaAuthenticator2::IsSecondFactorSuccess(response)); |
162 } | 218 } |
163 | 219 |
164 TEST_F(GaiaAuthenticator2Test, TwoFactorLogin) { | 220 TEST_F(GaiaAuthenticator2Test, TwoFactorLogin) { |
165 std::string response = | 221 std::string response = |
166 StringPrintf("Error=BadAuthentication\n%s\n", | 222 StringPrintf("Error=BadAuthentication\n%s\n", |
167 GaiaAuthenticator2::kSecondFactor); | 223 GaiaAuthenticator2::kSecondFactor); |
168 | 224 |
169 GaiaAuthConsumer::ClientLoginError error; | 225 GaiaAuthConsumer::GaiaAuthError error; |
170 error.code = GaiaAuthConsumer::TWO_FACTOR; | 226 error.code = GaiaAuthConsumer::TWO_FACTOR; |
171 | 227 |
172 MockGaiaConsumer consumer; | 228 MockGaiaConsumer consumer; |
173 EXPECT_CALL(consumer, OnClientLoginFailure(error)) | 229 EXPECT_CALL(consumer, OnClientLoginFailure(error)) |
174 .Times(1); | 230 .Times(1); |
175 | 231 |
176 GaiaAuthenticator2 auth(&consumer, std::string(), | 232 GaiaAuthenticator2 auth(&consumer, std::string(), |
177 profile_.GetRequestContext()); | 233 profile_.GetRequestContext()); |
178 URLRequestStatus status(URLRequestStatus::SUCCESS, 0); | 234 URLRequestStatus status(URLRequestStatus::SUCCESS, 0); |
179 auth.OnURLFetchComplete(NULL, | 235 auth.OnURLFetchComplete(NULL, |
180 source_, | 236 client_login_source_, |
181 status, | 237 status, |
182 RC_FORBIDDEN, | 238 RC_FORBIDDEN, |
183 cookies_, | 239 cookies_, |
184 response); | 240 response); |
185 } | 241 } |
186 | 242 |
187 TEST_F(GaiaAuthenticator2Test, FullLogin) { | 243 TEST_F(GaiaAuthenticator2Test, FullLogin) { |
188 MockGaiaConsumer consumer; | 244 MockGaiaConsumer consumer; |
189 EXPECT_CALL(consumer, OnClientLoginSuccess(_)) | 245 EXPECT_CALL(consumer, OnClientLoginSuccess(_)) |
190 .Times(1); | 246 .Times(1); |
(...skipping 29 matching lines...) Expand all Loading... |
220 profile_.GetRequestContext()); | 276 profile_.GetRequestContext()); |
221 auth.StartClientLogin("username", | 277 auth.StartClientLogin("username", |
222 "password", | 278 "password", |
223 "service", | 279 "service", |
224 std::string(), | 280 std::string(), |
225 std::string()); | 281 std::string()); |
226 | 282 |
227 URLFetcher::set_factory(NULL); | 283 URLFetcher::set_factory(NULL); |
228 } | 284 } |
229 | 285 |
230 TEST_F(GaiaAuthenticator2Test, FetchPending) { | 286 TEST_F(GaiaAuthenticator2Test, ClientFetchPending) { |
231 MockGaiaConsumer consumer; | 287 MockGaiaConsumer consumer; |
232 EXPECT_CALL(consumer, OnClientLoginSuccess(_)) | 288 EXPECT_CALL(consumer, OnClientLoginSuccess(_)) |
233 .Times(1); | 289 .Times(1); |
234 | 290 |
235 TestingProfile profile; | 291 TestingProfile profile; |
236 TestURLFetcherFactory factory; | 292 TestURLFetcherFactory factory; |
237 URLFetcher::set_factory(&factory); | 293 URLFetcher::set_factory(&factory); |
238 | 294 |
239 GaiaAuthenticator2 auth(&consumer, std::string(), | 295 GaiaAuthenticator2 auth(&consumer, std::string(), |
240 profile_.GetRequestContext()); | 296 profile_.GetRequestContext()); |
241 auth.StartClientLogin("username", | 297 auth.StartClientLogin("username", |
242 "password", | 298 "password", |
243 "service", | 299 "service", |
244 std::string(), | 300 std::string(), |
245 std::string()); | 301 std::string()); |
246 | 302 |
247 URLFetcher::set_factory(NULL); | 303 URLFetcher::set_factory(NULL); |
248 EXPECT_TRUE(auth.HasPendingFetch()); | 304 EXPECT_TRUE(auth.HasPendingFetch()); |
249 auth.OnURLFetchComplete(NULL, | 305 auth.OnURLFetchComplete(NULL, |
250 source_, | 306 client_login_source_, |
251 URLRequestStatus(URLRequestStatus::SUCCESS, 0), | 307 URLRequestStatus(URLRequestStatus::SUCCESS, 0), |
252 RC_REQUEST_OK, | 308 RC_REQUEST_OK, |
253 cookies_, | 309 cookies_, |
254 std::string()); | 310 "SID=sid\nLSID=lsid\nAuth=auth\n"); |
255 EXPECT_FALSE(auth.HasPendingFetch()); | 311 EXPECT_FALSE(auth.HasPendingFetch()); |
256 } | 312 } |
257 | 313 |
| 314 TEST_F(GaiaAuthenticator2Test, FullTokenSuccess) { |
| 315 MockGaiaConsumer consumer; |
| 316 EXPECT_CALL(consumer, OnIssueAuthTokenSuccess("service", "token")) |
| 317 .Times(1); |
258 | 318 |
| 319 TestingProfile profile; |
| 320 TestURLFetcherFactory factory; |
| 321 URLFetcher::set_factory(&factory); |
| 322 |
| 323 GaiaAuthenticator2 auth(&consumer, std::string(), |
| 324 profile_.GetRequestContext()); |
| 325 auth.StartIssueAuthToken("sid", "lsid", "service"); |
| 326 |
| 327 URLFetcher::set_factory(NULL); |
| 328 EXPECT_TRUE(auth.HasPendingFetch()); |
| 329 auth.OnURLFetchComplete(NULL, |
| 330 issue_auth_token_source_, |
| 331 URLRequestStatus(URLRequestStatus::SUCCESS, 0), |
| 332 RC_REQUEST_OK, |
| 333 cookies_, |
| 334 "token"); |
| 335 EXPECT_FALSE(auth.HasPendingFetch()); |
| 336 } |
| 337 |
| 338 TEST_F(GaiaAuthenticator2Test, FullTokenFailure) { |
| 339 MockGaiaConsumer consumer; |
| 340 EXPECT_CALL(consumer, OnIssueAuthTokenFailure("service", _)) |
| 341 .Times(1); |
| 342 |
| 343 TestingProfile profile; |
| 344 TestURLFetcherFactory factory; |
| 345 URLFetcher::set_factory(&factory); |
| 346 |
| 347 GaiaAuthenticator2 auth(&consumer, std::string(), |
| 348 profile_.GetRequestContext()); |
| 349 auth.StartIssueAuthToken("sid", "lsid", "service"); |
| 350 |
| 351 URLFetcher::set_factory(NULL); |
| 352 EXPECT_TRUE(auth.HasPendingFetch()); |
| 353 auth.OnURLFetchComplete(NULL, |
| 354 issue_auth_token_source_, |
| 355 URLRequestStatus(URLRequestStatus::SUCCESS, 0), |
| 356 RC_FORBIDDEN, |
| 357 cookies_, |
| 358 ""); |
| 359 EXPECT_FALSE(auth.HasPendingFetch()); |
| 360 } |
OLD | NEW |