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

Unified Diff: third_party/WebKit/Source/core/origin_trials/OriginTrialContextTest.cpp

Issue 1909633003: Collect UMA data for Origin Trials (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix/update unit tests Created 4 years, 8 months 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
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)

Powered by Google App Engine
This is Rietveld 408576698