Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Side by Side Diff: chrome/browser/chromeos/login/google_authenticator_unittest.cc

Issue 2847080: Make login cancel logic load localaccount file before attempting offline login (Closed)
Patch Set: fix check_deps failure, comment per phajdan Created 10 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 #include <string> 5 #include <string>
6 #include <vector> 6 #include <vector>
7 7
8 #include "base/file_path.h" 8 #include "base/file_path.h"
9 #include "base/file_util.h" 9 #include "base/file_util.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 MockConsumer() {} 44 MockConsumer() {}
45 ~MockConsumer() {} 45 ~MockConsumer() {}
46 MOCK_METHOD1(OnLoginFailure, void(const std::string& error)); 46 MOCK_METHOD1(OnLoginFailure, void(const std::string& error));
47 MOCK_METHOD2(OnLoginSuccess, void(const std::string& username, 47 MOCK_METHOD2(OnLoginSuccess, void(const std::string& username,
48 const GaiaAuthConsumer::ClientLoginResult& result)); 48 const GaiaAuthConsumer::ClientLoginResult& result));
49 MOCK_METHOD0(OnOffTheRecordLoginSuccess, void(void)); 49 MOCK_METHOD0(OnOffTheRecordLoginSuccess, void(void));
50 MOCK_METHOD1(OnPasswordChangeDetected, 50 MOCK_METHOD1(OnPasswordChangeDetected,
51 void(const GaiaAuthConsumer::ClientLoginResult& result)); 51 void(const GaiaAuthConsumer::ClientLoginResult& result));
52 }; 52 };
53 53
54 // Responds as though ClientLogin returned from the server.
55 class TimedMockFetcher : public URLFetcher {
56 public:
57 TimedMockFetcher(bool success,
58 const GURL& url,
DaveMoore 2010/07/28 04:44:33 nit: indenting
Chris Masone 2010/07/28 05:55:52 Done.
59 URLFetcher::RequestType request_type,
60 URLFetcher::Delegate* d)
61 : URLFetcher(url, request_type, d),
62 success_(success),
63 url_(url),
64 sleeper_(new Sleeper) {
65 }
DaveMoore 2010/07/28 04:44:33 nit: nl
Chris Masone 2010/07/28 05:55:52 Done.
66 ~TimedMockFetcher() {
oshima 2010/07/28 08:00:10 virtual (just for style)
67 sleeper_->task_->Cancel();
68 }
69
70 void Start() {
71 LOG(INFO) << "Delaying fetch completion in mock";
72 sleeper_->DelayedCompleteFetch(success_, url_, delegate(), 100);
73 }
74
75 private:
76 class Sleeper : public base::RefCountedThreadSafe<Sleeper> {
77 public:
78 Sleeper() {}
79 virtual ~Sleeper() {}
80
81 void DelayedCompleteFetch(bool success,
82 const GURL& url,
83 URLFetcher::Delegate* d,
84 int delay_ms) {
85 task_ = NewRunnableMethod(this,
86 &TimedMockFetcher::Sleeper::CompleteFetch,
87 success,
88 url,
89 d);
90 ChromeThread::PostDelayedTask(ChromeThread::UI,
91 FROM_HERE,
92 task_,
93 delay_ms);
94 }
95
96 void CompleteFetch(bool success,
97 const GURL& url,
98 URLFetcher::Delegate* d) {
99 ADD_FAILURE() << "Should not have completed fetch in TimedMockFetcher";
100 MessageLoop::current()->Quit(); // Allow exiting even if we mess up.
101 }
DaveMoore 2010/07/28 04:44:33 nit: nl
Chris Masone 2010/07/28 05:55:52 Done.
102 CancelableTask* task_;
oshima 2010/07/28 08:00:10 DISALLOW_COPY_AND_ASSIGN
103 };
104 bool success_;
105 GURL url_;
106
107 scoped_refptr<Sleeper> sleeper_;
108
109 DISALLOW_COPY_AND_ASSIGN(TimedMockFetcher);
110 };
111
54 class GoogleAuthenticatorTest : public ::testing::Test { 112 class GoogleAuthenticatorTest : public ::testing::Test {
55 public: 113 public:
56 GoogleAuthenticatorTest() 114 GoogleAuthenticatorTest()
57 : username_("me@nowhere.org"), 115 : username_("me@nowhere.org"),
58 bytes_as_ascii_("ffff") { 116 bytes_as_ascii_("ffff") {
59 memset(fake_hash_, 0, sizeof(fake_hash_)); 117 memset(fake_hash_, 0, sizeof(fake_hash_));
60 fake_hash_[0] = 10; 118 fake_hash_[0] = 10;
61 fake_hash_[1] = 1; 119 fake_hash_[1] = 1;
62 fake_hash_[7] = 10 << 4; 120 fake_hash_[7] = 10 << 4;
63 hash_ascii_.assign("0a010000000000a0"); 121 hash_ascii_.assign("0a010000000000a0");
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 filename)); 185 filename));
128 } 186 }
129 187
130 void PrepForLogin(GoogleAuthenticator* auth) { 188 void PrepForLogin(GoogleAuthenticator* auth) {
131 auth->set_password_hash(hash_ascii_); 189 auth->set_password_hash(hash_ascii_);
132 auth->set_username(username_); 190 auth->set_username(username_);
133 auth->SetLocalaccount(""); 191 auth->SetLocalaccount("");
134 } 192 }
135 193
136 void CancelLogin(GoogleAuthenticator* auth) { 194 void CancelLogin(GoogleAuthenticator* auth) {
137 ChromeThread::PostDelayedTask( 195 ChromeThread::PostTask(
138 ChromeThread::UI, 196 ChromeThread::UI,
139 FROM_HERE, 197 FROM_HERE,
140 NewRunnableMethod(auth, 198 NewRunnableMethod(auth,
141 &GoogleAuthenticator::CancelClientLogin), 199 &GoogleAuthenticator::CancelClientLogin));
142 50);
143 } 200 }
144 201
145 unsigned char fake_hash_[32]; 202 unsigned char fake_hash_[32];
146 std::string hash_ascii_; 203 std::string hash_ascii_;
147 std::string username_; 204 std::string username_;
148 GaiaAuthConsumer::ClientLoginResult result_; 205 GaiaAuthConsumer::ClientLoginResult result_;
149 // Mocks, destroyed by CrosLibrary class. 206 // Mocks, destroyed by CrosLibrary class.
150 MockCryptohomeLibrary* mock_library_; 207 MockCryptohomeLibrary* mock_library_;
151 MockLibraryLoader* loader_; 208 MockLibraryLoader* loader_;
152 char raw_bytes_[2]; 209 char raw_bytes_[2];
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
479 .RetiresOnSaturation(); 536 .RetiresOnSaturation();
480 537
481 scoped_refptr<GoogleAuthenticator> auth(new GoogleAuthenticator(&consumer)); 538 scoped_refptr<GoogleAuthenticator> auth(new GoogleAuthenticator(&consumer));
482 PrepForLogin(auth.get()); 539 PrepForLogin(auth.get());
483 auth->SetLocalaccount(username_); 540 auth->SetLocalaccount(username_);
484 541
485 auth->CheckLocalaccount(std::string()); 542 auth->CheckLocalaccount(std::string());
486 } 543 }
487 544
488 // Compatible with LoginStatusConsumer::OnLoginSuccess() 545 // Compatible with LoginStatusConsumer::OnLoginSuccess()
489 static void Quit(const std::string& username, 546 static void OnSuccessQuit(
490 const GaiaAuthConsumer::ClientLoginResult& credentials) { 547 const std::string& username,
548 const GaiaAuthConsumer::ClientLoginResult& credentials) {
549 MessageLoop::current()->Quit();
550 }
DaveMoore 2010/07/28 04:44:33 nit: nl
Chris Masone 2010/07/28 05:55:52 Done.
551 static void OnSuccessQuitAndFail(
552 const std::string& username,
553 const GaiaAuthConsumer::ClientLoginResult& credentials) {
554 ADD_FAILURE() << "Login should NOT have succeeded!";
491 MessageLoop::current()->Quit(); 555 MessageLoop::current()->Quit();
492 } 556 }
DaveMoore 2010/07/28 04:44:33 nit: nl
Chris Masone 2010/07/28 05:55:52 Done.
493 // Compatible with LoginStatusConsumer::OnLoginFailure() 557 // Compatible with LoginStatusConsumer::OnLoginFailure()
494 static void QuitAndFail(const std::string& error) { 558 static void OnFailQuit(const std::string& error) {
559 MessageLoop::current()->Quit();
560 }
DaveMoore 2010/07/28 04:44:33 nit: nl
Chris Masone 2010/07/28 05:55:52 Done.
561 static void OnFailQuitAndFail(const std::string& error) {
495 ADD_FAILURE() << "Login should have succeeded!"; 562 ADD_FAILURE() << "Login should have succeeded!";
496 MessageLoop::current()->Quit(); 563 MessageLoop::current()->Quit();
497 } 564 }
oshima 2010/07/28 08:00:10 better to move these static functions to anonymous
498 565
499 TEST_F(GoogleAuthenticatorTest, LocalaccountLogin) { 566 TEST_F(GoogleAuthenticatorTest, LocalaccountLogin) {
500 // This test checks the logic that governs asynchronously reading the 567 // This test checks the logic that governs asynchronously reading the
501 // localaccount name off disk and trying to authenticate against it 568 // localaccount name off disk and trying to authenticate against it
502 // simultaneously. 569 // simultaneously.
503 MessageLoop message_loop(MessageLoop::TYPE_UI); 570 MessageLoop message_loop(MessageLoop::TYPE_UI);
504 ChromeThread ui_thread(ChromeThread::UI, &message_loop); 571 ChromeThread ui_thread(ChromeThread::UI, &message_loop);
505 572
506 MockConsumer consumer; 573 MockConsumer consumer;
507 ON_CALL(consumer, OnLoginSuccess(username_, _))
508 .WillByDefault(Invoke(Quit));
509 EXPECT_CALL(consumer, OnLoginSuccess(username_, _)) 574 EXPECT_CALL(consumer, OnLoginSuccess(username_, _))
510 .Times(1) 575 .WillOnce(Invoke(OnSuccessQuit))
511 .RetiresOnSaturation(); 576 .RetiresOnSaturation();
512 EXPECT_CALL(*mock_library_, MountForBwsi(_)) 577 EXPECT_CALL(*mock_library_, MountForBwsi(_))
513 .WillOnce(Return(true)) 578 .WillOnce(Return(true))
514 .RetiresOnSaturation(); 579 .RetiresOnSaturation();
515 // Enable the test to terminate (and fail), even if the login fails. 580 // Enable the test to terminate (and fail), even if the login fails.
516 ON_CALL(consumer, OnLoginFailure(_)) 581 ON_CALL(consumer, OnLoginFailure(_))
517 .WillByDefault(Invoke(QuitAndFail)); 582 .WillByDefault(Invoke(OnFailQuitAndFail));
518 583
519 // Manually prep for login, so that localaccount isn't set for us. 584 // Manually prep for login, so that localaccount isn't set for us.
520 scoped_refptr<GoogleAuthenticator> auth(new GoogleAuthenticator(&consumer)); 585 scoped_refptr<GoogleAuthenticator> auth(new GoogleAuthenticator(&consumer));
521 auth->set_password_hash(hash_ascii_); 586 auth->set_password_hash(hash_ascii_);
522 auth->set_username(username_); 587 auth->set_username(username_);
523 588
524 // First, force a check of username_ against the localaccount -- which we 589 // First, force a check of username_ against the localaccount -- which we
525 // haven't yet gotten off disk. 590 // haven't yet gotten off disk.
526 ChromeThread::PostTask( 591 ChromeThread::PostTask(
527 ChromeThread::UI, FROM_HERE, 592 ChromeThread::UI, FROM_HERE,
(...skipping 27 matching lines...) Expand all
555 EXPECT_CALL(*mock_library_, Mount(username_, _, _)) 620 EXPECT_CALL(*mock_library_, Mount(username_, _, _))
556 .WillOnce(Return(true)) 621 .WillOnce(Return(true))
557 .RetiresOnSaturation(); 622 .RetiresOnSaturation();
558 623
559 EXPECT_CALL(*mock_library_, GetSystemSalt()) 624 EXPECT_CALL(*mock_library_, GetSystemSalt())
560 .WillOnce(Return(salt_v)) 625 .WillOnce(Return(salt_v))
561 .RetiresOnSaturation(); 626 .RetiresOnSaturation();
562 627
563 TestingProfile profile; 628 TestingProfile profile;
564 629
565 MockFactory factory; 630 MockFactory<MockFetcher> factory;
566 URLFetcher::set_factory(&factory); 631 URLFetcher::set_factory(&factory);
567 632
568 scoped_refptr<GoogleAuthenticator> auth(new GoogleAuthenticator(&consumer)); 633 scoped_refptr<GoogleAuthenticator> auth(new GoogleAuthenticator(&consumer));
569 auth->AuthenticateToLogin( 634 auth->AuthenticateToLogin(
570 &profile, username_, hash_ascii_, std::string(), std::string()); 635 &profile, username_, hash_ascii_, std::string(), std::string());
571 636
572 URLFetcher::set_factory(NULL); 637 URLFetcher::set_factory(NULL);
573 message_loop.RunAllPending(); 638 message_loop.RunAllPending();
574 } 639 }
575 640
576 TEST_F(GoogleAuthenticatorTest, CancelLogin) { 641 TEST_F(GoogleAuthenticatorTest, CancelLogin) {
577 MessageLoopForUI message_loop; 642 MessageLoop message_loop(MessageLoop::TYPE_UI);
oshima 2010/07/28 08:00:10 just for my understanding. what's the difference?
Chris Masone 2010/07/28 15:25:30 You can't call Run() on a MessageLoopForUI, only R
578 ChromeThread ui_thread(ChromeThread::UI, &message_loop); 643 ChromeThread ui_thread(ChromeThread::UI, &message_loop);
579 chromeos::CryptohomeBlob salt_v(fake_hash_, fake_hash_ + sizeof(fake_hash_)); 644 chromeos::CryptohomeBlob salt_v(fake_hash_, fake_hash_ + sizeof(fake_hash_));
580 645
581 MockConsumer consumer; 646 MockConsumer consumer;
582 EXPECT_CALL(consumer, OnLoginFailure(_)) 647 EXPECT_CALL(consumer, OnLoginFailure(_))
583 .Times(1) 648 .WillOnce(Invoke(OnFailQuit))
584 .RetiresOnSaturation(); 649 .RetiresOnSaturation();
650 ON_CALL(consumer, OnLoginSuccess(username_, _))
651 .WillByDefault(Invoke(OnSuccessQuitAndFail));
585 652
586 EXPECT_CALL(*mock_library_, GetSystemSalt()) 653 EXPECT_CALL(*mock_library_, GetSystemSalt())
587 .WillOnce(Return(salt_v)) 654 .WillOnce(Return(salt_v))
588 .RetiresOnSaturation(); 655 .RetiresOnSaturation();
589 EXPECT_CALL(*mock_library_, CheckKey(username_, _)) 656 EXPECT_CALL(*mock_library_, CheckKey(username_, _))
590 .WillOnce(Return(false)) 657 .WillOnce(Return(false))
591 .RetiresOnSaturation(); 658 .RetiresOnSaturation();
592 659
593 TestingProfile profile; 660 TestingProfile profile;
594 661
595 MockFactory factory; 662 MockFactory<TimedMockFetcher> factory;
596 factory.set_success(false);
597 URLFetcher::set_factory(&factory); 663 URLFetcher::set_factory(&factory);
598 664
599 scoped_refptr<GoogleAuthenticator> auth(new GoogleAuthenticator(&consumer)); 665 scoped_refptr<GoogleAuthenticator> auth(new GoogleAuthenticator(&consumer));
600 ReadLocalaccountFile(auth.get(), ""); // No localaccount file. 666
667 // For when |auth| tries to load the localaccount file.
668 ChromeThread file_thread(ChromeThread::FILE);
669 file_thread.Start();
670
601 auth->AuthenticateToLogin( 671 auth->AuthenticateToLogin(
602 &profile, username_, hash_ascii_, std::string(), std::string()); 672 &profile, username_, hash_ascii_, std::string(), std::string());
603 CancelLogin(auth.get()); 673 CancelLogin(auth.get());
674
604 URLFetcher::set_factory(NULL); 675 URLFetcher::set_factory(NULL);
605 message_loop.RunAllPending(); 676 message_loop.Run();
677 }
678
679 TEST_F(GoogleAuthenticatorTest, CancelLoginAlreadyGotLocalaccount) {
680 MessageLoop message_loop(MessageLoop::TYPE_UI);
681 ChromeThread ui_thread(ChromeThread::UI, &message_loop);
682 chromeos::CryptohomeBlob salt_v(fake_hash_, fake_hash_ + sizeof(fake_hash_));
683
684 MockConsumer consumer;
685 EXPECT_CALL(consumer, OnLoginFailure(_))
686 .WillOnce(Invoke(OnFailQuit))
687 .RetiresOnSaturation();
688 ON_CALL(consumer, OnLoginSuccess(username_, _))
689 .WillByDefault(Invoke(OnSuccessQuitAndFail));
690
691 EXPECT_CALL(*mock_library_, GetSystemSalt())
692 .WillOnce(Return(salt_v))
693 .RetiresOnSaturation();
694 EXPECT_CALL(*mock_library_, CheckKey(username_, _))
695 .WillOnce(Return(false))
696 .RetiresOnSaturation();
697
698 TestingProfile profile;
699
700 MockFactory<TimedMockFetcher> factory;
701 URLFetcher::set_factory(&factory);
702
703 scoped_refptr<GoogleAuthenticator> auth(new GoogleAuthenticator(&consumer));
704 ReadLocalaccountFile(auth.get(), "");
705
706 auth->AuthenticateToLogin(
707 &profile, username_, hash_ascii_, std::string(), std::string());
708 CancelLogin(auth.get());
709
710 URLFetcher::set_factory(NULL);
711 message_loop.Run();
606 } 712 }
607 713
608 } // namespace chromeos 714 } // namespace chromeos
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/login/google_authenticator.cc ('k') | chrome/common/net/gaia/gaia_authenticator2_unittest.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698