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

Unified Diff: chrome/browser/chromeos/login/oauth2_browsertest.cc

Issue 99863007: Added CrOS-specific OAuth2 browser test. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/login/oauth2_browsertest.cc
diff --git a/chrome/browser/chromeos/login/oauth2_browsertest.cc b/chrome/browser/chromeos/login/oauth2_browsertest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..e6c7775312995685bc598ee3816e5bea52cf1226
--- /dev/null
+++ b/chrome/browser/chromeos/login/oauth2_browsertest.cc
@@ -0,0 +1,197 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/message_loop/message_loop.h"
+#include "chrome/browser/chrome_notification_types.h"
+#include "chrome/browser/chromeos/login/oauth2_login_manager.h"
+#include "chrome/browser/chromeos/login/oauth2_login_manager_factory.h"
+#include "chrome/browser/chromeos/login/oobe_base_test.h"
+#include "chrome/browser/chromeos/login/wizard_controller.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
+#include "content/public/browser/notification_service.h"
+#include "google_apis/gaia/gaia_constants.h"
+#include "google_apis/gaia/gaia_urls.h"
+
+namespace chromeos {
+
+namespace {
+
+// Timeout while waiting for network connectivity during tests.
+const int kTestNetworkTimeoutSeconds = 1;
xiyuan 2013/12/16 21:04:55 Seems not used.
zel 2013/12/16 21:27:38 Done.
+
+// Email of owner account for test.
+const char kTestAccountId[] = "username@gmail.com";
+
+const char kTestAuthCode[] = "fake-auth-code";
+const char kTestGaiaUberToken[] = "fake-uber-token";
+const char kTestAuthLoginAccessToken[] = "fake-access-token";
+const char kTestRefreshToken[] = "fake-refresh-token";
+const char kTestSessionSIDCookie[] = "fake-session-SID-cookie";
+const char kTestSessionLSIDCookie[] = "fake-session-LSID-cookie";
+const char kTestUserinfoToken[] = "fake-userinfo-token";
+const char kTestLoginToken[] = "fake-login-token";
+const char kTestAccessToken[] = "fake-access-token";
+const char kTestSyncToken[] = "fake-sync-token";
+const char kTestAuthLoginToken[] = "fake-oauthlogin-token";
+const char kTestClientId[] = "fake-client-id";
+const char kTestAppScope[] =
+ "https://www.googleapis.com/auth/userinfo.profile";
+
+// Note the path name must be the same as in shill stub.
+const char kStubEthernetServicePath[] = "eth1";
xiyuan 2013/12/16 21:04:55 Seems not used.
zel 2013/12/16 21:27:38 Done.
+
+// Helper function for WaitForNetworkTimeOut.
+void OnNetworkWaitTimedOut(const base::Closure& runner_quit_task) {
xiyuan 2013/12/16 21:04:55 Seems not used.
zel 2013/12/16 21:27:38 Done.
+ runner_quit_task.Run();
+}
+
+} // namespace
+
+class OAuth2Test : public OobeBaseTest {
+ protected:
+ OAuth2Test() {}
+
+ virtual void SetUpOnMainThread() OVERRIDE {
+ OobeBaseTest::SetUpOnMainThread();
+
+ // Configure OAuth authentication.
+ GaiaUrls* gaia_urls = GaiaUrls::GetInstance();
+
+ fake_gaia_.SetAuthTokens(kTestAuthCode,
+ kTestRefreshToken,
+ kTestAuthLoginAccessToken,
+ kTestGaiaUberToken,
+ kTestSessionSIDCookie,
+ kTestSessionLSIDCookie);
+ // This token satisfies the userinfo.email request from
+ // DeviceOAuth2TokenService used in token validation.
+ FakeGaia::AccessTokenInfo userinfo_token_info;
+ userinfo_token_info.token = kTestUserinfoToken;
+ userinfo_token_info.scopes.insert(
+ "https://www.googleapis.com/auth/userinfo.email");
+ userinfo_token_info.audience = gaia_urls->oauth2_chrome_client_id();
+ userinfo_token_info.email = kTestAccountId;
+ fake_gaia_.IssueOAuthToken(kTestRefreshToken, userinfo_token_info);
+
+ FakeGaia::AccessTokenInfo userinfo_profile_token_info;
+ userinfo_profile_token_info.token = kTestUserinfoToken;
+ userinfo_profile_token_info.scopes.insert(
+ "https://www.googleapis.com/auth/userinfo.profile");
+ userinfo_profile_token_info.audience = gaia_urls->oauth2_chrome_client_id();
+ userinfo_profile_token_info.email = kTestAccountId;
+ fake_gaia_.IssueOAuthToken(kTestRefreshToken, userinfo_profile_token_info);
+
+ // The any-api access token for accessing the token minting endpoint.
+ FakeGaia::AccessTokenInfo login_token_info;
+ login_token_info.token = kTestLoginToken;
+ login_token_info.scopes.insert(GaiaConstants::kAnyApiOAuth2Scope);
+ login_token_info.audience = gaia_urls->oauth2_chrome_client_id();
+ fake_gaia_.IssueOAuthToken(kTestRefreshToken, login_token_info);
+
+ // The /auth/chromesync access token for accessing sync endpoint.
+ FakeGaia::AccessTokenInfo sync_token_info;
+ sync_token_info.token = kTestSyncToken;
+ sync_token_info.scopes.insert(GaiaConstants::kChromeSyncOAuth2Scope);
+ sync_token_info.audience = gaia_urls->oauth2_chrome_client_id();
+ fake_gaia_.IssueOAuthToken(kTestRefreshToken, sync_token_info);
+
+ FakeGaia::AccessTokenInfo auth_login_token_info;
+ auth_login_token_info.token = kTestAuthLoginToken;
+ auth_login_token_info.scopes.insert(gaia_urls->oauth1_login_scope());
+ auth_login_token_info.audience = gaia_urls->oauth2_chrome_client_id();
+ fake_gaia_.IssueOAuthToken(kTestRefreshToken, auth_login_token_info);
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(OAuth2Test);
+};
+
+class OAuth2LoginManagerStateWaiter : public OAuth2LoginManager::Observer {
+ public:
+ explicit OAuth2LoginManagerStateWaiter(Profile* profile)
+ : profile_(profile),
+ waiting_for_state_(false),
+ final_state_(OAuth2LoginManager::SESSION_RESTORE_NOT_STARTED) {
+ }
+
+ void WaitForStates(
+ const std::set<OAuth2LoginManager::SessionRestoreState>& states) {
+ DCHECK(!waiting_for_state_);
+ OAuth2LoginManager* login_manager =
+ OAuth2LoginManagerFactory::GetInstance()->GetForProfile(profile_);
+ states_ = states;
+ if (states_.find(login_manager->state()) != states_.end()) {
+ final_state_ = login_manager->state();
+ return;
+ }
+
+ waiting_for_state_ = true;
+ login_manager->AddObserver(this);
+ runner_ = new content::MessageLoopRunner;
+ runner_->Run();
+ login_manager->RemoveObserver(this);
+ }
+
+ OAuth2LoginManager::SessionRestoreState final_state() { return final_state_; }
+
+ private:
+ // OAuth2LoginManager::Observer overrides.
+ virtual void OnSessionRestoreStateChanged(
+ Profile* user_profile,
+ OAuth2LoginManager::SessionRestoreState state) OVERRIDE {
+ if (!waiting_for_state_)
+ return;
+
+ if (states_.find(state) == states_.end())
+ return;
+
+ OAuth2LoginManager* login_manager =
+ OAuth2LoginManagerFactory::GetInstance()->GetForProfile(profile_);
+ login_manager->RemoveObserver(this);
xiyuan 2013/12/16 21:04:55 This is not necessary since we do that on line 134
zel 2013/12/16 21:27:38 Done.
+ final_state_ = state;
+ waiting_for_state_ = false;
+ runner_->Quit();
+ }
+
+ Profile* profile_;
+ std::set<OAuth2LoginManager::SessionRestoreState> states_;
+ bool waiting_for_state_;
+ OAuth2LoginManager::SessionRestoreState final_state_;
+ scoped_refptr<content::MessageLoopRunner> runner_;
+
+ DISALLOW_COPY_AND_ASSIGN(OAuth2LoginManagerStateWaiter);
+};
+
+IN_PROC_BROWSER_TEST_F(OAuth2Test, NewUser) {
+ SimulateNetworkOnline();
+ chromeos::WizardController::SkipPostLoginScreensForTesting();
+ chromeos::WizardController* wizard_controller =
+ chromeos::WizardController::default_controller();
+ wizard_controller->SkipToLoginForTesting(LoginScreenContext());
+
+ content::WindowedNotificationObserver(
+ chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE,
+ content::NotificationService::AllSources()).Wait();
+
+ // Use capitalized and dotted user name on purpose to make sure
+ // our email normalization kicks in.
+ GetLoginDisplay()->ShowSigninScreenForCreds("User.Name", "password");
+
+ content::WindowedNotificationObserver(
+ chrome::NOTIFICATION_SESSION_STARTED,
+ content::NotificationService::AllSources()).Wait();
+
+ std::set<OAuth2LoginManager::SessionRestoreState> states;
+ states.insert(OAuth2LoginManager::SESSION_RESTORE_DONE);
+ states.insert(OAuth2LoginManager::SESSION_RESTORE_FAILED);
+ states.insert(OAuth2LoginManager::SESSION_RESTORE_CONNECTION_FAILED);
+ OAuth2LoginManagerStateWaiter merge_session_waiter(
+ ProfileManager::GetPrimaryUserProfile());
+ merge_session_waiter.WaitForStates(states);
+ EXPECT_EQ(merge_session_waiter.final_state(),
+ OAuth2LoginManager::SESSION_RESTORE_DONE);
+}
+
+} // namespace chromeos

Powered by Google App Engine
This is Rietveld 408576698