diff options
author | skanuj@chromium.org <skanuj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-13 18:23:09 +0000 |
---|---|---|
committer | skanuj@chromium.org <skanuj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-13 18:23:09 +0000 |
commit | 1bd918d2e2fd61863263c2292b4d618822275768 (patch) | |
tree | 723e632bbce6104fbae8a583dc4b455663ee298d /chrome/browser/metrics | |
parent | 1c7f3cbeef16d11cd2586e29001809be9ab41e0b (diff) | |
download | chromium_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')
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 |