blob: a46ffc968077051ab0ae065c6904799d0fedd5b5 [file] [log] [blame]
// Copyright 2021 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 <memory>
#include "base/base64.h"
#include "base/run_loop.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "build/build_config.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/history/history_test_utils.h"
#include "chrome/browser/history_clusters/history_clusters_metrics_logger.h"
#include "chrome/browser/history_clusters/history_clusters_service_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_navigator.h"
#include "chrome/browser/ui/webui/history/history_ui.h"
#include "chrome/browser/ui/webui/history_clusters/history_clusters.mojom.h"
#include "chrome/browser/ui/webui/history_clusters/history_clusters_handler.h"
#include "chrome/common/webui_url_constants.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/history_clusters/core/features.h"
#include "components/ukm/test_ukm_recorder.h"
#include "components/variations/active_field_trials.h"
#include "content/public/browser/navigation_handle.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "services/metrics/public/cpp/ukm_builders.h"
#include "services/metrics/public/cpp/ukm_source.h"
namespace history_clusters {
namespace {
void ValidateHistoryClustersUKMEntry(const ukm::mojom::UkmEntry* entry,
HistoryClustersInitialState init_state,
HistoryClustersFinalState final_state,
int num_queries,
int num_toggles_to_basic_history) {
ukm::TestAutoSetUkmRecorder ukm_recorder;
EXPECT_TRUE(ukm_recorder.EntryHasMetric(
entry, ukm::builders::HistoryClusters::kInitialStateName));
ukm_recorder.ExpectEntryMetric(
entry, ukm::builders::HistoryClusters::kInitialStateName,
static_cast<int>(init_state));
EXPECT_TRUE(ukm_recorder.EntryHasMetric(
entry, ukm::builders::HistoryClusters::kFinalStateName));
ukm_recorder.ExpectEntryMetric(
entry, ukm::builders::HistoryClusters::kFinalStateName,
static_cast<int>(final_state));
EXPECT_TRUE(ukm_recorder.EntryHasMetric(
entry, ukm::builders::HistoryClusters::kNumQueriesName));
ukm_recorder.ExpectEntryMetric(
entry, ukm::builders::HistoryClusters::kNumQueriesName, num_queries);
EXPECT_TRUE(ukm_recorder.EntryHasMetric(
entry, ukm::builders::HistoryClusters::kNumTogglesToBasicHistoryName));
ukm_recorder.ExpectEntryMetric(
entry, ukm::builders::HistoryClusters::kNumTogglesToBasicHistoryName,
num_toggles_to_basic_history);
}
} // namespace
class HistoryClustersMetricsBrowserTest : public InProcessBrowserTest {
public:
HistoryClustersMetricsBrowserTest() {
feature_list_.InitWithFeatures({history_clusters::internal::kJourneys}, {});
}
private:
base::test::ScopedFeatureList feature_list_;
};
IN_PROC_BROWSER_TEST_F(HistoryClustersMetricsBrowserTest,
NoUKMEventOnOtherPages) {
ukm::TestAutoSetUkmRecorder ukm_recorder;
EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("https://foo.com")));
auto entries =
ukm_recorder.GetEntriesByName(ukm::builders::HistoryClusters::kEntryName);
EXPECT_EQ(0u, entries.size());
}
// Flaky on Win and Linux. http://crbug.com/1282122
#if defined(OS_WIN) || defined(OS_LINUX)
#define MAYBE_DirectNavigationNoInteraction \
DISABLED_DirectNavigationNoInteraction
#else
#define MAYBE_DirectNavigationNoInteraction DirectNavigationNoInteraction
#endif
IN_PROC_BROWSER_TEST_F(HistoryClustersMetricsBrowserTest,
MAYBE_DirectNavigationNoInteraction) {
base::HistogramTester histogram_tester;
ukm::TestAutoSetUkmRecorder ukm_recorder;
EXPECT_TRUE(ui_test_utils::NavigateToURL(
browser(), GURL(chrome::kChromeUIHistoryClustersURL)));
EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("https://foo.com")));
auto entries =
ukm_recorder.GetEntriesByName(ukm::builders::HistoryClusters::kEntryName);
EXPECT_EQ(1u, entries.size());
auto* entry = entries[0];
ValidateHistoryClustersUKMEntry(
entry, HistoryClustersInitialState::kDirectNavigation,
HistoryClustersFinalState::kCloseTab, 0, 0);
histogram_tester.ExpectUniqueSample(
"History.Clusters.Actions.InitialState",
HistoryClustersInitialState::kDirectNavigation, 1);
histogram_tester.ExpectUniqueSample("History.Clusters.Actions.FinalState",
HistoryClustersFinalState::kCloseTab, 1);
histogram_tester.ExpectUniqueSample("History.Clusters.Actions.DidMakeQuery",
false, 1);
histogram_tester.ExpectTotalCount("History.Clusters.Actions.NumQueries", 0);
}
// TODO(crbug.com/1282087): Flaky on Linux and Windows.
#if defined(OS_LINUX) || defined(OS_WIN)
#define MAYBE_DirectNavigationWithQuery DISABLED_DirectNavigationWithQuery
#else
#define MAYBE_DirectNavigationWithQuery DirectNavigationWithQuery
#endif
IN_PROC_BROWSER_TEST_F(HistoryClustersMetricsBrowserTest,
MAYBE_DirectNavigationWithQuery) {
base::HistogramTester histogram_tester;
ukm::TestAutoSetUkmRecorder ukm_recorder;
EXPECT_TRUE(ui_test_utils::NavigateToURL(
browser(), GURL(chrome::kChromeUIHistoryClustersURL)));
EXPECT_TRUE(content::WaitForLoadStop(
browser()->tab_strip_model()->GetActiveWebContents()));
history_clusters::HistoryClustersHandler* page_handler =
browser()
->tab_strip_model()
->GetActiveWebContents()
->GetWebUI()
->GetController()
->template GetAs<HistoryUI>()
->GetHistoryClustersHandlerForTesting();
auto query_params = history_clusters::mojom::QueryParams::New();
query_params->query = "cat";
page_handler->QueryClusters(std::move(query_params));
query_params = history_clusters::mojom::QueryParams::New();
query_params->query = "dog";
page_handler->QueryClusters(std::move(query_params));
EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("https://foo.com")));
auto entries =
ukm_recorder.GetEntriesByName(ukm::builders::HistoryClusters::kEntryName);
EXPECT_EQ(1u, entries.size());
auto* entry = entries[0];
ValidateHistoryClustersUKMEntry(
entry, HistoryClustersInitialState::kDirectNavigation,
HistoryClustersFinalState::kCloseTab, 2, 0);
histogram_tester.ExpectUniqueSample(
"History.Clusters.Actions.InitialState",
HistoryClustersInitialState::kDirectNavigation, 1);
histogram_tester.ExpectUniqueSample("History.Clusters.Actions.FinalState",
HistoryClustersFinalState::kCloseTab, 1);
histogram_tester.ExpectUniqueSample("History.Clusters.Actions.DidMakeQuery",
true, 1);
histogram_tester.ExpectUniqueSample("History.Clusters.Actions.NumQueries", 2,
1);
}
// Disabled on Windows, ChromeOS, and Linux due to flakes: crbug.com/1263465.
#if defined(OS_CHROMEOS) || defined(OS_WIN) || defined(OS_LINUX)
#define MAYBE_DirectNavigationWithToggleToBasic \
DISABLED_DirectNavigationWithToggleToBasic
#else
#define MAYBE_DirectNavigationWithToggleToBasic \
DirectNavigationWithToggleToBasic
#endif
IN_PROC_BROWSER_TEST_F(HistoryClustersMetricsBrowserTest,
MAYBE_DirectNavigationWithToggleToBasic) {
base::HistogramTester histogram_tester;
ukm::TestAutoSetUkmRecorder ukm_recorder;
EXPECT_TRUE(ui_test_utils::NavigateToURL(
browser(), GURL(chrome::kChromeUIHistoryClustersURL)));
bool toggled_to_basic = false;
EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
browser()->tab_strip_model()->GetActiveWebContents(), R"(
const polymerPath =
'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import(polymerPath).then((polymerModule)=> {
polymerModule.flush();
const historyApp = document.querySelector('#history-app');
historyApp.shadowRoot.querySelector('cr-tabs').selected = 0;
window.domAutomationController.send(true);
});)",
&toggled_to_basic));
EXPECT_TRUE(toggled_to_basic);
EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("https://foo.com")));
auto entries =
ukm_recorder.GetEntriesByName(ukm::builders::HistoryClusters::kEntryName);
EXPECT_EQ(1u, entries.size());
auto* ukm_entry = entries[0];
ValidateHistoryClustersUKMEntry(
ukm_entry, HistoryClustersInitialState::kDirectNavigation,
HistoryClustersFinalState::kCloseTab, 0, 1);
histogram_tester.ExpectUniqueSample(
"History.Clusters.Actions.InitialState",
HistoryClustersInitialState::kDirectNavigation, 1);
histogram_tester.ExpectUniqueSample("History.Clusters.Actions.FinalState",
HistoryClustersFinalState::kCloseTab, 1);
histogram_tester.ExpectUniqueSample("History.Clusters.Actions.DidMakeQuery",
false, 1);
histogram_tester.ExpectTotalCount("History.Clusters.Actions.NumQueries", 0);
}
// TODO(manukh): Adjust the expectations for the navigation tests.
IN_PROC_BROWSER_TEST_F(HistoryClustersMetricsBrowserTest,
DISABLED_IndirectNavigation) {
base::HistogramTester histogram_tester;
ukm::TestAutoSetUkmRecorder ukm_recorder;
EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(),
GURL(chrome::kChromeUIHistoryURL)));
EXPECT_TRUE(content::ExecJs(
browser()->tab_strip_model()->GetActiveWebContents(),
"document.querySelector('#history-app').shadowRoot.querySelector('#"
"content-side-bar').shadowRoot.querySelector('#historyClusters').click()",
content::EXECUTE_SCRIPT_DEFAULT_OPTIONS, 1 /* world_id */));
EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("https://foo.com")));
auto entries =
ukm_recorder.GetEntriesByName(ukm::builders::HistoryClusters::kEntryName);
EXPECT_EQ(1u, entries.size());
auto* ukm_entry = entries[0];
ValidateHistoryClustersUKMEntry(
ukm_entry, HistoryClustersInitialState::kIndirectNavigation,
HistoryClustersFinalState::kCloseTab, 0, 0);
histogram_tester.ExpectUniqueSample(
"History.Clusters.Actions.InitialState",
HistoryClustersInitialState::kIndirectNavigation, 1);
histogram_tester.ExpectUniqueSample("History.Clusters.Actions.FinalState",
HistoryClustersFinalState::kCloseTab, 1);
histogram_tester.ExpectUniqueSample("History.Clusters.Actions.DidMakeQuery",
false, 1);
histogram_tester.ExpectTotalCount("History.Clusters.Actions.NumQueries", 0);
}
} // namespace history_clusters