1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/location.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
10a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/run_loop.h"
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/test/null_task_runner.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chromeos/login/auth/auth_attempt_state.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chromeos/login/auth/mock_auth_attempt_state_resolver.h"
1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chromeos/login/auth/mock_url_fetchers.h"
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chromeos/login/auth/online_attempt.h"
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chromeos/login/auth/test_attempt_state.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/login/auth/user_context.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_auth_consumer.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/mock_url_fetcher_factory.h"
2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "net/url_request/url_request_context.h"
2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "net/url_request/url_request_test_util.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::AnyNumber;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Invoke;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace {
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class TestContextURLRequestContextGetter : public net::URLRequestContextGetter {
3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public:
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  TestContextURLRequestContextGetter()
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      : null_task_runner_(new base::NullTaskRunner) {}
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual net::URLRequestContext* GetURLRequestContext() OVERRIDE {
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return &context_;
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual scoped_refptr<base::SingleThreadTaskRunner> GetNetworkTaskRunner()
4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      const OVERRIDE {
4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return null_task_runner_;
4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) private:
5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual ~TestContextURLRequestContextGetter() {}
5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  net::TestURLRequestContext context_;
5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> null_task_runner_;
5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OnlineAttemptTest : public testing::Test {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnlineAttemptTest()
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      : state_(UserContext(), false),
6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        attempt_(new OnlineAttempt(&state_, &resolver_)) {}
6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    message_loop_ = base::MessageLoopProxy::current();
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    request_context_ = new TestContextURLRequestContextGetter();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunFailureTest(const GoogleServiceAuthError& error) {
7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    EXPECT_CALL(resolver_, Resolve()).Times(1).RetiresOnSaturation();
7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    message_loop_->PostTask(FROM_HERE,
7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                            base::Bind(&OnlineAttempt::OnClientLoginFailure,
7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                       attempt_->weak_factory_.GetWeakPtr(),
7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                       error));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Force UI thread to finish tasks so I can verify |state_|.
79a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    base::RunLoop().RunUntilIdle();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(error == state_.online_outcome().error());
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CancelLogin(OnlineAttempt* auth) {
8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    message_loop_->PostTask(FROM_HERE,
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                            base::Bind(&OnlineAttempt::CancelClientLogin,
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                       auth->weak_factory_.GetWeakPtr()));
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> message_loop_;
9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<net::URLRequestContextGetter> request_context_;
9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::MessageLoop loop_;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestAttemptState state_;
93a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  MockAuthAttemptStateResolver resolver_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<OnlineAttempt> attempt_;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(OnlineAttemptTest, LoginSuccess) {
9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_CALL(resolver_, Resolve()).Times(1).RetiresOnSaturation();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  message_loop_->PostTask(FROM_HERE,
10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                          base::Bind(&OnlineAttempt::OnClientLoginSuccess,
10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                     attempt_->weak_factory_.GetWeakPtr(),
10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                     GaiaAuthConsumer::ClientLoginResult()));
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Force UI thread to finish tasks so I can verify |state_|.
105a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::RunLoop().RunUntilIdle();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(OnlineAttemptTest, LoginCancelRetry) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoogleServiceAuthError error(GoogleServiceAuthError::REQUEST_CANCELED);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile profile;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
112a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::RunLoop run_loop;
113a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_CALL(resolver_, Resolve())
114a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      .WillOnce(Invoke(&run_loop, &base::RunLoop::Quit))
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is how we inject fake URLFetcher objects, with a factory.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This factory creates fake URLFetchers that Start() a fake fetch attempt
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and then come back on the UI thread saying they've been canceled.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockURLFetcherFactory<GotCanceledFetcher> factory;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  attempt_->Initiate(request_context_.get());
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  run_loop.Run();
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(error == state_.online_outcome().error());
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(AuthFailure::NETWORK_AUTH_FAILED, state_.online_outcome().reason());
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(OnlineAttemptTest, LoginTimeout) {
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AuthFailure error(AuthFailure::LOGIN_TIMED_OUT);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile profile;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
134a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::RunLoop run_loop;
135a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_CALL(resolver_, Resolve())
136a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      .WillOnce(Invoke(&run_loop, &base::RunLoop::Quit))
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is how we inject fake URLFetcher objects, with a factory.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This factory creates fake URLFetchers that Start() a fake fetch attempt
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and then come back on the UI thread saying they've been canceled.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockURLFetcherFactory<ExpectCanceledFetcher> factory;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  attempt_->Initiate(request_context_.get());
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Post a task to cancel the login attempt.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CancelLogin(attempt_.get());
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
149a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  run_loop.Run();
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(AuthFailure::LOGIN_TIMED_OUT, state_.online_outcome().reason());
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(OnlineAttemptTest, HostedLoginRejected) {
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AuthFailure error(AuthFailure::FromNetworkAuthFailure(
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GoogleServiceAuthError(GoogleServiceAuthError::HOSTED_NOT_ALLOWED)));
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile profile;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
159a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::RunLoop run_loop;
160a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_CALL(resolver_, Resolve())
161a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      .WillOnce(Invoke(&run_loop, &base::RunLoop::Quit))
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is how we inject fake URLFetcher objects, with a factory.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockURLFetcherFactory<HostedFetcher> factory;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TestAttemptState local_state(UserContext(), true);
168a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  attempt_.reset(new OnlineAttempt(&local_state, &resolver_));
16903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  attempt_->Initiate(request_context_.get());
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
171a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  run_loop.Run();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error, local_state.online_outcome());
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(AuthFailure::NETWORK_AUTH_FAILED,
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            local_state.online_outcome().reason());
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(OnlineAttemptTest, FullLogin) {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile profile;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
181a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::RunLoop run_loop;
182a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_CALL(resolver_, Resolve())
183a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      .WillOnce(Invoke(&run_loop, &base::RunLoop::Quit))
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is how we inject fake URLFetcher objects, with a factory.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockURLFetcherFactory<SuccessFetcher> factory;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TestAttemptState local_state(UserContext(), true);
190a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  attempt_.reset(new OnlineAttempt(&local_state, &resolver_));
19103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  attempt_->Initiate(request_context_.get());
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
193a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  run_loop.Run();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(AuthFailure::AuthFailureNone(), local_state.online_outcome());
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(OnlineAttemptTest, LoginNetFailure) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunFailureTest(
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GoogleServiceAuthError::FromConnectionError(net::ERR_CONNECTION_RESET));
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(OnlineAttemptTest, LoginDenied) {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunFailureTest(
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(OnlineAttemptTest, LoginAccountDisabled) {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunFailureTest(
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GoogleServiceAuthError(GoogleServiceAuthError::ACCOUNT_DISABLED));
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(OnlineAttemptTest, LoginAccountDeleted) {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunFailureTest(
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GoogleServiceAuthError(GoogleServiceAuthError::ACCOUNT_DELETED));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(OnlineAttemptTest, LoginServiceUnavailable) {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunFailureTest(
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE));
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(OnlineAttemptTest, CaptchaErrorOutputted) {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoogleServiceAuthError auth_error =
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GoogleServiceAuthError::FromClientLoginCaptchaChallenge(
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "CCTOKEN",
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GURL("http://accounts.google.com/Captcha?ctoken=CCTOKEN"),
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GURL("http://www.google.com/login/captcha"));
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunFailureTest(auth_error);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(OnlineAttemptTest, TwoFactorSuccess) {
23303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_CALL(resolver_, Resolve()).Times(1).RetiresOnSaturation();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoogleServiceAuthError error(GoogleServiceAuthError::TWO_FACTOR);
23503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  message_loop_->PostTask(FROM_HERE,
23603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                          base::Bind(&OnlineAttempt::OnClientLoginFailure,
23703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                     attempt_->weak_factory_.GetWeakPtr(),
23803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                     error));
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Force UI thread to finish tasks so I can verify |state_|.
241a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::RunLoop().RunUntilIdle();
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(GoogleServiceAuthError::AuthErrorNone() ==
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              state_.online_outcome().error());
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
247