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_ |