Index: third_party/WebKit/Source/core/frame/UseCounterTest.cpp |
diff --git a/third_party/WebKit/Source/core/frame/UseCounterTest.cpp b/third_party/WebKit/Source/core/frame/UseCounterTest.cpp |
index a982bf4eec6f286f965f353aef137dca11511f4e..041d24b5f59eaf7e99e3c227b9e8fe21554ebdf5 100644 |
--- a/third_party/WebKit/Source/core/frame/UseCounterTest.cpp |
+++ b/third_party/WebKit/Source/core/frame/UseCounterTest.cpp |
@@ -6,81 +6,172 @@ |
#include "core/frame/FrameHost.h" |
#include "core/frame/UseCounter.h" |
#include "core/testing/DummyPageHolder.h" |
+#include "platform/testing/HistogramTester.h" |
#include "testing/gtest/include/gtest/gtest.h" |
-namespace blink { |
- |
-class UseCounterTest : public ::testing::Test { |
-protected: |
- bool hasRecordedMeasurement(const UseCounter& useCounter, UseCounter::Feature feature) |
- { |
- return useCounter.hasRecordedMeasurement(feature); |
- } |
+namespace { |
+// Note that the new histogram names will change once the semantics stabilize; |
+const char* const kFeaturesHistogramName = "WebCore.UseCounter_TEST.Features"; |
+const char* const kCSSHistogramName = "WebCore.UseCounter_TEST.CSSProperties"; |
+const char* const kLegacyFeaturesHistogramName = "WebCore.FeatureObserver"; |
+const char* const kLegacyCSSHistogramName = "WebCore.FeatureObserver.CSSProperties"; |
+} |
- void recordMeasurement(UseCounter& useCounter, UseCounter::Feature feature) |
- { |
- useCounter.recordMeasurement(feature); |
- } |
-}; |
+namespace blink { |
-TEST_F(UseCounterTest, RecordingMeasurements) |
+TEST(UseCounterTest, RecordingFeatures) |
{ |
UseCounter useCounter; |
- for (unsigned feature = 0; feature < UseCounter::NumberOfFeatures; feature++) { |
- if (feature != UseCounter::Feature::PageDestruction) { |
- EXPECT_FALSE(hasRecordedMeasurement(useCounter, static_cast<UseCounter::Feature>(feature))); |
- recordMeasurement(useCounter, static_cast<UseCounter::Feature>(feature)); |
- EXPECT_TRUE(hasRecordedMeasurement(useCounter, static_cast<UseCounter::Feature>(feature))); |
- } |
- } |
+ HistogramTester histogramTester; |
+ |
+ // Test recording a single (arbitrary) counter |
+ EXPECT_FALSE(useCounter.hasRecordedMeasurement(UseCounter::Fetch)); |
+ useCounter.recordMeasurement(UseCounter::Fetch); |
+ EXPECT_TRUE(useCounter.hasRecordedMeasurement(UseCounter::Fetch)); |
+ histogramTester.expectUniqueSample(kFeaturesHistogramName, UseCounter::Fetch, 1); |
+ histogramTester.expectTotalCount(kLegacyFeaturesHistogramName, 0); |
+ |
+ // Test that repeated measurements have no effect |
+ useCounter.recordMeasurement(UseCounter::Fetch); |
+ histogramTester.expectUniqueSample(kFeaturesHistogramName, UseCounter::Fetch, 1); |
+ histogramTester.expectTotalCount(kLegacyFeaturesHistogramName, 0); |
+ |
+ // Test recording a different sample |
+ EXPECT_FALSE(useCounter.hasRecordedMeasurement(UseCounter::FetchBodyStream)); |
+ useCounter.recordMeasurement(UseCounter::FetchBodyStream); |
+ EXPECT_TRUE(useCounter.hasRecordedMeasurement(UseCounter::FetchBodyStream)); |
+ histogramTester.expectBucketCount(kFeaturesHistogramName, UseCounter::Fetch, 1); |
+ histogramTester.expectBucketCount(kFeaturesHistogramName, UseCounter::FetchBodyStream, 1); |
+ histogramTester.expectTotalCount(kFeaturesHistogramName, 2); |
+ histogramTester.expectTotalCount(kLegacyFeaturesHistogramName, 0); |
+ |
+ // Test the impact of page load on the new histogram |
+ useCounter.didCommitLoad(); |
+ histogramTester.expectBucketCount(kFeaturesHistogramName, UseCounter::Fetch, 1); |
+ histogramTester.expectBucketCount(kFeaturesHistogramName, UseCounter::FetchBodyStream, 1); |
+ histogramTester.expectBucketCount(kFeaturesHistogramName, UseCounter::PageVisits, 1); |
+ histogramTester.expectTotalCount(kFeaturesHistogramName, 3); |
+ |
+ // And verify the legacy histogram now looks the same |
+ histogramTester.expectBucketCount(kLegacyFeaturesHistogramName, UseCounter::Fetch, 1); |
+ histogramTester.expectBucketCount(kLegacyFeaturesHistogramName, UseCounter::FetchBodyStream, 1); |
+ histogramTester.expectBucketCount(kLegacyFeaturesHistogramName, UseCounter::PageVisits, 1); |
+ histogramTester.expectTotalCount(kLegacyFeaturesHistogramName, 3); |
+ |
+ // Now a repeat measurement should get recorded again, exactly once |
+ EXPECT_FALSE(useCounter.hasRecordedMeasurement(UseCounter::Fetch)); |
+ useCounter.recordMeasurement(UseCounter::Fetch); |
+ useCounter.recordMeasurement(UseCounter::Fetch); |
+ EXPECT_TRUE(useCounter.hasRecordedMeasurement(UseCounter::Fetch)); |
+ histogramTester.expectBucketCount(kFeaturesHistogramName, UseCounter::Fetch, 2); |
+ histogramTester.expectTotalCount(kFeaturesHistogramName, 4); |
+ |
+ // And on the next page load, the legacy histogram will again be updated |
+ useCounter.didCommitLoad(); |
+ histogramTester.expectBucketCount(kLegacyFeaturesHistogramName, UseCounter::Fetch, 2); |
+ histogramTester.expectBucketCount(kLegacyFeaturesHistogramName, UseCounter::FetchBodyStream, 1); |
+ histogramTester.expectBucketCount(kLegacyFeaturesHistogramName, UseCounter::PageVisits, 2); |
+ histogramTester.expectTotalCount(kLegacyFeaturesHistogramName, 5); |
} |
-TEST_F(UseCounterTest, MultipleMeasurements) |
+TEST(UseCounterTest, RecordingCSSProperties) |
{ |
UseCounter useCounter; |
- for (unsigned feature = 0; feature < UseCounter::NumberOfFeatures; feature++) { |
- if (feature != UseCounter::Feature::PageDestruction) { |
- recordMeasurement(useCounter, static_cast<UseCounter::Feature>(feature)); |
- recordMeasurement(useCounter, static_cast<UseCounter::Feature>(feature)); |
- EXPECT_TRUE(hasRecordedMeasurement(useCounter, static_cast<UseCounter::Feature>(feature))); |
- } |
- } |
+ HistogramTester histogramTester; |
+ |
+ // Test recording a single (arbitrary) property |
+ EXPECT_FALSE(useCounter.isCounted(CSSPropertyFont)); |
+ useCounter.count(HTMLStandardMode, CSSPropertyFont); |
+ EXPECT_TRUE(useCounter.isCounted(CSSPropertyFont)); |
+ histogramTester.expectUniqueSample(kCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyFont), 1); |
+ histogramTester.expectTotalCount(kLegacyCSSHistogramName, 0); |
+ |
+ // Test that repeated measurements have no effect |
+ useCounter.count(HTMLStandardMode, CSSPropertyFont); |
+ histogramTester.expectUniqueSample(kCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyFont), 1); |
+ histogramTester.expectTotalCount(kLegacyCSSHistogramName, 0); |
+ |
+ // Test recording a different sample |
+ EXPECT_FALSE(useCounter.isCounted(CSSPropertyZoom)); |
+ useCounter.count(HTMLStandardMode, CSSPropertyZoom); |
+ EXPECT_TRUE(useCounter.isCounted(CSSPropertyZoom)); |
+ histogramTester.expectBucketCount(kCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyFont), 1); |
+ histogramTester.expectBucketCount(kCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyZoom), 1); |
+ histogramTester.expectTotalCount(kCSSHistogramName, 2); |
+ histogramTester.expectTotalCount(kLegacyCSSHistogramName, 0); |
+ |
+ // Test the impact of page load on the new histogram |
+ useCounter.didCommitLoad(); |
+ histogramTester.expectBucketCount(kCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyFont), 1); |
+ histogramTester.expectBucketCount(kCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyZoom), 1); |
+ histogramTester.expectBucketCount(kCSSHistogramName, 1, 1); |
+ histogramTester.expectTotalCount(kCSSHistogramName, 3); |
+ |
+ // And verify the legacy histogram now looks the same |
+ histogramTester.expectBucketCount(kLegacyCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyFont), 1); |
+ histogramTester.expectBucketCount(kLegacyCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyZoom), 1); |
+ histogramTester.expectBucketCount(kLegacyCSSHistogramName, 1, 1); |
+ histogramTester.expectTotalCount(kLegacyCSSHistogramName, 3); |
+ |
+ // Now a repeat measurement should get recorded again, exactly once |
+ EXPECT_FALSE(useCounter.isCounted(CSSPropertyFont)); |
+ useCounter.count(HTMLStandardMode, CSSPropertyFont); |
+ useCounter.count(HTMLStandardMode, CSSPropertyFont); |
+ EXPECT_TRUE(useCounter.isCounted(CSSPropertyFont)); |
+ histogramTester.expectBucketCount(kCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyFont), 2); |
+ histogramTester.expectTotalCount(kCSSHistogramName, 4); |
+ |
+ // And on the next page load, the legacy histogram will again be updated |
+ useCounter.didCommitLoad(); |
+ histogramTester.expectBucketCount(kLegacyCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyFont), 2); |
+ histogramTester.expectBucketCount(kLegacyCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyZoom), 1); |
+ histogramTester.expectBucketCount(kLegacyCSSHistogramName, 1, 2); |
+ histogramTester.expectTotalCount(kLegacyCSSHistogramName, 5); |
} |
-TEST_F(UseCounterTest, InspectorDisablesMeasurement) |
+TEST(UseCounterTest, InspectorDisablesMeasurement) |
{ |
UseCounter useCounter; |
+ HistogramTester histogramTester; |
// The specific feature we use here isn't important. |
UseCounter::Feature feature = UseCounter::Feature::SVGSMILElementInDocument; |
CSSPropertyID property = CSSPropertyFontWeight; |
CSSParserMode parserMode = HTMLStandardMode; |
- EXPECT_FALSE(hasRecordedMeasurement(useCounter, feature)); |
+ EXPECT_FALSE(useCounter.hasRecordedMeasurement(feature)); |
useCounter.muteForInspector(); |
- recordMeasurement(useCounter, feature); |
- EXPECT_FALSE(hasRecordedMeasurement(useCounter, feature)); |
+ useCounter.recordMeasurement(feature); |
+ EXPECT_FALSE(useCounter.hasRecordedMeasurement(feature)); |
useCounter.count(parserMode, property); |
EXPECT_FALSE(useCounter.isCounted(property)); |
+ histogramTester.expectTotalCount(kFeaturesHistogramName, 0); |
+ histogramTester.expectTotalCount(kCSSHistogramName, 0); |
useCounter.muteForInspector(); |
- recordMeasurement(useCounter, feature); |
- EXPECT_FALSE(hasRecordedMeasurement(useCounter, feature)); |
+ useCounter.recordMeasurement(feature); |
+ EXPECT_FALSE(useCounter.hasRecordedMeasurement(feature)); |
useCounter.count(parserMode, property); |
EXPECT_FALSE(useCounter.isCounted(property)); |
+ histogramTester.expectTotalCount(kFeaturesHistogramName, 0); |
+ histogramTester.expectTotalCount(kCSSHistogramName, 0); |
useCounter.unmuteForInspector(); |
- recordMeasurement(useCounter, feature); |
- EXPECT_FALSE(hasRecordedMeasurement(useCounter, feature)); |
+ useCounter.recordMeasurement(feature); |
+ EXPECT_FALSE(useCounter.hasRecordedMeasurement(feature)); |
useCounter.count(parserMode, property); |
EXPECT_FALSE(useCounter.isCounted(property)); |
+ histogramTester.expectTotalCount(kFeaturesHistogramName, 0); |
+ histogramTester.expectTotalCount(kCSSHistogramName, 0); |
useCounter.unmuteForInspector(); |
- recordMeasurement(useCounter, feature); |
- EXPECT_TRUE(hasRecordedMeasurement(useCounter, feature)); |
+ useCounter.recordMeasurement(feature); |
+ EXPECT_TRUE(useCounter.hasRecordedMeasurement(feature)); |
useCounter.count(parserMode, property); |
EXPECT_TRUE(useCounter.isCounted(property)); |
+ histogramTester.expectUniqueSample(kFeaturesHistogramName, feature, 1); |
+ histogramTester.expectUniqueSample(kCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(property), 1); |
} |
class DeprecationTest : public ::testing::Test { |