| Index: chrome/common/metrics/experiments_helper.h
|
| diff --git a/chrome/common/metrics/experiments_helper.h b/chrome/common/metrics/experiments_helper.h
|
| index 102e6351c75795bfff3d624294d5b8a89f06f2d9..f514e100388ed663255cd88598893323f56b6a02 100644
|
| --- a/chrome/common/metrics/experiments_helper.h
|
| +++ b/chrome/common/metrics/experiments_helper.h
|
| @@ -6,6 +6,9 @@
|
| #define CHROME_COMMON_METRICS_EXPERIMENTS_HELPER_H_
|
| #pragma once
|
|
|
| +#include <string>
|
| +#include <vector>
|
| +
|
| #include "base/metrics/field_trial.h"
|
|
|
| // This namespace provides various helpers that extend the functionality around
|
| @@ -28,17 +31,14 @@
|
| // const int kLowMemGroup = trial->AppendGroup("LowMem", 20);
|
| // // All groups are now created. We want to associate GoogleExperimentIDs with
|
| // // them, so do that now.
|
| -// AssociateGoogleExperimentID(
|
| -// FieldTrial::MakeNameGroupId("trial", "default"), 123);
|
| -// AssociateGoogleExperimentID(
|
| -// FieldTrial::MakeNameGroupId("trial", "HighMem"), 456);
|
| -// AssociateGoogleExperimentID(
|
| -// FieldTrial::MakeNameGroupId("trial", "LowMem"), 789);
|
| +// AssociateGoogleExperimentID("trial", "default", 123);
|
| +// AssociateGoogleExperimentID("trial", "HighMem", 456);
|
| +// AssociateGoogleExperimentID("trial", "LowMem", 789);
|
| //
|
| // // Elsewhere, we are interested in retrieving the GoogleExperimentID
|
| // // assocaited with |trial|.
|
| -// GoogleExperimentID id = GetGoogleExperimentID(
|
| -// FieldTrial::MakeNameGroupId(trial->name(), trial->group_name()));
|
| +// GoogleExperimentID id = GetGoogleExperimentID(trial->name(),
|
| +// trial->group_name());
|
| // // Do stuff with |id|...
|
| //
|
| // The AssociateGoogleExperimentID and GetGoogleExperimentID API methods are
|
| @@ -48,27 +48,55 @@ namespace experiments_helper {
|
| // An ID used by Google servers to identify a local browser experiment.
|
| typedef uint32 GoogleExperimentID;
|
|
|
| +// The Unique ID of a trial and its selected group, where the name and group
|
| +// identifiers are hashes of the trial and group name strings.
|
| +struct SelectedGroupId {
|
| + uint32 name;
|
| + uint32 group;
|
| +};
|
| +
|
| +// We need to supply a Compare class for templates since SelectedGroupId is a
|
| +// user-defined type.
|
| +struct SelectedGroupIdCompare {
|
| + bool operator() (const SelectedGroupId& lhs,
|
| + const SelectedGroupId& rhs) const {
|
| + // The group and name fields are just SHA-1 Hashes, so we just need to treat
|
| + // them as IDs and do a less-than comparison. We test group first, since
|
| + // name is more likely to collide.
|
| + if (lhs.group != rhs.group)
|
| + return lhs.group < rhs.group;
|
| + return lhs.name < rhs.name;
|
| + }
|
| +};
|
| +
|
| // Used to represent no associated Google experiment ID. Calls to the
|
| // GetGoogleExperimentID API below will return this empty value for FieldTrial
|
| // groups uninterested in associating themselves with Google experiments, or
|
| // those that have not yet been seen yet.
|
| extern const GoogleExperimentID kEmptyGoogleExperimentID;
|
|
|
| -// Set the GoogleExperimentID associated with a FieldTrial group. The group is
|
| -// denoted by |group_identifier|, which can be created by passing the
|
| -// FieldTrial's trial and group names to base::FieldTrial::MakeNameGroupId.
|
| -// This does not need to be called for FieldTrials uninterested in Google
|
| -// experiments.
|
| -void AssociateGoogleExperimentID(
|
| - const base::FieldTrial::NameGroupId& group_identifier,
|
| - GoogleExperimentID id);
|
| +// Fills the supplied vector |name_group_ids| (which must be empty when called)
|
| +// with unique SelectedGroupIds for each Field Trial that has a chosen group.
|
| +// Field Trials for which a group has not been chosen yet are NOT returned in
|
| +// this list.
|
| +void GetFieldTrialSelectedGroupIds(
|
| + std::vector<SelectedGroupId>* name_group_ids);
|
| +
|
| +// Associate a GoogleExperimentID value with a FieldTrial group. The group is
|
| +// denoted by |trial_name| and |group_name|. This must be called whenever you
|
| +// prepare a FieldTrial (create the trial and append groups) that needs to have
|
| +// a GoogleExperimentID associated with it so Google servers can recognize the
|
| +// FieldTrial.
|
| +void AssociateGoogleExperimentID(const std::string& trial_name,
|
| + const std::string& group_name,
|
| + GoogleExperimentID id);
|
|
|
| // Retrieve the GoogleExperimentID associated with a FieldTrial group. The group
|
| -// is denoted by |group_identifier| (see comment above). This can be nicely
|
| -// combined with FieldTrial::GetFieldTrialNameGroupIds to enumerate the
|
| +// is denoted by |trial_name| and |group_name|. This can be nicely combined with
|
| +// FieldTrial::GetFieldTrialSelectedGroupIds to enumerate the
|
| // GoogleExperimentIDs for all active FieldTrial groups.
|
| -GoogleExperimentID GetGoogleExperimentID(
|
| - const base::FieldTrial::NameGroupId& group_identifier);
|
| +GoogleExperimentID GetGoogleExperimentID(const std::string& trial_name,
|
| + const std::string& group_name);
|
|
|
| // Get the current set of chosen FieldTrial groups (aka experiments) and send
|
| // them to the child process logging module so it can save it for crash dumps.
|
| @@ -76,4 +104,16 @@ void SetChildProcessLoggingExperimentList();
|
|
|
| } // namespace experiments_helper
|
|
|
| +// Expose some functions for testing. These functions just wrap functionality
|
| +// that is implemented above.
|
| +namespace testing {
|
| +
|
| +void TestGetFieldTrialSelectedGroupIdsForSelectedGroups(
|
| + const base::FieldTrial::SelectedGroups& selected_groups,
|
| + std::vector<experiments_helper::SelectedGroupId>* name_group_ids);
|
| +
|
| +uint32 TestHashName(const std::string& name);
|
| +
|
| +}
|
| +
|
| #endif // CHROME_COMMON_METRICS_EXPERIMENTS_HELPER_H_
|
|
|