summaryrefslogtreecommitdiffstats
path: root/chrome/browser/metrics
diff options
context:
space:
mode:
authorskanuj@chromium.org <skanuj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-13 18:23:09 +0000
committerskanuj@chromium.org <skanuj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-13 18:23:09 +0000
commit1bd918d2e2fd61863263c2292b4d618822275768 (patch)
tree723e632bbce6104fbae8a583dc4b455663ee298d /chrome/browser/metrics
parent1c7f3cbeef16d11cd2586e29001809be9ab41e0b (diff)
downloadchromium_src-1bd918d2e2fd61863263c2292b4d618822275768.zip
chromium_src-1bd918d2e2fd61863263c2292b4d618822275768.tar.gz
chromium_src-1bd918d2e2fd61863263c2292b4d618822275768.tar.bz2
Implement --force-variation-ids
- Adds a new flag --force-variation-ids - Accepts a comma-separated list of numeric experiment ids. - Strictly meant for dev use. - Basic error checking for invalid flags based on StringToInt behavior. BUG=305882 Review URL: https://codereview.chromium.org/26565007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@228406 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/metrics')
-rw-r--r--chrome/browser/metrics/variations/variations_http_header_provider.cc37
-rw-r--r--chrome/browser/metrics/variations/variations_http_header_provider.h13
-rw-r--r--chrome/browser/metrics/variations/variations_http_header_provider_unittest.cc56
3 files changed, 101 insertions, 5 deletions
diff --git a/chrome/browser/metrics/variations/variations_http_header_provider.cc b/chrome/browser/metrics/variations/variations_http_header_provider.cc
index 10f2173..20b3e719 100644
--- a/chrome/browser/metrics/variations/variations_http_header_provider.cc
+++ b/chrome/browser/metrics/variations/variations_http_header_provider.cc
@@ -4,9 +4,13 @@
#include "chrome/browser/metrics/variations/variations_http_header_provider.h"
+#include <vector>
+
#include "base/base64.h"
#include "base/memory/singleton.h"
#include "base/metrics/histogram.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "chrome/browser/google/google_util.h"
#include "chrome/common/metrics/proto/chrome_experiments.pb.h"
@@ -53,6 +57,23 @@ void VariationsHttpHeaderProvider::AppendHeaders(
}
}
+bool VariationsHttpHeaderProvider::SetDefaultVariationIds(
+ const std::string& variation_ids) {
+ default_variation_ids_set_.clear();
+ std::vector<std::string> entries;
+ base::SplitString(variation_ids, ',', &entries);
+ for (std::vector<std::string>::const_iterator it = entries.begin();
+ it != entries.end(); ++it) {
+ int variation_id = 0;
+ if (!base::StringToInt(*it, &variation_id)) {
+ default_variation_ids_set_.clear();
+ return false;
+ }
+ default_variation_ids_set_.insert(variation_id);
+ }
+ return true;
+}
+
VariationsHttpHeaderProvider::VariationsHttpHeaderProvider()
: variation_ids_cache_initialized_(false) {
}
@@ -113,21 +134,27 @@ void VariationsHttpHeaderProvider::UpdateVariationIDsHeaderValue() {
// The header value is a serialized protobuffer of Variation IDs which is
// base64 encoded before transmitting as a string.
- if (variation_ids_set_.empty())
+ variation_ids_header_.clear();
+
+ if (variation_ids_set_.empty() && default_variation_ids_set_.empty())
return;
// This is the bottleneck for the creation of the header, so validate the size
// here. Force a hard maximum on the ID count in case the Variations server
// returns too many IDs and DOSs receiving servers with large requests.
DCHECK_LE(variation_ids_set_.size(), 10U);
- if (variation_ids_set_.size() > 20) {
- variation_ids_header_.clear();
+ if (variation_ids_set_.size() > 20)
return;
- }
- metrics::ChromeVariations proto;
+ // Merge the two sets of experiment ids.
+ std::set<VariationID> all_variation_ids_set = default_variation_ids_set_;
for (std::set<VariationID>::const_iterator it = variation_ids_set_.begin();
it != variation_ids_set_.end(); ++it) {
+ all_variation_ids_set.insert(*it);
+ }
+ metrics::ChromeVariations proto;
+ for (std::set<VariationID>::const_iterator it = all_variation_ids_set.begin();
+ it != all_variation_ids_set.end(); ++it) {
proto.add_variation_id(*it);
}
diff --git a/chrome/browser/metrics/variations/variations_http_header_provider.h b/chrome/browser/metrics/variations/variations_http_header_provider.h
index b432572..96e5f26 100644
--- a/chrome/browser/metrics/variations/variations_http_header_provider.h
+++ b/chrome/browser/metrics/variations/variations_http_header_provider.h
@@ -46,11 +46,21 @@ class VariationsHttpHeaderProvider : base::FieldTrialList::Observer {
bool uma_enabled,
net::HttpRequestHeaders* headers);
+ // Sets *additional* variation ids to be encoded in the X-Chrome-Varations
+ // request header. This is intended for development use to force a server
+ // side experiment id. |variation_ids| should be a comma-separated string of
+ // numeric experiment ids.
+ bool SetDefaultVariationIds(const std::string& variation_ids);
+
private:
friend struct DefaultSingletonTraits<VariationsHttpHeaderProvider>;
FRIEND_TEST_ALL_PREFIXES(VariationsHttpHeaderProviderTest,
ShouldAppendHeaders);
+ FRIEND_TEST_ALL_PREFIXES(VariationsHttpHeaderProviderTest,
+ SetDefaultVariationIds_Valid);
+ FRIEND_TEST_ALL_PREFIXES(VariationsHttpHeaderProviderTest,
+ SetDefaultVariationIds_Invalid);
VariationsHttpHeaderProvider();
virtual ~VariationsHttpHeaderProvider();
@@ -86,6 +96,9 @@ class VariationsHttpHeaderProvider : base::FieldTrialList::Observer {
// Keep a cache of variation IDs that are transmitted in headers to Google.
// This consists of a list of valid IDs, and the actual transmitted header.
std::set<chrome_variations::VariationID> variation_ids_set_;
+
+ // Provides the google experiment ids forced from command line.
+ std::set<chrome_variations::VariationID> default_variation_ids_set_;
std::string variation_ids_header_;
DISALLOW_COPY_AND_ASSIGN(VariationsHttpHeaderProvider);
diff --git a/chrome/browser/metrics/variations/variations_http_header_provider_unittest.cc b/chrome/browser/metrics/variations/variations_http_header_provider_unittest.cc
index 9e997f9..6d5be7e 100644
--- a/chrome/browser/metrics/variations/variations_http_header_provider_unittest.cc
+++ b/chrome/browser/metrics/variations/variations_http_header_provider_unittest.cc
@@ -4,11 +4,35 @@
#include "chrome/browser/metrics/variations/variations_http_header_provider.h"
+#include <string>
+
+#include "base/base64.h"
+#include "base/message_loop/message_loop.h"
+#include "chrome/common/metrics/proto/chrome_experiments.pb.h"
+#include "net/http/http_request_headers.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
namespace chrome_variations {
+namespace {
+
+// Decodes the variations header and extracts the variation ids.
+bool ExtractVariationIds(const std::string& variations,
+ std::set<VariationID>* variation_ids) {
+ std::string serialized_proto;
+ if (!base::Base64Decode(variations, &serialized_proto))
+ return false;
+ metrics::ChromeVariations proto;
+ if (!proto.ParseFromString(serialized_proto))
+ return false;
+ for (int i = 0; i < proto.variation_id_size(); ++i)
+ variation_ids->insert(proto.variation_id(i));
+ return true;
+}
+
+} // namespace
+
TEST(VariationsHttpHeaderProviderTest, ShouldAppendHeaders) {
struct {
const char* url;
@@ -39,4 +63,36 @@ TEST(VariationsHttpHeaderProviderTest, ShouldAppendHeaders) {
}
}
+TEST(VariationsHttpHeaderProviderTest, SetDefaultVariationIds_Valid) {
+ base::MessageLoop loop;
+ VariationsHttpHeaderProvider provider;
+ GURL url("http://www.google.com");
+ net::HttpRequestHeaders headers;
+ std::string variations;
+
+ // Valid experiment ids.
+ EXPECT_TRUE(provider.SetDefaultVariationIds("12,456"));
+ provider.InitVariationIDsCacheIfNeeded();
+ provider.AppendHeaders(url, false, false, &headers);
+ EXPECT_TRUE(headers.HasHeader("X-Chrome-Variations"));
+ headers.GetHeader("X-Chrome-Variations", &variations);
+ std::set<VariationID> variation_ids;
+ ASSERT_TRUE(ExtractVariationIds(variations, &variation_ids));
+ EXPECT_TRUE(variation_ids.find(12) != variation_ids.end());
+ EXPECT_TRUE(variation_ids.find(456) != variation_ids.end());
+}
+
+TEST(VariationsHttpHeaderProviderTest, SetDefaultVariationIds_Invalid) {
+ base::MessageLoop loop;
+ VariationsHttpHeaderProvider provider;
+ GURL url("http://www.google.com");
+ net::HttpRequestHeaders headers;
+
+ // Invalid experiment ids.
+ EXPECT_FALSE(provider.SetDefaultVariationIds("abcd12,456"));
+ provider.InitVariationIDsCacheIfNeeded();
+ provider.AppendHeaders(url, false, false, &headers);
+ EXPECT_FALSE(headers.HasHeader("X-Chrome-Variations"));
+}
+
} // namespace chrome_variations