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, &params)) {
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