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

Unified Diff: chrome/browser/subresource_filter/subresource_filter_browsertest.cc

Issue 2581043003: Add page-level aggregation of SubresourceFilter time metrics. (Closed)
Patch Set: Rebase. Make tests work with and without PersistentHistograms. Created 4 years 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
« no previous file with comments | « no previous file | chrome/test/data/subresource_filter/frame_set.html » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/subresource_filter/subresource_filter_browsertest.cc
diff --git a/chrome/browser/subresource_filter/subresource_filter_browsertest.cc b/chrome/browser/subresource_filter/subresource_filter_browsertest.cc
index 4e1cd2e849524152e0418c7b73c74fb33f35e966..23a82fadd9f62fff6e02110ba3742545b72b63d0 100644
--- a/chrome/browser/subresource_filter/subresource_filter_browsertest.cc
+++ b/chrome/browser/subresource_filter/subresource_filter_browsertest.cc
@@ -7,6 +7,7 @@
#include "base/command_line.h"
#include "base/files/file_path.h"
+#include "base/macros.h"
#include "base/path_service.h"
#include "base/strings/string_piece.h"
#include "base/test/histogram_tester.h"
@@ -20,6 +21,8 @@
#include "chrome/test/base/ui_test_utils.h"
#include "components/subresource_filter/core/browser/subresource_filter_features.h"
#include "components/subresource_filter/core/browser/subresource_filter_features_test_support.h"
+#include "components/subresource_filter/core/common/activation_state.h"
+#include "components/subresource_filter/core/common/scoped_timers.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_switches.h"
@@ -30,6 +33,41 @@
namespace {
+// The path to a multi-frame document used for tests.
+static constexpr const char kTestFrameSetPath[] =
+ "subresource_filter/frame_set.html";
+
+// Names of DocumentLoad histograms.
+constexpr const char kDocumentLoadActivationState[] =
+ "SubresourceFilter.DocumentLoad.ActivationState";
+constexpr const char kSubresourceLoadsTotal[] =
+ "SubresourceFilter.DocumentLoad.NumSubresourceLoads.Total";
+constexpr const char kSubresourceLoadsEvaluated[] =
+ "SubresourceFilter.DocumentLoad.NumSubresourceLoads.Evaluated";
+constexpr const char kSubresourceLoadsMatchedRules[] =
+ "SubresourceFilter.DocumentLoad.NumSubresourceLoads.MatchedRules";
+constexpr const char kSubresourceLoadsDisallowed[] =
+ "SubresourceFilter.DocumentLoad.NumSubresourceLoads.Disallowed";
+
+// Names of the performance measurement histograms.
+constexpr const char kActivationWallDuration[] =
+ "SubresourceFilter.DocumentLoad.Activation.WallDuration";
+constexpr const char kActivationCPUDuration[] =
+ "SubresourceFilter.DocumentLoad.Activation.CPUDuration";
+constexpr const char kEvaluationTotalWallDurationForPage[] =
+ "SubresourceFilter.PageLoad.SubresourceEvaluation.TotalWallDuration";
+constexpr const char kEvaluationTotalCPUDurationForPage[] =
+ "SubresourceFilter.PageLoad.SubresourceEvaluation.TotalCPUDuration";
+constexpr const char kEvaluationTotalWallDurationForDocument[] =
+ "SubresourceFilter.DocumentLoad.SubresourceEvaluation.TotalWallDuration";
+constexpr const char kEvaluationTotalCPUDurationForDocument[] =
+ "SubresourceFilter.DocumentLoad.SubresourceEvaluation.TotalCPUDuration";
+constexpr const char kEvaluationWallDuration[] =
+ "SubresourceFilter.SubresourceLoad.Evaluation.WallDuration";
+constexpr const char kEvaluationCPUDuration[] =
+ "SubresourceFilter.SubresourceLoad.Evaluation.CPUDuration";
+
+// Other histograms.
const char kSubresourceFilterPromptHistogram[] =
"SubresourceFilter.Prompt.NumVisibility";
@@ -57,10 +95,12 @@ IN_PROC_BROWSER_TEST_F(SubresourceFilterDisabledBrowserTest,
// SubresourceFilterBrowserTest -----------------------------------------------
-class SubresourceFilterBrowserTest : public InProcessBrowserTest {
+class SubresourceFilterBrowserTestImpl : public InProcessBrowserTest {
public:
- SubresourceFilterBrowserTest() {}
- ~SubresourceFilterBrowserTest() override {}
+ explicit SubresourceFilterBrowserTestImpl(bool measure_performance)
+ : measure_performance_(measure_performance) {}
+
+ ~SubresourceFilterBrowserTestImpl() override {}
protected:
// It would be too late to enable the feature in SetUpOnMainThread(), as it is
@@ -81,7 +121,9 @@ class SubresourceFilterBrowserTest : public InProcessBrowserTest {
void SetUpOnMainThread() override {
scoped_feature_toggle_.reset(new ScopedSubresourceFilterFeatureToggle(
base::FeatureList::OVERRIDE_ENABLE_FEATURE, kActivationStateEnabled,
- kActivationScopeAllSites));
+ kActivationScopeAllSites, std::string(),
+ measure_performance_ ? "1" : "0"));
+
base::FilePath test_data_dir;
PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir);
embedded_test_server()->ServeFilesFromDirectory(test_data_dir);
@@ -138,10 +180,30 @@ class SubresourceFilterBrowserTest : public InProcessBrowserTest {
private:
std::unique_ptr<ScopedSubresourceFilterFeatureToggle> scoped_feature_toggle_;
TestRulesetPublisher test_ruleset_publisher_;
+ bool measure_performance_;
+
+ DISALLOW_COPY_AND_ASSIGN(SubresourceFilterBrowserTestImpl);
+};
- DISALLOW_COPY_AND_ASSIGN(SubresourceFilterBrowserTest);
+class SubresourceFilterBrowserTest : public SubresourceFilterBrowserTestImpl {
+ public:
+ SubresourceFilterBrowserTest() : SubresourceFilterBrowserTestImpl(false) {}
};
+// TODO(pkalinnikov): It should be possible to have only one fixture, i.e.,
+// SubresourceFilterBrowserTest, unsetting |measure_performance| by default, and
+// providing a method to switch it on. However, the current implementation of
+// ScopedSubresourceFilterFeatureToggle in use pollutes the global
+// FieldTrialList in such a way that variation parameters can not be reassigned.
+class SubresourceFilterWithPerformanceMeasurementBrowserTest
+ : public SubresourceFilterBrowserTestImpl {
+ public:
+ SubresourceFilterWithPerformanceMeasurementBrowserTest()
+ : SubresourceFilterBrowserTestImpl(true) {}
+};
+
+// Tests -----------------------------------------------------------------------
+
IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, MainFrameActivation) {
GURL url(GetTestUrl("subresource_filter/frame_with_included_script.html"));
ASSERT_NO_FATAL_FAILURE(SetRulesetToDisallowURLsWithPathSuffix(
@@ -181,18 +243,22 @@ IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest,
}
IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, SubFrameActivation) {
- GURL url(GetTestUrl("subresource_filter/frame_set.html"));
+ GURL url(GetTestUrl(kTestFrameSetPath));
ASSERT_NO_FATAL_FAILURE(
SetRulesetToDisallowURLsWithPathSuffix("included_script.js"));
base::HistogramTester tester;
ui_test_utils::NavigateToURL(browser(), url);
- const char* kSubframeNames[] = {"one", "two"};
- for (const char* subframe_name : kSubframeNames) {
- content::RenderFrameHost* frame = FindFrameByName(subframe_name);
+ const char* kSubframeNames[] = {"one", "two", "three"};
+ const bool kExpectScriptElementToLoad[arraysize(kSubframeNames)] = {
+ false, true, false};
+ for (size_t i = 0; i < arraysize(kSubframeNames); ++i) {
+ content::RenderFrameHost* frame = FindFrameByName(kSubframeNames[i]);
ASSERT_TRUE(frame);
- EXPECT_FALSE(WasParsedScriptElementLoaded(frame));
+ EXPECT_EQ(kExpectScriptElementToLoad[i],
+ WasParsedScriptElementLoaded(frame));
}
+
tester.ExpectBucketCount(kSubresourceFilterPromptHistogram, true, 1);
}
@@ -201,7 +267,7 @@ IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, SubFrameActivation) {
// inserting a subframe afterwards, and still expecting activation.
IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest,
PageLevelActivationOutlivesSamePageNavigation) {
- GURL url(GetTestUrl("subresource_filter/frame_set.html"));
+ GURL url(GetTestUrl(kTestFrameSetPath));
ASSERT_NO_FATAL_FAILURE(
SetRulesetToDisallowURLsWithPathSuffix("included_script.js"));
ui_test_utils::NavigateToURL(browser(), url);
@@ -259,16 +325,89 @@ IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest,
PromptShownAgainOnNextNavigation) {
ASSERT_NO_FATAL_FAILURE(
SetRulesetToDisallowURLsWithPathSuffix("included_script.js"));
- GURL url(GetTestUrl("subresource_filter/frame_set.html"));
+ GURL url(GetTestUrl(kTestFrameSetPath));
base::HistogramTester tester;
ui_test_utils::NavigateToURL(browser(), url);
tester.ExpectBucketCount(kSubresourceFilterPromptHistogram, true, 1);
// Check that the bubble is not shown again for this navigation.
- EXPECT_FALSE(IsDynamicScriptElementLoaded(FindFrameByName("three")));
+ EXPECT_FALSE(IsDynamicScriptElementLoaded(FindFrameByName("five")));
tester.ExpectBucketCount(kSubresourceFilterPromptHistogram, true, 1);
// Check that bubble is shown for new navigation.
ui_test_utils::NavigateToURL(browser(), url);
tester.ExpectBucketCount(kSubresourceFilterPromptHistogram, true, 2);
}
+// Tests checking how histograms are recorded. ---------------------------------
+
+namespace {
+
+void ExpectHistogramsAreRecordedForTestFrameSet(
+ const base::HistogramTester& tester,
+ bool expect_performance_measurements) {
+ const bool time_recorded =
+ expect_performance_measurements && ScopedThreadTimers::IsSupported();
+
+ // The following histograms are generated on the browser side.
+ tester.ExpectTotalCount(kEvaluationTotalWallDurationForPage, time_recorded);
+ tester.ExpectTotalCount(kEvaluationTotalCPUDurationForPage, time_recorded);
+
+ // The rest is produced by renderers, therefore needs to be merged here.
+ content::FetchHistogramsFromChildProcesses();
+ SubprocessMetricsProvider::MergeHistogramDeltasForTesting();
+
+ tester.ExpectTotalCount(kEvaluationTotalWallDurationForDocument,
+ time_recorded ? 6 : 0);
+ tester.ExpectTotalCount(kEvaluationTotalCPUDurationForDocument,
+ time_recorded ? 6 : 0);
+
+ tester.ExpectTotalCount(kEvaluationWallDuration, time_recorded ? 7 : 0);
+ tester.ExpectTotalCount(kEvaluationCPUDuration, time_recorded ? 7 : 0);
+
+ // Activation timing histograms are always recorded.
+ tester.ExpectTotalCount(kActivationWallDuration, 6);
+ tester.ExpectTotalCount(kActivationCPUDuration, 6);
+
+ tester.ExpectUniqueSample(
+ kDocumentLoadActivationState,
+ static_cast<base::Histogram::Sample>(ActivationState::ENABLED), 6);
+
+ EXPECT_THAT(tester.GetAllSamples(kSubresourceLoadsTotal),
+ ::testing::ElementsAre(base::Bucket(0, 3), base::Bucket(2, 3)));
+ EXPECT_THAT(tester.GetAllSamples(kSubresourceLoadsEvaluated),
+ ::testing::ElementsAre(base::Bucket(0, 3), base::Bucket(2, 3)));
+
+ EXPECT_THAT(tester.GetAllSamples(kSubresourceLoadsMatchedRules),
+ ::testing::ElementsAre(base::Bucket(0, 4), base::Bucket(2, 2)));
+ EXPECT_THAT(tester.GetAllSamples(kSubresourceLoadsDisallowed),
+ ::testing::ElementsAre(base::Bucket(0, 4), base::Bucket(2, 2)));
+}
+
+} // namespace
+
+IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest,
+ ExpectHistogramsAreRecorded) {
+ ASSERT_NO_FATAL_FAILURE(
+ SetRulesetToDisallowURLsWithPathSuffix("included_script.js"));
+ const GURL url = GetTestUrl(kTestFrameSetPath);
+
+ base::HistogramTester tester;
+ ui_test_utils::NavigateToURL(browser(), url);
+
+ ExpectHistogramsAreRecordedForTestFrameSet(
+ tester, false /* expect_performance_measurements */);
+}
+
+IN_PROC_BROWSER_TEST_F(SubresourceFilterWithPerformanceMeasurementBrowserTest,
+ ExpectHistogramsAreRecorded) {
+ ASSERT_NO_FATAL_FAILURE(
+ SetRulesetToDisallowURLsWithPathSuffix("included_script.js"));
+ const GURL url = GetTestUrl(kTestFrameSetPath);
+
+ base::HistogramTester tester;
+ ui_test_utils::NavigateToURL(browser(), url);
+
+ ExpectHistogramsAreRecordedForTestFrameSet(
+ tester, true /* expect_performance_measurements */);
+}
+
} // namespace subresource_filter
« no previous file with comments | « no previous file | chrome/test/data/subresource_filter/frame_set.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698