Chromium Code Reviews| Index: third_party/WebKit/Source/core/origin_trials/OriginTrialContextTest.cpp |
| diff --git a/third_party/WebKit/Source/core/origin_trials/OriginTrialContextTest.cpp b/third_party/WebKit/Source/core/origin_trials/OriginTrialContextTest.cpp |
| index 57c38183691ad9edfaac762335fedba387ec5b96..14cbddc0b18c83830b449be4c9e68c8c18bebba7 100644 |
| --- a/third_party/WebKit/Source/core/origin_trials/OriginTrialContextTest.cpp |
| +++ b/third_party/WebKit/Source/core/origin_trials/OriginTrialContextTest.cpp |
| @@ -12,8 +12,10 @@ |
| #include "core/html/HTMLMetaElement.h" |
| #include "core/testing/DummyPageHolder.h" |
| #include "core/testing/NullExecutionContext.h" |
| +#include "platform/testing/HistogramTester.h" |
| #include "platform/weborigin/KURL.h" |
| #include "platform/weborigin/SecurityOrigin.h" |
| +#include "public/platform/WebOriginTrialTokenStatus.h" |
| #include "public/platform/WebTrialTokenValidator.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "wtf/Vector.h" |
| @@ -26,42 +28,45 @@ const char kFrobulateFeatureName[] = "Frobulate"; |
| const char kFrobulateEnabledOrigin[] = "https://www.example.com"; |
| const char kFrobulateEnabledOriginUnsecure[] = "http://www.example.com"; |
| +// Names of UMA histograms |
| +const char kEnabledHistogram[] = "OriginTrials.FeatureEnabled"; |
| +const char kMessageHistogram[] = "OriginTrials.FeatureEnabled.MessageGenerated"; |
| + |
| +// Values for message generated histogram |
| +const int kMessageHistogramValueNotRequested = 0; |
| +const int kMessageHistogramValueYes = 1; |
| + |
| // Trial token which will appear valid |
| const char kGoodToken[] = "AnySignatureWillDo|https://www.example.com|Frobulate|2000000000"; |
|
iclelland
2016/04/28 17:00:58
We clearly don't actually do any parsing of this s
chasej
2016/05/02 15:53:11
Done. I've renamed the constant, and simplified th
|
| class MockTokenValidator : public WebTrialTokenValidator { |
| public: |
| MockTokenValidator() |
| - : m_response(false) |
| + : m_response(WebOriginTrialTokenStatus::NotSupported) |
| , m_callCount(0) |
| { |
| } |
| ~MockTokenValidator() override {} |
| // blink::WebTrialTokenValidator implementation |
| - bool validateToken(const blink::WebString& token, const blink::WebSecurityOrigin& origin, const blink::WebString& featureName) override |
| + WebOriginTrialTokenStatus validateToken(const blink::WebString& token, const blink::WebSecurityOrigin& origin, const blink::WebString& featureName) override |
| { |
| m_callCount++; |
| return m_response; |
| } |
| // Useful methods for controlling the validator |
| - void setResponse(bool response) |
| + void setResponse(WebOriginTrialTokenStatus response) |
| { |
| m_response = response; |
| } |
| - void reset() |
| - { |
| - m_response = false; |
| - m_callCount = 0; |
| - } |
| int callCount() |
| { |
| return m_callCount; |
| } |
| private: |
| - bool m_response; |
| + WebOriginTrialTokenStatus m_response; |
| int m_callCount; |
| DISALLOW_COPY_AND_ASSIGN(MockTokenValidator); |
| @@ -76,6 +81,7 @@ protected: |
| , m_executionContext(new NullExecutionContext()) |
| , m_tokenValidator(adoptPtr(new MockTokenValidator())) |
| , m_originTrialContext(new OriginTrialContext(m_executionContext.get())) |
| + , m_histogramTester(new HistogramTester()) |
| { |
| RuntimeEnabledFeatures::setExperimentalFrameworkEnabled(true); |
| } |
| @@ -107,16 +113,40 @@ protected: |
| return isFeatureEnabled(origin, featureName, token, nullptr); |
| } |
| + void expectEnabledUniqueMetric(WebOriginTrialTokenStatus status, int count) |
| + { |
| + m_histogramTester->expectUniqueSample( |
| + kEnabledHistogram, static_cast<int>(status), count); |
| + } |
| + |
| + void expectEnabledTotalMetric(int total) |
| + { |
| + m_histogramTester->expectTotalCount(kEnabledHistogram, total); |
| + } |
| + |
| + void expectMessageUniqueMetric(int messageGeneratedValue, int count) |
| + { |
| + m_histogramTester->expectUniqueSample( |
| + kMessageHistogram, messageGeneratedValue, count); |
| + } |
| + |
| + void expectMessageTotalMetric(int total) |
| + { |
| + m_histogramTester->expectTotalCount(kMessageHistogram, total); |
| + } |
| + |
| private: |
| const bool m_frameworkWasEnabled; |
| Persistent<NullExecutionContext> m_executionContext; |
| OwnPtr<MockTokenValidator> m_tokenValidator; |
| Persistent<OriginTrialContext> m_originTrialContext; |
| + std::unique_ptr<HistogramTester> m_histogramTester; |
| }; |
| TEST_F(OriginTrialContextTest, EnabledNonExistingFeature) |
| { |
| String errorMessage; |
| + tokenValidator()->setResponse(WebOriginTrialTokenStatus::WrongFeature); |
| bool isNonExistingFeatureEnabled = isFeatureEnabled(kFrobulateEnabledOrigin, |
| kNonExistingFeatureName, |
| kGoodToken, |
| @@ -138,7 +168,7 @@ TEST_F(OriginTrialContextTest, EnabledNonExistingFeatureWithoutErrorMessage) |
| TEST_F(OriginTrialContextTest, EnabledSecureRegisteredOrigin) |
| { |
| String errorMessage; |
| - tokenValidator()->setResponse(true); |
| + tokenValidator()->setResponse(WebOriginTrialTokenStatus::Success); |
| bool isOriginEnabled = isFeatureEnabled(kFrobulateEnabledOrigin, |
| kFrobulateFeatureName, |
| kGoodToken, |
| @@ -146,6 +176,11 @@ TEST_F(OriginTrialContextTest, EnabledSecureRegisteredOrigin) |
| EXPECT_TRUE(isOriginEnabled); |
| EXPECT_TRUE(errorMessage.isEmpty()) << "Message should be empty, was: " << errorMessage; |
| EXPECT_EQ(1, tokenValidator()->callCount()); |
| + |
| + // Enabled metric should be updated, but the message generated metric |
| + // should not be updated on success. |
| + expectEnabledUniqueMetric(WebOriginTrialTokenStatus::Success, 1); |
| + expectMessageTotalMetric(0); |
| } |
| // ... but if the browser says it's invalid for any reason, that's enough to |
| @@ -153,7 +188,7 @@ TEST_F(OriginTrialContextTest, EnabledSecureRegisteredOrigin) |
| TEST_F(OriginTrialContextTest, InvalidTokenResponseFromPlatform) |
| { |
| String errorMessage; |
| - tokenValidator()->setResponse(false); |
| + tokenValidator()->setResponse(WebOriginTrialTokenStatus::Malformed); |
| bool isOriginEnabled = isFeatureEnabled(kFrobulateEnabledOrigin, |
| kFrobulateFeatureName, |
| kGoodToken, |
| @@ -161,23 +196,38 @@ TEST_F(OriginTrialContextTest, InvalidTokenResponseFromPlatform) |
| EXPECT_FALSE(isOriginEnabled); |
| EXPECT_EQ(("The provided token(s) are not valid for the 'Frobulate' feature."), errorMessage); |
| EXPECT_EQ(1, tokenValidator()->callCount()); |
| + |
| + // Enabled and message generated metrics should be updated |
| + expectEnabledUniqueMetric(WebOriginTrialTokenStatus::Malformed, 1); |
| + expectMessageUniqueMetric(kMessageHistogramValueYes, 1); |
| } |
| TEST_F(OriginTrialContextTest, OnlyOneErrorMessageGenerated) |
| { |
| String errorMessage1; |
| String errorMessage2; |
| - tokenValidator()->setResponse(false); |
| + tokenValidator()->setResponse(WebOriginTrialTokenStatus::NotSupported); |
| isFeatureEnabled(kFrobulateEnabledOrigin, kFrobulateFeatureName, kGoodToken, &errorMessage1); |
| + |
| + // After the first call, should be one sample recorded for both the enabled |
| + // and message generated metrics |
| + expectMessageUniqueMetric(kMessageHistogramValueYes, 1); |
| + expectEnabledUniqueMetric(WebOriginTrialTokenStatus::NotSupported, 1); |
| + |
| isFeatureEnabled(kFrobulateEnabledOrigin, kFrobulateFeatureName, kGoodToken, &errorMessage2); |
| EXPECT_FALSE(errorMessage1.isEmpty()); |
| EXPECT_TRUE(errorMessage2.isEmpty()); |
| + |
| + // Should only be one sample recorded for the enabled metric, but two |
| + // samples for message generation. |
| + expectEnabledTotalMetric(1); |
| + expectMessageTotalMetric(2); |
| } |
| TEST_F(OriginTrialContextTest, ErrorMessageClearedIfStringReused) |
| { |
| String errorMessage; |
| - tokenValidator()->setResponse(false); |
| + tokenValidator()->setResponse(WebOriginTrialTokenStatus::NotSupported); |
| isFeatureEnabled(kFrobulateEnabledOrigin, kFrobulateFeatureName, kGoodToken, &errorMessage); |
| EXPECT_FALSE(errorMessage.isEmpty()); |
| isFeatureEnabled(kFrobulateEnabledOrigin, kFrobulateFeatureName, kGoodToken, &errorMessage); |
| @@ -188,16 +238,21 @@ TEST_F(OriginTrialContextTest, ErrorMessageGeneratedPerFeature) |
| { |
| String errorMessage1; |
| String errorMessage2; |
| - tokenValidator()->setResponse(false); |
| + tokenValidator()->setResponse(WebOriginTrialTokenStatus::NotSupported); |
| isFeatureEnabled(kFrobulateEnabledOrigin, kFrobulateFeatureName, kGoodToken, &errorMessage1); |
| isFeatureEnabled(kFrobulateEnabledOrigin, kNonExistingFeatureName, kGoodToken, &errorMessage2); |
| EXPECT_FALSE(errorMessage1.isEmpty()); |
| EXPECT_FALSE(errorMessage2.isEmpty()); |
| + |
| + // Enabled and message generated metrics should have same number of samples |
| + // as different features used for each call. |
| + expectEnabledUniqueMetric(WebOriginTrialTokenStatus::NotSupported, 2); |
| + expectMessageUniqueMetric(kMessageHistogramValueYes, 2); |
| } |
| TEST_F(OriginTrialContextTest, EnabledSecureRegisteredOriginWithoutErrorMessage) |
| { |
| - tokenValidator()->setResponse(true); |
| + tokenValidator()->setResponse(WebOriginTrialTokenStatus::Success); |
| bool isOriginEnabled = isFeatureEnabledWithoutErrorMessage( |
| kFrobulateEnabledOrigin, |
| kFrobulateFeatureName, |
| @@ -218,6 +273,7 @@ TEST_F(OriginTrialContextTest, EnabledNonSecureRegisteredOrigin) |
| EXPECT_FALSE(isOriginEnabled); |
| EXPECT_EQ(0, tokenValidator()->callCount()); |
| EXPECT_FALSE(errorMessage.isEmpty()); |
| + expectEnabledUniqueMetric(WebOriginTrialTokenStatus::Insecure, 1); |
| } |
| TEST_F(OriginTrialContextTest, EnabledNonSecureRegisteredOriginWithoutErrorMessage) |
| @@ -228,6 +284,7 @@ TEST_F(OriginTrialContextTest, EnabledNonSecureRegisteredOriginWithoutErrorMessa |
| kGoodToken); |
| EXPECT_FALSE(isOriginEnabled); |
| EXPECT_EQ(0, tokenValidator()->callCount()); |
| + expectMessageUniqueMetric(kMessageHistogramValueNotRequested, 1); |
| } |
| TEST_F(OriginTrialContextTest, ParseHeaderValue) |