diff options
Diffstat (limited to 'chromium/chrome/browser/signin/dice_tab_helper_unittest.cc')
-rw-r--r-- | chromium/chrome/browser/signin/dice_tab_helper_unittest.cc | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/chromium/chrome/browser/signin/dice_tab_helper_unittest.cc b/chromium/chrome/browser/signin/dice_tab_helper_unittest.cc new file mode 100644 index 00000000000..96eab075f2a --- /dev/null +++ b/chromium/chrome/browser/signin/dice_tab_helper_unittest.cc @@ -0,0 +1,253 @@ +// Copyright 2017 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/signin/dice_tab_helper.h" + +#include "base/test/metrics/histogram_tester.h" +#include "base/test/metrics/user_action_tester.h" +#include "chrome/test/base/chrome_render_view_host_test_harness.h" +#include "chrome/test/base/testing_profile.h" +#include "components/signin/public/base/signin_metrics.h" +#include "content/public/common/content_features.h" +#include "content/public/test/back_forward_cache_util.h" +#include "content/public/test/navigation_simulator.h" +#include "content/public/test/test_renderer_host.h" +#include "content/public/test/web_contents_tester.h" +#include "google_apis/gaia/gaia_urls.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/common/features.h" + +class DiceTabHelperTest : public ChromeRenderViewHostTestHarness { + public: + DiceTabHelperTest() { + signin_url_ = GaiaUrls::GetInstance()->signin_chrome_sync_dice(); + feature_list_.InitWithFeaturesAndParameters( + {{features::kBackForwardCache, {}}, + {features::kBackForwardCacheMemoryControls, {}}}, + {}); + } + + // Does a navigation to Gaia and initializes the tab helper. + void InitializeDiceTabHelper(DiceTabHelper* helper, + signin_metrics::AccessPoint access_point, + signin_metrics::Reason reason) { + // Load the signin page. + std::unique_ptr<content::NavigationSimulator> simulator = + content::NavigationSimulator::CreateRendererInitiated(signin_url_, + main_rfh()); + simulator->Start(); + helper->InitializeSigninFlow( + signin_url_, access_point, reason, + signin_metrics::PromoAction::PROMO_ACTION_NO_SIGNIN_PROMO, + GURL::EmptyGURL()); + EXPECT_TRUE(helper->IsChromeSigninPage()); + simulator->Commit(); + } + + GURL signin_url_; + base::test::ScopedFeatureList feature_list_; +}; + +// Tests DiceTabHelper intialization. +TEST_F(DiceTabHelperTest, Initialization) { + DiceTabHelper::CreateForWebContents(web_contents()); + DiceTabHelper* dice_tab_helper = + DiceTabHelper::FromWebContents(web_contents()); + + // Check default state. + EXPECT_EQ(signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN, + dice_tab_helper->signin_access_point()); + EXPECT_EQ(signin_metrics::Reason::kUnknownReason, + dice_tab_helper->signin_reason()); + EXPECT_FALSE(dice_tab_helper->IsChromeSigninPage()); + + // Initialize the signin flow. + signin_metrics::AccessPoint access_point = + signin_metrics::AccessPoint::ACCESS_POINT_BOOKMARK_BUBBLE; + signin_metrics::Reason reason = signin_metrics::Reason::kSigninPrimaryAccount; + InitializeDiceTabHelper(dice_tab_helper, access_point, reason); + EXPECT_EQ(access_point, dice_tab_helper->signin_access_point()); + EXPECT_EQ(reason, dice_tab_helper->signin_reason()); + EXPECT_TRUE(dice_tab_helper->IsChromeSigninPage()); +} + +TEST_F(DiceTabHelperTest, SigninPageStatus) { + // The test assumes the previous page gets deleted after navigation and will + // be recreated after navigation (which resets the signin page state). Disable + // back/forward cache to ensure that it doesn't get preserved in the cache. + content::DisableBackForwardCacheForTesting( + web_contents(), content::BackForwardCache::TEST_ASSUMES_NO_CACHING); + DiceTabHelper::CreateForWebContents(web_contents()); + DiceTabHelper* dice_tab_helper = + DiceTabHelper::FromWebContents(web_contents()); + EXPECT_FALSE(dice_tab_helper->IsChromeSigninPage()); + + // Load the signin page. + signin_metrics::AccessPoint access_point = + signin_metrics::AccessPoint::ACCESS_POINT_BOOKMARK_BUBBLE; + signin_metrics::Reason reason = signin_metrics::Reason::kSigninPrimaryAccount; + InitializeDiceTabHelper(dice_tab_helper, access_point, reason); + EXPECT_TRUE(dice_tab_helper->IsChromeSigninPage()); + + // Reloading the signin page does not interrupt the signin flow. + content::NavigationSimulator::Reload(web_contents()); + EXPECT_TRUE(dice_tab_helper->IsChromeSigninPage()); + + // Subframe navigation are ignored. + std::unique_ptr<content::NavigationSimulator> simulator = + content::NavigationSimulator::CreateRendererInitiated( + signin_url_.Resolve("#baz"), main_rfh()); + simulator->CommitSameDocument(); + EXPECT_TRUE(dice_tab_helper->IsChromeSigninPage()); + + // Navigation in subframe does not interrupt the signin flow. + content::RenderFrameHostTester* render_frame_host_tester = + content::RenderFrameHostTester::For(main_rfh()); + content::RenderFrameHost* sub_frame = + render_frame_host_tester->AppendChild("subframe"); + content::NavigationSimulator::NavigateAndCommitFromDocument(signin_url_, + sub_frame); + EXPECT_TRUE(dice_tab_helper->IsChromeSigninPage()); + + // Navigating to a different page resets the page status. + simulator = content::NavigationSimulator::CreateRendererInitiated( + signin_url_.Resolve("/foo"), main_rfh()); + simulator->Start(); + EXPECT_FALSE(dice_tab_helper->IsChromeSigninPage()); + simulator->Commit(); + EXPECT_FALSE(dice_tab_helper->IsChromeSigninPage()); + + // Go Back to the signin page + content::NavigationSimulator::GoBack(web_contents()); + // IsChromeSigninPage() returns false after navigating away from the + // signin page. + EXPECT_FALSE(dice_tab_helper->IsChromeSigninPage()); + + // Navigate away from the signin page + content::NavigationSimulator::GoForward(web_contents()); + EXPECT_FALSE(dice_tab_helper->IsChromeSigninPage()); +} + +// Tests DiceTabHelper metrics. +TEST_F(DiceTabHelperTest, Metrics) { + base::UserActionTester ua_tester; + base::HistogramTester h_tester; + DiceTabHelper::CreateForWebContents(web_contents()); + DiceTabHelper* dice_tab_helper = + DiceTabHelper::FromWebContents(web_contents()); + + // No metrics are logged when the Dice tab helper is created. + EXPECT_EQ(0, ua_tester.GetActionCount("Signin_Signin_FromStartPage")); + EXPECT_EQ(0, ua_tester.GetActionCount("Signin_SigninPage_Loading")); + EXPECT_EQ(0, ua_tester.GetActionCount("Signin_SigninPage_Shown")); + + // Check metrics logged when the Dice tab helper is initialized. + std::unique_ptr<content::NavigationSimulator> simulator = + content::NavigationSimulator::CreateRendererInitiated(signin_url_, + main_rfh()); + simulator->Start(); + dice_tab_helper->InitializeSigninFlow( + signin_url_, signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS, + signin_metrics::Reason::kSigninPrimaryAccount, + signin_metrics::PromoAction::PROMO_ACTION_NEW_ACCOUNT_NO_EXISTING_ACCOUNT, + GURL::EmptyGURL()); + EXPECT_EQ(1, ua_tester.GetActionCount("Signin_Signin_FromSettings")); + EXPECT_EQ(1, ua_tester.GetActionCount("Signin_SigninPage_Loading")); + EXPECT_EQ(0, ua_tester.GetActionCount("Signin_SigninPage_Shown")); + h_tester.ExpectUniqueSample( + "Signin.SigninStartedAccessPoint", + signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS, 1); + h_tester.ExpectUniqueSample( + "Signin.SigninStartedAccessPoint.NewAccountNoExistingAccount", + signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS, 1); + + // First call to did finish load does logs any Signin_SigninPage_Shown user + // action. + simulator->Commit(); + EXPECT_EQ(1, ua_tester.GetActionCount("Signin_SigninPage_Loading")); + EXPECT_EQ(1, ua_tester.GetActionCount("Signin_SigninPage_Shown")); + + // Second call to did finish load does not log any metrics. + dice_tab_helper->DidFinishLoad(main_rfh(), signin_url_); + EXPECT_EQ(1, ua_tester.GetActionCount("Signin_SigninPage_Loading")); + EXPECT_EQ(1, ua_tester.GetActionCount("Signin_SigninPage_Shown")); + + // Check metrics are logged again when the Dice tab helper is re-initialized. + simulator = content::NavigationSimulator::CreateRendererInitiated(signin_url_, + main_rfh()); + simulator->Start(); + dice_tab_helper->InitializeSigninFlow( + signin_url_, signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS, + signin_metrics::Reason::kSigninPrimaryAccount, + signin_metrics::PromoAction::PROMO_ACTION_WITH_DEFAULT, + GURL::EmptyGURL()); + EXPECT_EQ(2, ua_tester.GetActionCount("Signin_Signin_FromSettings")); + EXPECT_EQ(2, ua_tester.GetActionCount("Signin_SigninPage_Loading")); + h_tester.ExpectUniqueSample( + "Signin.SigninStartedAccessPoint", + signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS, 2); + h_tester.ExpectUniqueSample( + "Signin.SigninStartedAccessPoint.WithDefault", + signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS, 1); +} + +TEST_F(DiceTabHelperTest, IsSyncSigninInProgress) { + DiceTabHelper::CreateForWebContents(web_contents()); + DiceTabHelper* dice_tab_helper = + DiceTabHelper::FromWebContents(web_contents()); + EXPECT_FALSE(dice_tab_helper->IsSyncSigninInProgress()); + + // Non-sync signin. + InitializeDiceTabHelper(dice_tab_helper, + signin_metrics::AccessPoint::ACCESS_POINT_EXTENSIONS, + signin_metrics::Reason::kAddSecondaryAccount); + EXPECT_FALSE(dice_tab_helper->IsSyncSigninInProgress()); + + // Sync signin + InitializeDiceTabHelper(dice_tab_helper, + signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS, + signin_metrics::Reason::kSigninPrimaryAccount); + EXPECT_TRUE(dice_tab_helper->IsSyncSigninInProgress()); + dice_tab_helper->OnSyncSigninFlowComplete(); + EXPECT_FALSE(dice_tab_helper->IsSyncSigninInProgress()); +} + +class DiceTabHelperPrerenderTest : public DiceTabHelperTest { + public: + DiceTabHelperPrerenderTest() { + feature_list_.InitWithFeatures( + {blink::features::kPrerender2}, + // Disable the memory requirement of Prerender2 so the test can run on + // any bot. + {blink::features::kPrerender2MemoryControls}); + } + + ~DiceTabHelperPrerenderTest() override = default; + + private: + base::test::ScopedFeatureList feature_list_; +}; + +TEST_F(DiceTabHelperPrerenderTest, SigninStatusAfterPrerendering) { + base::UserActionTester ua_tester; + DiceTabHelper::CreateForWebContents(web_contents()); + DiceTabHelper* dice_tab_helper = + DiceTabHelper::FromWebContents(web_contents()); + EXPECT_FALSE(dice_tab_helper->IsChromeSigninPage()); + EXPECT_EQ(0, ua_tester.GetActionCount("Signin_SigninPage_Shown")); + + // Sync signin + InitializeDiceTabHelper(dice_tab_helper, + signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS, + signin_metrics::Reason::kSigninPrimaryAccount); + dice_tab_helper->OnSyncSigninFlowComplete(); + EXPECT_TRUE(dice_tab_helper->IsChromeSigninPage()); + EXPECT_EQ(1, ua_tester.GetActionCount("Signin_SigninPage_Shown")); + + // Starting prerendering a page doesn't navigate away from the signin page. + content::WebContentsTester::For(web_contents()) + ->AddPrerenderAndCommitNavigation(signin_url_.Resolve("/foo/test.html")); + EXPECT_TRUE(dice_tab_helper->IsChromeSigninPage()); + EXPECT_EQ(1, ua_tester.GetActionCount("Signin_SigninPage_Shown")); +} |