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

Unified Diff: chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc

Issue 196783002: Export a private webstore API to call into the new inline sign-in flow. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 6 years, 8 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 side-by-side diff with in-line comments
Download patch
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..092fb8eb57aba57c29019ee0751526daa4a587de 100644
--- a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
+++ b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
@@ -4,11 +4,14 @@
#include <vector>
+#include "base/callback_list.h"
#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 +21,18 @@
#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/keyed_service/content/browser_context_dependency_manager.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 +102,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 +117,46 @@ 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();
+
+ will_create_browser_context_services_subscription_ =
+ BrowserContextDependencyManager::GetInstance()->
+ RegisterWillCreateBrowserContextServicesCallbackForTesting(
+ base::Bind(
+ &ExtensionWebstorePrivateApiTest::
+ OnWillCreateBrowserContextServices,
+ base::Unretained(this))).Pass();
+ }
+
+ void OnWillCreateBrowserContextServices(content::BrowserContext* context) {
+ // 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(
+ context, &FakeSigninManagerBase::Build);
+ ProfileOAuth2TokenServiceFactory::GetInstance()->SetTestingFactory(
+ context, &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_);
}
protected:
@@ -142,9 +193,36 @@ 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_;
+
+ private:
+ scoped_ptr<base::CallbackList<void(content::BrowserContext*)>::Subscription>
+ will_create_browser_context_services_subscription_;
+
};
// Test cases for webstore origin frame blocking.
@@ -152,11 +230,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 +245,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 +441,131 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebstoreGetWebGLStatusTest, Blocked) {
RunTest(webgl_allowed);
}
+IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest,
+ SignIn_UserGestureRequired) {
+ 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
« no previous file with comments | « chrome/browser/extensions/api/webstore_private/webstore_private_api.cc ('k') | chrome/browser/signin/fake_signin_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698