12385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 22385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// Use of this source code is governed by a BSD-style license that can be 32385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// found in the LICENSE file. 42385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 5424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "components/variations/variations_associated_data.h" 62385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 72385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include <map> 8424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include <utility> 92385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include <vector> 102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "base/memory/singleton.h" 122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace variations { 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochnamespace { 162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// The internal singleton accessor for the map, used to keep it thread-safe. 182385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochclass GroupMapAccessor { 192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch public: 202385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch typedef std::map<ActiveGroupId, VariationID, ActiveGroupIdCompare> 212385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch GroupToIDMap; 222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Retrieve the singleton. 242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch static GroupMapAccessor* GetInstance() { 252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return Singleton<GroupMapAccessor>::get(); 262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 282385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Note that this normally only sets the ID for a group the first time, unless 292385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // |force| is set to true, in which case it will always override it. 302385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch void AssociateID(IDCollectionKey key, 312385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const ActiveGroupId& group_identifier, 322385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const VariationID id, 332385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const bool force) { 342385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#if !defined(NDEBUG) 35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_EQ(3, ID_COLLECTION_COUNT); 36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Ensure that at most one of the trigger/non-trigger web property IDs are 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // set. 38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (key == GOOGLE_WEB_PROPERTIES || key == GOOGLE_WEB_PROPERTIES_TRIGGER) { 39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IDCollectionKey other_key = key == GOOGLE_WEB_PROPERTIES ? 40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GOOGLE_WEB_PROPERTIES_TRIGGER : GOOGLE_WEB_PROPERTIES; 41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_EQ(EMPTY_ID, GetID(other_key, group_identifier)); 42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 442385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Validate that all collections with this |group_identifier| have the same 452385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // associated ID. 46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (int i = 0; i < ID_COLLECTION_COUNT; ++i) { 47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IDCollectionKey other_key = static_cast<IDCollectionKey>(i); 48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (other_key == key) 49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) continue; 50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VariationID other_id = GetID(other_key, group_identifier); 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK(other_id == EMPTY_ID || other_id == id); 52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 532385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#endif 542385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::AutoLock scoped_lock(lock_); 562385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 572385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch GroupToIDMap* group_to_id_map = GetGroupToIDMap(key); 582385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (force || 592385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch group_to_id_map->find(group_identifier) == group_to_id_map->end()) 602385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch (*group_to_id_map)[group_identifier] = id; 612385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 622385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 632385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch VariationID GetID(IDCollectionKey key, 642385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const ActiveGroupId& group_identifier) { 652385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::AutoLock scoped_lock(lock_); 662385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch GroupToIDMap* group_to_id_map = GetGroupToIDMap(key); 672385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch GroupToIDMap::const_iterator it = group_to_id_map->find(group_identifier); 682385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (it == group_to_id_map->end()) 692385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return EMPTY_ID; 702385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return it->second; 712385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 732385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch void ClearAllMapsForTesting() { 742385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::AutoLock scoped_lock(lock_); 752385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 762385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch for (int i = 0; i < ID_COLLECTION_COUNT; ++i) { 772385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch GroupToIDMap* map = GetGroupToIDMap(static_cast<IDCollectionKey>(i)); 782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch DCHECK(map); 792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch map->clear(); 802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch private: 842385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch friend struct DefaultSingletonTraits<GroupMapAccessor>; 852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Retrieves the GroupToIDMap for |key|. 872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch GroupToIDMap* GetGroupToIDMap(IDCollectionKey key) { 882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return &group_to_id_maps_[key]; 892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch GroupMapAccessor() { 922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch group_to_id_maps_.resize(ID_COLLECTION_COUNT); 932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ~GroupMapAccessor() {} 952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::Lock lock_; 972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch std::vector<GroupToIDMap> group_to_id_maps_; 982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch DISALLOW_COPY_AND_ASSIGN(GroupMapAccessor); 1002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}; 1012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// Singleton helper class that keeps track of the parameters of all variations 1032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// and ensures access to these is thread-safe. 1042385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochclass VariationsParamAssociator { 1052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch public: 1062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch typedef std::pair<std::string, std::string> VariationKey; 1072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch typedef std::map<std::string, std::string> VariationParams; 1082385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1092385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Retrieve the singleton. 1102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch static VariationsParamAssociator* GetInstance() { 1112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return Singleton<VariationsParamAssociator>::get(); 1122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 1132385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch bool AssociateVariationParams(const std::string& trial_name, 1152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const std::string& group_name, 1162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const VariationParams& params) { 1172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::AutoLock scoped_lock(lock_); 1182385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (IsFieldTrialActive(trial_name)) 1202385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return false; 1212385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const VariationKey key(trial_name, group_name); 1232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (ContainsKey(variation_params_, key)) 1242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return false; 1252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch variation_params_[key] = params; 1272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return true; 1282385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 1292385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1302385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch bool GetVariationParams(const std::string& trial_name, 1312385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch VariationParams* params) { 1322385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::AutoLock scoped_lock(lock_); 1332385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1342385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const std::string group_name = 1352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FieldTrialList::FindFullName(trial_name); 1362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const VariationKey key(trial_name, group_name); 1372385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (!ContainsKey(variation_params_, key)) 1382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return false; 1392385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch *params = variation_params_[key]; 1412385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return true; 1422385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 1432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 144ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void ClearAllParamsForTesting() { 145ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::AutoLock scoped_lock(lock_); 146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch variation_params_.clear(); 147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch private: 1502385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch friend struct DefaultSingletonTraits<VariationsParamAssociator>; 1512385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1522385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch VariationsParamAssociator() {} 1532385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ~VariationsParamAssociator() {} 1542385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Tests whether a field trial is active (i.e. group() has been called on it). 1562385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // TODO(asvitkine): Expose this as an API on base::FieldTrial. 1572385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch bool IsFieldTrialActive(const std::string& trial_name) { 1582385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FieldTrial::ActiveGroups active_groups; 1592385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FieldTrialList::GetActiveFieldTrialGroups(&active_groups); 1602385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch for (size_t i = 0; i < active_groups.size(); ++i) { 1612385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (active_groups[i].trial_name == trial_name) 1622385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return true; 1632385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 1642385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return false; 1652385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 1662385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1672385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::Lock lock_; 1682385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch std::map<VariationKey, VariationParams> variation_params_; 1692385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1702385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch DISALLOW_COPY_AND_ASSIGN(VariationsParamAssociator); 1712385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}; 1722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1732385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} // namespace 1742385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1752385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochvoid AssociateGoogleVariationID(IDCollectionKey key, 1762385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const std::string& trial_name, 1772385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const std::string& group_name, 1782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch VariationID id) { 1792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch GroupMapAccessor::GetInstance()->AssociateID( 1802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch key, MakeActiveGroupId(trial_name, group_name), id, false); 1812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 1822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochvoid AssociateGoogleVariationIDForce(IDCollectionKey key, 1842385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const std::string& trial_name, 1852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const std::string& group_name, 1862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch VariationID id) { 1872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch GroupMapAccessor::GetInstance()->AssociateID( 1882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch key, MakeActiveGroupId(trial_name, group_name), id, true); 1892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 1902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochVariationID GetGoogleVariationID(IDCollectionKey key, 1922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const std::string& trial_name, 1932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const std::string& group_name) { 1942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return GroupMapAccessor::GetInstance()->GetID( 1952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch key, MakeActiveGroupId(trial_name, group_name)); 1962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 1972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochbool AssociateVariationParams( 1992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const std::string& trial_name, 2002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const std::string& group_name, 2012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const std::map<std::string, std::string>& params) { 2022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return VariationsParamAssociator::GetInstance()->AssociateVariationParams( 2032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch trial_name, group_name, params); 2042385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 2052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 2062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochbool GetVariationParams(const std::string& trial_name, 2072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch std::map<std::string, std::string>* params) { 2082385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return VariationsParamAssociator::GetInstance()->GetVariationParams( 2092385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch trial_name, params); 2102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 2112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 2122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochstd::string GetVariationParamValue(const std::string& trial_name, 2132385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const std::string& param_name) { 2142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch std::map<std::string, std::string> params; 2152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (GetVariationParams(trial_name, ¶ms)) { 2162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch std::map<std::string, std::string>::iterator it = params.find(param_name); 2172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (it != params.end()) 2182385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return it->second; 2192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 2202385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return std::string(); 2212385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 2222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 2232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// Functions below are exposed for testing explicitly behind this namespace. 2242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// They simply wrap existing functions in this file. 2252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochnamespace testing { 2262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 2272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochvoid ClearAllVariationIDs() { 2282385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch GroupMapAccessor::GetInstance()->ClearAllMapsForTesting(); 2292385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 2302385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 231ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid ClearAllVariationParams() { 232ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch VariationsParamAssociator::GetInstance()->ClearAllParamsForTesting(); 233ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 234ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 2352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} // namespace testing 2362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace variations 238