Index: chrome/browser/extensions/api/identity/gaia_web_auth_flow_unittest.cc |
diff --git a/chrome/browser/extensions/api/identity/gaia_web_auth_flow_unittest.cc b/chrome/browser/extensions/api/identity/gaia_web_auth_flow_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..77c7fc04972073b1a322c38881a02ff3f1d369dd |
--- /dev/null |
+++ b/chrome/browser/extensions/api/identity/gaia_web_auth_flow_unittest.cc |
@@ -0,0 +1,235 @@ |
+// 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 "chrome/browser/extensions/api/identity/gaia_web_auth_flow.h" |
+ |
+#include <vector> |
+ |
+#include "testing/gmock/include/gmock/gmock.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace extensions { |
+ |
+class FakeWebAuthFlow : public WebAuthFlow { |
+ public: |
+ explicit FakeWebAuthFlow(WebAuthFlow::Delegate* delegate) |
+ : WebAuthFlow(delegate, |
+ NULL, |
+ GURL(), |
+ WebAuthFlow::INTERACTIVE, |
+ gfx::Rect(), |
+ chrome::GetActiveDesktop()) {} |
+ |
+ virtual void Start() OVERRIDE {} |
+}; |
+ |
+class TestGaiaWebAuthFlow : public GaiaWebAuthFlow { |
+ public: |
+ TestGaiaWebAuthFlow(GaiaWebAuthFlow::Delegate* delegate, |
+ const std::string& extension_id, |
+ const OAuth2Info& oauth2_info, |
+ GoogleServiceAuthError::State ubertoken_error_state) |
+ : GaiaWebAuthFlow(delegate, |
+ NULL, |
+ chrome::GetActiveDesktop(), |
+ "extension_id", |
+ oauth2_info), |
+ ubertoken_error_(ubertoken_error_state) {} |
+ |
+ virtual void Start() OVERRIDE { |
+ if (ubertoken_error_.state() == GoogleServiceAuthError::NONE) |
+ OnUbertokenSuccess("fake_ubertoken"); |
+ else |
+ OnUbertokenFailure(ubertoken_error_); |
+ } |
+ |
+ private: |
+ virtual scoped_ptr<WebAuthFlow> CreateWebAuthFlow(GURL url) OVERRIDE { |
+ return scoped_ptr<WebAuthFlow>(new FakeWebAuthFlow(this)); |
+ } |
+ |
+ GoogleServiceAuthError ubertoken_error_; |
+}; |
+ |
+class MockGaiaWebAuthFlowDelegate : public GaiaWebAuthFlow::Delegate { |
+ public: |
+ MOCK_METHOD3(OnGaiaFlowFailure, |
+ void(GaiaWebAuthFlow::Failure failure, |
+ GoogleServiceAuthError service_error, |
+ const std::string& oauth_error)); |
+ MOCK_METHOD2(OnGaiaFlowCompleted, |
+ void(const std::string& access_token, |
+ const std::string& expiration)); |
+}; |
+ |
+class IdentityGaiaWebAuthFlowTest : public testing::Test { |
+ public: |
+ IdentityGaiaWebAuthFlowTest() |
+ : ubertoken_error_state_(GoogleServiceAuthError::NONE) {} |
+ |
+ scoped_ptr<TestGaiaWebAuthFlow> CreateTestFlow() { |
+ OAuth2Info oauth2_info; |
+ oauth2_info.client_id = "fake.client.id"; |
+ return scoped_ptr<TestGaiaWebAuthFlow>(new TestGaiaWebAuthFlow( |
+ &delegate_, "extension_id", oauth2_info, ubertoken_error_state_)); |
+ |
+ } |
+ |
+ std::string GetFinalTitle(const std::string& fragment) { |
+ return std::string("Loading id.client.fake:/extension_id#") + fragment; |
+ } |
+ |
+ GoogleServiceAuthError GetNoneServiceError() { |
+ return GoogleServiceAuthError(GoogleServiceAuthError::NONE); |
+ } |
+ |
+ void set_ubertoken_error( |
+ GoogleServiceAuthError::State ubertoken_error_state) { |
+ ubertoken_error_state_ = ubertoken_error_state; |
+ } |
+ |
+ protected: |
+ testing::StrictMock<MockGaiaWebAuthFlowDelegate> delegate_; |
+ GoogleServiceAuthError::State ubertoken_error_state_; |
+}; |
+ |
+TEST_F(IdentityGaiaWebAuthFlowTest, OAuthError) { |
+ scoped_ptr<TestGaiaWebAuthFlow> flow = CreateTestFlow(); |
+ flow->Start(); |
+ EXPECT_CALL(delegate_, OnGaiaFlowFailure( |
+ GaiaWebAuthFlow::OAUTH_ERROR, |
+ GoogleServiceAuthError(GoogleServiceAuthError::NONE), |
+ "access_denied")); |
+ flow->OnAuthFlowTitleChange(GetFinalTitle("error=access_denied")); |
+} |
+ |
+TEST_F(IdentityGaiaWebAuthFlowTest, Token) { |
+ scoped_ptr<TestGaiaWebAuthFlow> flow = CreateTestFlow(); |
+ flow->Start(); |
+ EXPECT_CALL(delegate_, OnGaiaFlowCompleted("fake_access_token", "")); |
+ flow->OnAuthFlowTitleChange(GetFinalTitle("access_token=fake_access_token")); |
+} |
+ |
+TEST_F(IdentityGaiaWebAuthFlowTest, TokenAndExpiration) { |
+ scoped_ptr<TestGaiaWebAuthFlow> flow = CreateTestFlow(); |
+ flow->Start(); |
+ EXPECT_CALL(delegate_, OnGaiaFlowCompleted("fake_access_token", "3600")); |
+ flow->OnAuthFlowTitleChange( |
+ GetFinalTitle("access_token=fake_access_token&expires_in=3600")); |
+} |
+ |
+TEST_F(IdentityGaiaWebAuthFlowTest, ExtraFragmentParametersSuccess) { |
+ scoped_ptr<TestGaiaWebAuthFlow> flow = CreateTestFlow(); |
+ flow->Start(); |
+ EXPECT_CALL(delegate_, |
+ OnGaiaFlowCompleted("fake_access_token", "3600")); |
+ flow->OnAuthFlowTitleChange(GetFinalTitle("chaff1=stuff&" |
+ "expires_in=3600&" |
+ "chaff2=and&" |
+ "nonerror=fake_error&" |
+ "chaff3=nonsense&" |
+ "access_token=fake_access_token&" |
+ "chaff4=")); |
+} |
+ |
+TEST_F(IdentityGaiaWebAuthFlowTest, ExtraFragmentParametersError) { |
+ scoped_ptr<TestGaiaWebAuthFlow> flow = CreateTestFlow(); |
+ flow->Start(); |
+ EXPECT_CALL(delegate_, OnGaiaFlowFailure( |
+ GaiaWebAuthFlow::OAUTH_ERROR, |
+ GoogleServiceAuthError(GoogleServiceAuthError::NONE), |
+ "fake_error")); |
+ flow->OnAuthFlowTitleChange(GetFinalTitle("chaff1=stuff&" |
+ "expires_in=3600&" |
+ "chaff2=and&" |
+ "error=fake_error&" |
+ "chaff3=nonsense&" |
+ "access_token=fake_access_token&" |
+ "chaff4=")); |
+} |
+ |
+TEST_F(IdentityGaiaWebAuthFlowTest, TitleSpam) { |
+ scoped_ptr<TestGaiaWebAuthFlow> flow = CreateTestFlow(); |
+ flow->Start(); |
+ flow->OnAuthFlowTitleChange( |
+ "Loading https://extension_id.chromiumapp.org/#error=non_final_title"); |
+ flow->OnAuthFlowTitleChange("I'm feeling entitled."); |
+ flow->OnAuthFlowTitleChange(""); |
+ flow->OnAuthFlowTitleChange( |
+ "Loading id.client.fake:/bad_extension_id#error=non_final_title"); |
+ flow->OnAuthFlowTitleChange( |
+ "Loading bad.id.client.fake:/extension_id#error=non_final_title"); |
+ EXPECT_CALL(delegate_, OnGaiaFlowCompleted("fake_access_token", "")); |
+ flow->OnAuthFlowTitleChange(GetFinalTitle("access_token=fake_access_token")); |
+} |
+ |
+TEST_F(IdentityGaiaWebAuthFlowTest, EmptyFragment) { |
+ scoped_ptr<TestGaiaWebAuthFlow> flow = CreateTestFlow(); |
+ flow->Start(); |
+ EXPECT_CALL( |
+ delegate_, |
+ OnGaiaFlowFailure( |
+ GaiaWebAuthFlow::INVALID_REDIRECT, |
+ GoogleServiceAuthError(GoogleServiceAuthError::NONE), |
+ "")); |
+ flow->OnAuthFlowTitleChange(GetFinalTitle("")); |
+} |
+ |
+TEST_F(IdentityGaiaWebAuthFlowTest, JunkFragment) { |
+ scoped_ptr<TestGaiaWebAuthFlow> flow = CreateTestFlow(); |
+ flow->Start(); |
+ EXPECT_CALL( |
+ delegate_, |
+ OnGaiaFlowFailure( |
+ GaiaWebAuthFlow::INVALID_REDIRECT, |
+ GoogleServiceAuthError(GoogleServiceAuthError::NONE), |
+ "")); |
+ flow->OnAuthFlowTitleChange(GetFinalTitle("thisisjustabunchofjunk")); |
+} |
+ |
+TEST_F(IdentityGaiaWebAuthFlowTest, NoFragment) { |
+ scoped_ptr<TestGaiaWebAuthFlow> flow = CreateTestFlow(); |
+ flow->Start(); |
+ // This won't be recognized as an interesting title. |
+ flow->OnAuthFlowTitleChange("Loading id.client.fake:/extension_id"); |
+} |
+ |
+TEST_F(IdentityGaiaWebAuthFlowTest, Host) { |
+ scoped_ptr<TestGaiaWebAuthFlow> flow = CreateTestFlow(); |
+ flow->Start(); |
+ // These won't be recognized as interesting titles. |
+ flow->OnAuthFlowTitleChange( |
+ "Loading id.client.fake://extension_id#access_token=fake_access_token"); |
+ flow->OnAuthFlowTitleChange( |
+ "Loading id.client.fake://extension_id/#access_token=fake_access_token"); |
+ flow->OnAuthFlowTitleChange( |
+ "Loading " |
+ "id.client.fake://host/extension_id/#access_token=fake_access_token"); |
+} |
+ |
+TEST_F(IdentityGaiaWebAuthFlowTest, UbertokenFailure) { |
+ set_ubertoken_error(GoogleServiceAuthError::CONNECTION_FAILED); |
+ scoped_ptr<TestGaiaWebAuthFlow> flow = CreateTestFlow(); |
+ EXPECT_CALL( |
+ delegate_, |
+ OnGaiaFlowFailure( |
+ GaiaWebAuthFlow::SERVICE_AUTH_ERROR, |
+ GoogleServiceAuthError(GoogleServiceAuthError::CONNECTION_FAILED), |
+ "")); |
+ flow->Start(); |
+} |
+ |
+TEST_F(IdentityGaiaWebAuthFlowTest, AuthFlowFailure) { |
+ scoped_ptr<TestGaiaWebAuthFlow> flow = CreateTestFlow(); |
+ flow->Start(); |
+ EXPECT_CALL( |
+ delegate_, |
+ OnGaiaFlowFailure( |
+ GaiaWebAuthFlow::WINDOW_CLOSED, |
+ GoogleServiceAuthError(GoogleServiceAuthError::NONE), |
+ "")); |
+ flow->OnAuthFlowFailure(WebAuthFlow::WINDOW_CLOSED); |
+} |
+ |
+} // namespace extensions |