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

Unified Diff: chrome/common/metrics/variations/variations_associated_data.cc

Issue 23097007: Create variations target that depends on base. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 7 years, 4 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: chrome/common/metrics/variations/variations_associated_data.cc
===================================================================
--- chrome/common/metrics/variations/variations_associated_data.cc (revision 220309)
+++ chrome/common/metrics/variations/variations_associated_data.cc (working copy)
@@ -1,236 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/common/metrics/variations/variations_associated_data.h"
-
-#include <map>
-#include <vector>
-
-#include "base/memory/singleton.h"
-#include "chrome/common/metrics/metrics_util.h"
-#include "chrome/common/metrics/variations/variation_ids.h"
-
-namespace chrome_variations {
-
-namespace {
-
-// The internal singleton accessor for the map, used to keep it thread-safe.
-class GroupMapAccessor {
- public:
- typedef std::map<ActiveGroupId, VariationID, ActiveGroupIdCompare>
- GroupToIDMap;
-
- // Retrieve the singleton.
- static GroupMapAccessor* GetInstance() {
- return Singleton<GroupMapAccessor>::get();
- }
-
- // Note that this normally only sets the ID for a group the first time, unless
- // |force| is set to true, in which case it will always override it.
- void AssociateID(IDCollectionKey key,
- const ActiveGroupId& group_identifier,
- const VariationID id,
- const bool force) {
-#if !defined(NDEBUG)
- // Validate that all collections with this |group_identifier| have the same
- // associated ID.
- DCHECK_EQ(2, ID_COLLECTION_COUNT);
- IDCollectionKey other_key = GOOGLE_WEB_PROPERTIES;
- if (key == GOOGLE_WEB_PROPERTIES)
- other_key = GOOGLE_UPDATE_SERVICE;
- VariationID other_id = GetID(other_key, group_identifier);
- DCHECK(other_id == EMPTY_ID || other_id == id);
-#endif
-
- base::AutoLock scoped_lock(lock_);
-
- GroupToIDMap* group_to_id_map = GetGroupToIDMap(key);
- if (force ||
- group_to_id_map->find(group_identifier) == group_to_id_map->end())
- (*group_to_id_map)[group_identifier] = id;
- }
-
- VariationID GetID(IDCollectionKey key,
- const ActiveGroupId& group_identifier) {
- base::AutoLock scoped_lock(lock_);
- GroupToIDMap* group_to_id_map = GetGroupToIDMap(key);
- GroupToIDMap::const_iterator it = group_to_id_map->find(group_identifier);
- if (it == group_to_id_map->end())
- return EMPTY_ID;
- return it->second;
- }
-
- void ClearAllMapsForTesting() {
- base::AutoLock scoped_lock(lock_);
-
- for (int i = 0; i < ID_COLLECTION_COUNT; ++i) {
- GroupToIDMap* map = GetGroupToIDMap(static_cast<IDCollectionKey>(i));
- DCHECK(map);
- map->clear();
- }
- }
-
- private:
- friend struct DefaultSingletonTraits<GroupMapAccessor>;
-
- // Retrieves the GroupToIDMap for |key|.
- GroupToIDMap* GetGroupToIDMap(IDCollectionKey key) {
- return &group_to_id_maps_[key];
- }
-
- GroupMapAccessor() {
- group_to_id_maps_.resize(ID_COLLECTION_COUNT);
- }
- ~GroupMapAccessor() {}
-
- base::Lock lock_;
- std::vector<GroupToIDMap> group_to_id_maps_;
-
- DISALLOW_COPY_AND_ASSIGN(GroupMapAccessor);
-};
-
-// Singleton helper class that keeps track of the parameters of all variations
-// and ensures access to these is thread-safe.
-class VariationsParamAssociator {
- public:
- typedef std::pair<std::string, std::string> VariationKey;
- typedef std::map<std::string, std::string> VariationParams;
-
- // Retrieve the singleton.
- static VariationsParamAssociator* GetInstance() {
- return Singleton<VariationsParamAssociator>::get();
- }
-
- bool AssociateVariationParams(const std::string& trial_name,
- const std::string& group_name,
- const VariationParams& params) {
- base::AutoLock scoped_lock(lock_);
-
- if (IsFieldTrialActive(trial_name))
- return false;
-
- const VariationKey key(trial_name, group_name);
- if (ContainsKey(variation_params_, key))
- return false;
-
- variation_params_[key] = params;
- return true;
- }
-
- bool GetVariationParams(const std::string& trial_name,
- VariationParams* params) {
- base::AutoLock scoped_lock(lock_);
-
- const std::string group_name =
- base::FieldTrialList::FindFullName(trial_name);
- const VariationKey key(trial_name, group_name);
- if (!ContainsKey(variation_params_, key))
- return false;
-
- *params = variation_params_[key];
- return true;
- }
-
- void ClearAllParamsForTesting() {
- base::AutoLock scoped_lock(lock_);
- variation_params_.clear();
- }
-
- private:
- friend struct DefaultSingletonTraits<VariationsParamAssociator>;
-
- VariationsParamAssociator() {}
- ~VariationsParamAssociator() {}
-
- // Tests whether a field trial is active (i.e. group() has been called on it).
- // TODO(asvitkine): Expose this as an API on base::FieldTrial.
- bool IsFieldTrialActive(const std::string& trial_name) {
- base::FieldTrial::ActiveGroups active_groups;
- base::FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
- for (size_t i = 0; i < active_groups.size(); ++i) {
- if (active_groups[i].trial_name == trial_name)
- return true;
- }
- return false;
- }
-
- base::Lock lock_;
- std::map<VariationKey, VariationParams> variation_params_;
-
- DISALLOW_COPY_AND_ASSIGN(VariationsParamAssociator);
-};
-
-} // namespace
-
-ActiveGroupId MakeActiveGroupId(const std::string& trial_name,
- const std::string& group_name) {
- ActiveGroupId id;
- id.name = metrics::HashName(trial_name);
- id.group = metrics::HashName(group_name);
- return id;
-}
-
-void AssociateGoogleVariationID(IDCollectionKey key,
- const std::string& trial_name,
- const std::string& group_name,
- VariationID id) {
- GroupMapAccessor::GetInstance()->AssociateID(
- key, MakeActiveGroupId(trial_name, group_name), id, false);
-}
-
-void AssociateGoogleVariationIDForce(IDCollectionKey key,
- const std::string& trial_name,
- const std::string& group_name,
- VariationID id) {
- GroupMapAccessor::GetInstance()->AssociateID(
- key, MakeActiveGroupId(trial_name, group_name), id, true);
-}
-
-VariationID GetGoogleVariationID(IDCollectionKey key,
- const std::string& trial_name,
- const std::string& group_name) {
- return GroupMapAccessor::GetInstance()->GetID(
- key, MakeActiveGroupId(trial_name, group_name));
-}
-
-bool AssociateVariationParams(
- const std::string& trial_name,
- const std::string& group_name,
- const std::map<std::string, std::string>& params) {
- return VariationsParamAssociator::GetInstance()->AssociateVariationParams(
- trial_name, group_name, params);
-}
-
-bool GetVariationParams(const std::string& trial_name,
- std::map<std::string, std::string>* params) {
- return VariationsParamAssociator::GetInstance()->GetVariationParams(
- trial_name, params);
-}
-
-std::string GetVariationParamValue(const std::string& trial_name,
- const std::string& param_name) {
- std::map<std::string, std::string> params;
- if (GetVariationParams(trial_name, &params)) {
- std::map<std::string, std::string>::iterator it = params.find(param_name);
- if (it != params.end())
- return it->second;
- }
- return std::string();
-}
-
-// Functions below are exposed for testing explicitly behind this namespace.
-// They simply wrap existing functions in this file.
-namespace testing {
-
-void ClearAllVariationIDs() {
- GroupMapAccessor::GetInstance()->ClearAllMapsForTesting();
-}
-
-void ClearAllVariationParams() {
- VariationsParamAssociator::GetInstance()->ClearAllParamsForTesting();
-}
-
-} // namespace testing
-
-} // namespace chrome_variations

Powered by Google App Engine
This is Rietveld 408576698