blob: 3c6ce75d0deb3739e63f1813421ca9cca9258632 [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
asvitkine35ba6472015-12-18 23:52:3338 // Returns a space-separated string containing the list of current active
39 // variations (as would be reported in the |variation_id| repeated field of
40 // the ClientVariations proto). The returned string is guaranteed to have a
41 // a leading and trailing space, e.g. " 123 234 345 ".
42 std::string GetVariationsString();
43
[email protected]8c2c5442014-04-04 18:55:2944 // Sets *additional* variation ids and trigger variation ids to be encoded in
45 // the X-Client-Data request header. This is intended for development use to
46 // force a server side experiment id. |variation_ids| should be a
47 // comma-separated string of numeric experiment ids. If an id is prefixed
48 // with "t" it will be treated as a trigger experiment id.
[email protected]1bd918d2013-10-13 18:23:0949 bool SetDefaultVariationIds(const std::string& variation_ids);
50
asvitkineb4ed78682015-03-12 18:18:5451 // Resets any cached state for tests.
52 void ResetForTesting();
53
[email protected]bd3b4712012-12-18 17:01:3054 private:
olli.raula36aa8be2015-09-10 11:14:2255 friend struct base::DefaultSingletonTraits<VariationsHttpHeaderProvider>;
[email protected]bd3b4712012-12-18 17:01:3056
[email protected]7f8a9932013-07-26 20:43:3457 FRIEND_TEST_ALL_PREFIXES(VariationsHttpHeaderProviderTest,
[email protected]1bd918d2013-10-13 18:23:0958 SetDefaultVariationIds_Valid);
59 FRIEND_TEST_ALL_PREFIXES(VariationsHttpHeaderProviderTest,
60 SetDefaultVariationIds_Invalid);
[email protected]e51dcb0c2014-05-06 16:56:1061 FRIEND_TEST_ALL_PREFIXES(VariationsHttpHeaderProviderTest,
62 OnFieldTrialGroupFinalized);
asvitkine35ba6472015-12-18 23:52:3363 FRIEND_TEST_ALL_PREFIXES(VariationsHttpHeaderProviderTest,
64 GetVariationsString);
[email protected]7f8a9932013-07-26 20:43:3465
[email protected]ab7780792013-01-10 01:26:0966 VariationsHttpHeaderProvider();
dcheng00ea022b2014-10-21 11:24:5667 ~VariationsHttpHeaderProvider() override;
[email protected]bd3b4712012-12-18 17:01:3068
asvitkinee0dbdbe2014-10-31 21:59:5769 // base::FieldTrialList::Observer:
[email protected]bd3b4712012-12-18 17:01:3070 // This will add the variation ID associated with |trial_name| and
71 // |group_name| to the variation ID cache.
dcheng00ea022b2014-10-21 11:24:5672 void OnFieldTrialGroupFinalized(const std::string& trial_name,
73 const std::string& group_name) override;
[email protected]bd3b4712012-12-18 17:01:3074
asvitkinee0dbdbe2014-10-31 21:59:5775 // metrics::SyntheticTrialObserver:
76 void OnSyntheticTrialsChanged(
asvitkine9a279832015-12-18 02:35:5077 const std::vector<SyntheticTrialGroup>& groups) override;
asvitkinee0dbdbe2014-10-31 21:59:5778
[email protected]bd3b4712012-12-18 17:01:3079 // Prepares the variation IDs cache with initial values if not already done.
80 // This method also registers the caller with the FieldTrialList to receive
81 // new variation IDs.
82 void InitVariationIDsCacheIfNeeded();
83
84 // Takes whatever is currently in |variation_ids_set_| and recreates
[email protected]ab7780792013-01-10 01:26:0985 // |variation_ids_header_| with it. Assumes the the |lock_| is currently
86 // held.
[email protected]bd3b4712012-12-18 17:01:3087 void UpdateVariationIDsHeaderValue();
88
asvitkine35ba6472015-12-18 23:52:3389 // Returns the currently active set of variation ids, which includes any
90 // default values, synthetic variations and actual field trial variations.
91 std::set<VariationID> GetAllVariationIds();
92
[email protected]bd3b4712012-12-18 17:01:3093 // Guards |variation_ids_cache_initialized_|, |variation_ids_set_| and
94 // |variation_ids_header_|.
95 base::Lock lock_;
96
97 // Whether or not we've initialized the cache.
98 bool variation_ids_cache_initialized_;
99
100 // Keep a cache of variation IDs that are transmitted in headers to Google.
101 // This consists of a list of valid IDs, and the actual transmitted header.
[email protected]59b6f672014-07-26 18:35:47102 std::set<VariationID> variation_ids_set_;
103 std::set<VariationID> variation_trigger_ids_set_;
[email protected]1bd918d2013-10-13 18:23:09104
105 // Provides the google experiment ids forced from command line.
[email protected]59b6f672014-07-26 18:35:47106 std::set<VariationID> default_variation_ids_set_;
107 std::set<VariationID> default_trigger_id_set_;
[email protected]8c2c5442014-04-04 18:55:29108
asvitkinee0dbdbe2014-10-31 21:59:57109 // Variations ids from synthetic field trials.
110 std::set<VariationID> synthetic_variation_ids_set_;
111
[email protected]bd3b4712012-12-18 17:01:30112 std::string variation_ids_header_;
113
[email protected]ab7780792013-01-10 01:26:09114 DISALLOW_COPY_AND_ASSIGN(VariationsHttpHeaderProvider);
[email protected]bd3b4712012-12-18 17:01:30115};
116
[email protected]71011c1682014-07-09 17:19:16117} // namespace variations
[email protected]ab7780792013-01-10 01:26:09118
asvitkine9a279832015-12-18 02:35:50119#endif // COMPONENTS_VARIATIONS_VARIATIONS_HTTP_HEADER_PROVIDER_H_