Chromium Code Reviews| Index: chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc |
| diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc |
| index 15b5556b27d917b67165a33261a999ad57736850..e34c1d6254f5864a5784ad23f7fd41d8972aae72 100644 |
| --- a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc |
| +++ b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc |
| @@ -6,9 +6,11 @@ |
| #include "base/file_util.h" |
| #include "base/files/file_path.h" |
| +#include "base/strings/string_number_conversions.h" |
| #include "base/strings/stringprintf.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "chrome/browser/chrome_notification_types.h" |
| +#include "chrome/browser/extensions/api/identity/identity_api.h" |
| #include "chrome/browser/extensions/api/management/management_api.h" |
| #include "chrome/browser/extensions/api/webstore_private/webstore_private_api.h" |
| #include "chrome/browser/extensions/extension_apitest.h" |
| @@ -18,10 +20,17 @@ |
| #include "chrome/browser/extensions/extension_service.h" |
| #include "chrome/browser/extensions/webstore_installer.h" |
| #include "chrome/browser/profiles/profile.h" |
| +#include "chrome/browser/signin/fake_profile_oauth2_token_service.h" |
| +#include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h" |
| +#include "chrome/browser/signin/fake_signin_manager.h" |
| +#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" |
| +#include "chrome/browser/signin/signin_manager_factory.h" |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| #include "chrome/common/chrome_switches.h" |
| #include "chrome/test/base/ui_test_utils.h" |
| +#include "components/signin/core/browser/signin_manager.h" |
| +#include "components/signin/core/browser/test_signin_client.h" |
| #include "content/public/browser/gpu_data_manager.h" |
| #include "content/public/browser/notification_observer.h" |
| #include "content/public/browser/notification_registrar.h" |
| @@ -91,6 +100,11 @@ class WebstoreInstallListener : public WebstoreInstaller::Delegate { |
| // A base class for tests below. |
| class ExtensionWebstorePrivateApiTest : public ExtensionApiTest { |
| public: |
| + ExtensionWebstorePrivateApiTest() |
| + : signin_manager_(NULL), |
| + token_service_(NULL) {} |
| + virtual ~ExtensionWebstorePrivateApiTest() {} |
| + |
| virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { |
| ExtensionApiTest::SetUpCommandLine(command_line); |
| command_line->AppendSwitchASCII( |
| @@ -101,11 +115,41 @@ class ExtensionWebstorePrivateApiTest : public ExtensionApiTest { |
| } |
| virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { |
| + ExtensionApiTest::SetUpInProcessBrowserTestFixture(); |
| + |
| // Start up the test server and get us ready for calling the install |
| // API functions. |
| host_resolver()->AddRule("www.example.com", "127.0.0.1"); |
| - ASSERT_TRUE(test_server()->Start()); |
| + ASSERT_TRUE(StartSpawnedTestServer()); |
| ExtensionInstallUI::set_disable_failure_ui_for_tests(); |
| + |
| + // Replace the signin manager and token service with fakes. Do this ahead of |
| + // creating the browser so that a bunch of classes don't register as |
| + // observers and end up needing to unregister when the fake is substituted. |
| + SigninManagerFactory::GetInstance()->SetTestingFactory( |
| + NULL, &FakeSigninManagerBase::Build); |
|
Elliot Glaysher
2014/04/21 18:19:45
So I came here from the other review. You're setti
|
| + ProfileOAuth2TokenServiceFactory::GetInstance()->SetTestingFactory( |
| + NULL, &BuildFakeProfileOAuth2TokenService); |
| + } |
| + |
| + virtual void SetUpOnMainThread() OVERRIDE { |
| + ExtensionApiTest::SetUpOnMainThread(); |
| + |
| + // Grab references to the fake signin manager and token service. |
| + signin_manager_ = |
| + static_cast<FakeSigninManagerForTesting*>( |
| + SigninManagerFactory::GetInstance()->GetForProfile(profile())); |
| + ASSERT_TRUE(signin_manager_); |
| + token_service_ = |
| + static_cast<FakeProfileOAuth2TokenService*>( |
| + ProfileOAuth2TokenServiceFactory::GetInstance()->GetForProfile( |
| + profile())); |
| + ASSERT_TRUE(token_service_); |
| + |
| + // Don't require user gestures for tests, so that all the other behavior can |
| + // be tested. There is a test that unsets this, to test that the user |
| + // gesture verification is in place as well. |
| + WebstorePrivateSignInFunction::SetIgnoreUserGestureForTests(true); |
|
not at google - send to devlin
2014/04/21 18:04:42
you can do better than this: wrap the webstore API
Ilya Sherman
2014/04/22 05:02:32
Done.
|
| } |
| protected: |
| @@ -142,9 +186,31 @@ class ExtensionWebstorePrivateApiTest : public ExtensionApiTest { |
| #endif |
| } |
| + // Navigates to |page| and waits for the API call. |
| + void StartSignInTest(const std::string& page) { |
| + ui_test_utils::NavigateToURL(browser(), GetTestServerURL(page)); |
| + |
| + // Wait for the API to be called. A simple way to wait for this is to run |
| + // some other JavaScript in the page and wait for a round-trip back to the |
| + // browser process. |
| + bool result = false; |
| + ASSERT_TRUE( |
| + content::ExecuteScriptAndExtractBool( |
| + GetWebContents(), "window.domAutomationController.send(true)", |
| + &result)); |
| + ASSERT_TRUE(result); |
| + } |
| + |
| + content::WebContents* GetWebContents() { |
| + return browser()->tab_strip_model()->GetActiveWebContents(); |
| + } |
| + |
| ExtensionService* service() { |
| return browser()->profile()->GetExtensionService(); |
| } |
| + |
| + FakeSigninManagerForTesting* signin_manager_; |
| + FakeProfileOAuth2TokenService* token_service_; |
| }; |
| // Test cases for webstore origin frame blocking. |
| @@ -152,11 +218,9 @@ class ExtensionWebstorePrivateApiTest : public ExtensionApiTest { |
| // Chromium, see crbug.com/226018. |
| IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
| DISABLED_FrameWebstorePageBlocked) { |
| - content::WebContents* contents = |
| - browser()->tab_strip_model()->GetActiveWebContents(); |
| base::string16 expected_title = base::UTF8ToUTF16("PASS: about:blank"); |
| base::string16 failure_title = base::UTF8ToUTF16("FAIL"); |
| - content::TitleWatcher watcher(contents, expected_title); |
| + content::TitleWatcher watcher(GetWebContents(), expected_title); |
| watcher.AlsoWaitForTitle(failure_title); |
| GURL url = test_server()->GetURL( |
| "files/extensions/api_test/webstore_private/noframe.html"); |
| @@ -169,11 +233,9 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
| // Chromium, see crbug.com/226018. |
| IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
| DISABLED_FrameErrorPageBlocked) { |
| - content::WebContents* contents = |
| - browser()->tab_strip_model()->GetActiveWebContents(); |
| base::string16 expected_title = base::UTF8ToUTF16("PASS: about:blank"); |
| base::string16 failure_title = base::UTF8ToUTF16("FAIL"); |
| - content::TitleWatcher watcher(contents, expected_title); |
| + content::TitleWatcher watcher(GetWebContents(), expected_title); |
| watcher.AlsoWaitForTitle(failure_title); |
| GURL url = test_server()->GetURL( |
| "files/extensions/api_test/webstore_private/noframe2.html"); |
| @@ -367,4 +429,132 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebstoreGetWebGLStatusTest, Blocked) { |
| RunTest(webgl_allowed); |
| } |
| +IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
| + SignIn_UserGestureRequired) { |
| + WebstorePrivateSignInFunction::SetIgnoreUserGestureForTests(false); |
| + GURL page_url = GetTestServerURL("sign_in_user_gesture_required.html"); |
| + ASSERT_TRUE(RunPageTest(page_url.spec())); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
| + SignIn_MissingContinueUrl) { |
| + GURL page_url = GetTestServerURL("sign_in_missing_continue_url.html"); |
| + ASSERT_TRUE(RunPageTest(page_url.spec())); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
| + SignIn_InvalidContinueUrl) { |
| + GURL page_url = GetTestServerURL("sign_in_invalid_continue_url.html"); |
| + ASSERT_TRUE(RunPageTest(page_url.spec())); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
| + SignIn_ContinueUrlOnDifferentOrigin) { |
| + GURL page_url = |
| + GetTestServerURL("sign_in_continue_url_on_different_origin.html"); |
| + ASSERT_TRUE(RunPageTest(page_url.spec())); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
| + SignIn_DisallowedInIncognito) { |
| + // Make sure that the test is testing something more than the absence of a |
| + // sign-in manager for this profile. |
| + ASSERT_TRUE(SigninManagerFactory::GetForProfile(profile())); |
| + |
| + GURL page_url = |
| + GetTestServerURL("sign_in_disallowed_in_incognito.html"); |
| + ASSERT_TRUE( |
| + RunPageTest(page_url.spec(), ExtensionApiTest::kFlagUseIncognito)); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
| + SignIn_DisabledWhenWebBasedSigninIsEnabled) { |
| + // Make sure that the test is testing something more than the absence of a |
| + // sign-in manager for this profile. |
| + ASSERT_TRUE(SigninManagerFactory::GetForProfile(profile())); |
| + |
| + CommandLine::ForCurrentProcess()->AppendSwitch( |
| + switches::kEnableWebBasedSignin); |
| + GURL page_url = GetTestServerURL( |
| + "sign_in_disabled_when_web_based_signin_is_enabled.html"); |
| + ASSERT_TRUE(RunPageTest(page_url.spec())); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
| + SignIn_AlreadySignedIn) { |
| + signin_manager_->SetAuthenticatedUsername("user@example.com"); |
| + GURL page_url = GetTestServerURL("sign_in_already_signed_in.html"); |
| + ASSERT_TRUE(RunPageTest(page_url.spec())); |
| +} |
| + |
| +// The FakeSignInManager class is not implemented for ChromeOS, so there's no |
| +// straightforward way to test these flows on that platform. |
| +#if !defined(OS_CHROMEOS) |
| +IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
| + SignIn_AuthInProgress_Fails) { |
| + // Initiate an authentication that will be in progress when the sign-in API is |
| + // called. |
| + signin_manager_->set_auth_in_progress("user@example.com"); |
| + |
| + // Navigate to the page, which will cause the sign-in API to be called. |
| + // Then, complete the authentication in a failed state. |
| + ResultCatcher catcher; |
| + StartSignInTest("sign_in_auth_in_progress_fails.html"); |
| + signin_manager_->FailSignin(GoogleServiceAuthError::AuthErrorNone()); |
| + ASSERT_TRUE(catcher.GetNextResult()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
| + SignIn_AuthInProgress_MergeSessionFails) { |
| + // Initiate an authentication that will be in progress when the sign-in API is |
| + // called. |
| + signin_manager_->set_auth_in_progress("user@example.com"); |
| + |
| + // Navigate to the page, which will cause the sign-in API to be called. |
| + // Then, complete the authentication in a successful state. |
| + ResultCatcher catcher; |
| + StartSignInTest("sign_in_auth_in_progress_merge_session_fails.html"); |
| + signin_manager_->CompletePendingSignin(); |
| + token_service_->IssueRefreshToken("token"); |
| + signin_manager_->NotifyMergeSessionObservers( |
| + GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE)); |
| + ASSERT_TRUE(catcher.GetNextResult()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
| + SignIn_AuthInProgress_Succeeds) { |
| + // Initiate an authentication that will be in progress when the sign-in API is |
| + // called. |
| + signin_manager_->set_auth_in_progress("user@example.com"); |
| + |
| + // Navigate to the page, which will cause the sign-in API to be called. |
| + // Then, complete the authentication in a successful state. |
| + ResultCatcher catcher; |
| + StartSignInTest("sign_in_auth_in_progress_succeeds.html"); |
| + signin_manager_->CompletePendingSignin(); |
| + token_service_->IssueRefreshToken("token"); |
| + signin_manager_->NotifyMergeSessionObservers( |
| + GoogleServiceAuthError::AuthErrorNone()); |
| + ASSERT_TRUE(catcher.GetNextResult()); |
| +} |
| +#endif // !defined (OS_CHROMEOS) |
| + |
| +IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
| + SignIn_RedirectToSignIn) { |
| + GURL signin_url( |
| + "chrome://chrome-signin/?source=5&" |
| + "continue=http%3A%2F%2Fwww.example.com%3A" + |
| + base::IntToString(test_server()->host_port_pair().port()) + |
| + "%2Fcontinue"); |
| + ui_test_utils::UrlLoadObserver observer( |
| + signin_url, |
| + content::Source<content::NavigationController>( |
| + &GetWebContents()->GetController())); |
| + StartSignInTest("sign_in_redirect_to_sign_in.html"); |
| + observer.Wait(); |
| + |
| + // TODO(isherman): Also test the redirect back to the continue URL once |
| + // sign-in completes? |
| +} |
| + |
| } // namespace extensions |