blob: 18ff19d305efeff2841dc23818c6b140bed2409a [file] [log] [blame]
[email protected]71011c1682014-07-09 17:19:161// Copyright 2014 The Chromium Authors. All rights reserved.
[email protected]bd3b4712012-12-18 17:01:302// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
asvitkine9a279832015-12-18 02:35:505#ifndef COMPONENTS_VARIATIONS_VARIATIONS_HTTP_HEADER_PROVIDER_H_
6#define COMPONENTS_VARIATIONS_VARIATIONS_HTTP_HEADER_PROVIDER_H_
[email protected]bd3b4712012-12-18 17:01:307
8#include <set>
9#include <string>
asvitkinee0dbdbe2014-10-31 21:59:5710#include <vector>
[email protected]bd3b4712012-12-18 17:01:3011
12#include "base/basictypes.h"
[email protected]7f8a9932013-07-26 20:43:3413#include "base/gtest_prod_util.h"
[email protected]bd3b4712012-12-18 17:01:3014#include "base/metrics/field_trial.h"
15#include "base/synchronization/lock.h"
asvitkine9a279832015-12-18 02:35:5016#include "components/variations/synthetic_trials.h"
[email protected]50ae9f12013-08-29 18:03:2217#include "components/variations/variations_associated_data.h"
[email protected]bd3b4712012-12-18 17:01:3018
olli.raula36aa8be2015-09-10 11:14:2219namespace base {
asvitkine9a279832015-12-18 02:35:5020template <typename T>
21struct DefaultSingletonTraits;
olli.raula36aa8be2015-09-10 11:14:2222}
[email protected]bd3b4712012-12-18 17:01:3023
[email protected]71011c1682014-07-09 17:19:1624namespace variations {
[email protected]ab7780792013-01-10 01:26:0925
[email protected]ea15bd52014-07-14 22:42:5026// A helper class for maintaining client experiments and metrics state
[email protected]bd3b4712012-12-18 17:01:3027// transmitted in custom HTTP request headers.
28// This class is a thread-safe singleton.
asvitkinee0dbdbe2014-10-31 21:59:5729class VariationsHttpHeaderProvider : public base::FieldTrialList::Observer,
asvitkine9a279832015-12-18 02:35:5030 public SyntheticTrialObserver {
[email protected]bd3b4712012-12-18 17:01:3031 public:
[email protected]ab7780792013-01-10 01:26:0932 static VariationsHttpHeaderProvider* GetInstance();
[email protected]bd3b4712012-12-18 17:01:3033
asvitkine9a279832015-12-18 02:35:5034 // Returns the value of the client data header, computing and caching it if
35 // necessary.
36 std::string GetClientDataHeader();
[email protected]bd3b4712012-12-18 17:01:3037
[email protected]8c2c5442014-04-04 18:55:2938 // Sets *additional* variation ids and trigger variation ids to be encoded in
39 // the X-Client-Data request header. This is intended for development use to
40 // force a server side experiment id. |variation_ids| should be a
41 // comma-separated string of numeric experiment ids. If an id is prefixed
42 // with "t" it will be treated as a trigger experiment id.
[email protected]1bd918d2013-10-13 18:23:0943 bool SetDefaultVariationIds(const std::string& variation_ids);
44
asvitkineb4ed78682015-03-12 18:18:5445 // Resets any cached state for tests.
46 void ResetForTesting();
47
[email protected]bd3b4712012-12-18 17:01:3048 private:
olli.raula36aa8be2015-09-10 11:14:2249 friend struct base::DefaultSingletonTraits<VariationsHttpHeaderProvider>;
[email protected]bd3b4712012-12-18 17:01:3050
[email protected]7f8a9932013-07-26 20:43:3451 FRIEND_TEST_ALL_PREFIXES(VariationsHttpHeaderProviderTest,
[email protected]1bd918d2013-10-13 18:23:0952 SetDefaultVariationIds_Valid);
53 FRIEND_TEST_ALL_PREFIXES(VariationsHttpHeaderProviderTest,
54 SetDefaultVariationIds_Invalid);
[email protected]e51dcb0c2014-05-06 16:56:1055 FRIEND_TEST_ALL_PREFIXES(VariationsHttpHeaderProviderTest,
56 OnFieldTrialGroupFinalized);
[email protected]7f8a9932013-07-26 20:43:3457
[email protected]ab7780792013-01-10 01:26:0958 VariationsHttpHeaderProvider();
dcheng00ea022b2014-10-21 11:24:5659 ~VariationsHttpHeaderProvider() override;
[email protected]bd3b4712012-12-18 17:01:3060
asvitkinee0dbdbe2014-10-31 21:59:5761 // base::FieldTrialList::Observer:
[email protected]bd3b4712012-12-18 17:01:3062 // This will add the variation ID associated with |trial_name| and
63 // |group_name| to the variation ID cache.
dcheng00ea022b2014-10-21 11:24:5664 void OnFieldTrialGroupFinalized(const std::string& trial_name,
65 const std::string& group_name) override;
[email protected]bd3b4712012-12-18 17:01:3066
asvitkinee0dbdbe2014-10-31 21:59:5767 // metrics::SyntheticTrialObserver:
68 void OnSyntheticTrialsChanged(
asvitkine9a279832015-12-18 02:35:5069 const std::vector<SyntheticTrialGroup>& groups) override;
asvitkinee0dbdbe2014-10-31 21:59:5770
[email protected]bd3b4712012-12-18 17:01:3071 // Prepares the variation IDs cache with initial values if not already done.
72 // This method also registers the caller with the FieldTrialList to receive
73 // new variation IDs.
74 void InitVariationIDsCacheIfNeeded();
75
76 // Takes whatever is currently in |variation_ids_set_| and recreates
[email protected]ab7780792013-01-10 01:26:0977 // |variation_ids_header_| with it. Assumes the the |lock_| is currently
78 // held.
[email protected]bd3b4712012-12-18 17:01:3079 void UpdateVariationIDsHeaderValue();
80
81 // Guards |variation_ids_cache_initialized_|, |variation_ids_set_| and
82 // |variation_ids_header_|.
83 base::Lock lock_;
84
85 // Whether or not we've initialized the cache.
86 bool variation_ids_cache_initialized_;
87
88 // Keep a cache of variation IDs that are transmitted in headers to Google.
89 // This consists of a list of valid IDs, and the actual transmitted header.
[email protected]59b6f672014-07-26 18:35:4790 std::set<VariationID> variation_ids_set_;
91 std::set<VariationID> variation_trigger_ids_set_;
[email protected]1bd918d2013-10-13 18:23:0992
93 // Provides the google experiment ids forced from command line.
[email protected]59b6f672014-07-26 18:35:4794 std::set<VariationID> default_variation_ids_set_;
95 std::set<VariationID> default_trigger_id_set_;
[email protected]8c2c5442014-04-04 18:55:2996
asvitkinee0dbdbe2014-10-31 21:59:5797 // Variations ids from synthetic field trials.
98 std::set<VariationID> synthetic_variation_ids_set_;
99
[email protected]bd3b4712012-12-18 17:01:30100 std::string variation_ids_header_;
101
[email protected]ab7780792013-01-10 01:26:09102 DISALLOW_COPY_AND_ASSIGN(VariationsHttpHeaderProvider);
[email protected]bd3b4712012-12-18 17:01:30103};
104
[email protected]71011c1682014-07-09 17:19:16105} // namespace variations
[email protected]ab7780792013-01-10 01:26:09106
asvitkine9a279832015-12-18 02:35:50107#endif // COMPONENTS_VARIATIONS_VARIATIONS_HTTP_HEADER_PROVIDER_H_