1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef COMPONENTS_VARIATIONS_PROCESSED_STUDY_H_
6 #define COMPONENTS_VARIATIONS_PROCESSED_STUDY_H_
7 
8 #include <string>
9 #include <vector>
10 
11 #include "base/metrics/field_trial.h"
12 
13 namespace variations {
14 
15 class Study;
16 
17 // Wrapper over Study with extra information computed during pre-processing,
18 // such as whether the study is expired and its total probability.
19 class ProcessedStudy {
20  public:
21   // The default group used when a study doesn't specify one. This is needed
22   // because the field trial api requires a default group name.
23   static const char kGenericDefaultExperimentName[];
24 
25   ProcessedStudy();
26   ProcessedStudy(const ProcessedStudy& other);
27   ~ProcessedStudy();
28 
29   bool Init(const Study* study, bool is_expired);
30 
study()31   const Study* study() const { return study_; }
32 
total_probability()33   base::FieldTrial::Probability total_probability() const {
34     return total_probability_;
35   }
36 
all_assignments_to_one_group()37   bool all_assignments_to_one_group() const {
38     return all_assignments_to_one_group_;
39   }
40 
is_expired()41   bool is_expired() const { return is_expired_; }
42 
associated_features()43   const std::vector<std::string>& associated_features() const {
44     return associated_features_;
45   }
46 
47   // Gets the index of the experiment with the given |name|. Returns -1 if no
48   // experiment is found.
49   int GetExperimentIndexByName(const std::string& name) const;
50 
51   // Gets the default experiment name for the study, or a generic one if none is
52   // specified.
53   const char* GetDefaultExperimentName() const;
54 
55   static bool ValidateAndAppendStudy(
56       const Study* study,
57       bool is_expired,
58       std::vector<ProcessedStudy>* processed_studies);
59 
60  private:
61   // Corresponding Study object. Weak reference.
62   const Study* study_ = nullptr;
63 
64   // Computed total group probability for the study.
65   base::FieldTrial::Probability total_probability_ = 0;
66 
67   // Whether all assignments are to a single group.
68   bool all_assignments_to_one_group_ = false;
69 
70   // Whether the study is expired.
71   bool is_expired_ = false;
72 
73   // A list of feature names associated with this study by default. Studies
74   // might have groups that do not specify any feature associations – this is
75   // often the case for a default group, for example. The features listed here
76   // will be associated with all such groups.
77   std::vector<std::string> associated_features_;
78 };
79 
80 }  // namespace variations
81 
82 #endif  // COMPONENTS_VARIATIONS_PROCESSED_STUDY_H_
83