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, ¶ms)) { |
- 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 |