blob: b7060c97cbe70e34b5ddf39cab5f0fe851659b83 [file] [log] [blame]
// 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/core/browser/signin_metrics.h"
#include "content/public/test/navigation_simulator.h"
#include "content/public/test/test_renderer_host.h"
#include "google_apis/gaia/gaia_urls.h"
#include "testing/gtest/include/gtest/gtest.h"
class DiceTabHelperTest : public ChromeRenderViewHostTestHarness {
public:
DiceTabHelperTest() {
signin_url_ = GaiaUrls::GetInstance()->signin_chrome_sync_dice();
}
// 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_;
};
// 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::REASON_UNKNOWN_REASON,
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::REASON_SIGNIN_PRIMARY_ACCOUNT;
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) {
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::REASON_SIGNIN_PRIMARY_ACCOUNT;
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());
}
// 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::REASON_SIGNIN_PRIMARY_ACCOUNT,
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::REASON_SIGNIN_PRIMARY_ACCOUNT,
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);
}