Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1849)

Unified Diff: chrome/browser/metrics/variations_service.cc

Issue 10381021: Add filtering logic for client-side variations. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: address final nits Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/metrics/variations_service.h ('k') | chrome/browser/metrics/variations_service_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/metrics/variations_service.cc
diff --git a/chrome/browser/metrics/variations_service.cc b/chrome/browser/metrics/variations_service.cc
index e033bf870c7937836ad028e898cf92667df5186f..64a5f003682da2d7dbbf187cbd3f9077300d037e 100644
--- a/chrome/browser/metrics/variations_service.cc
+++ b/chrome/browser/metrics/variations_service.cc
@@ -5,6 +5,8 @@
#include "chrome/browser/metrics/variations_service.h"
#include "base/base64.h"
+#include "base/build_time.h"
+#include "base/version.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/singleton.h"
#include "chrome/browser/browser_process.h"
@@ -22,6 +24,25 @@ namespace {
const char kDefaultVariationsServer[] =
"https://clients4.google.com/chrome-variations/seed";
+// Maps chrome_variations::Study_Channel enum values to corresponding
+// chrome::VersionInfo::Channel enum values.
+chrome::VersionInfo::Channel ConvertStudyChannelToVersionChannel(
+ chrome_variations::Study_Channel study_channel) {
+ switch (study_channel) {
+ case chrome_variations::Study_Channel_CANARY:
+ return chrome::VersionInfo::CHANNEL_CANARY;
+ case chrome_variations::Study_Channel_DEV:
+ return chrome::VersionInfo::CHANNEL_DEV;
+ case chrome_variations::Study_Channel_BETA:
+ return chrome::VersionInfo::CHANNEL_BETA;
+ case chrome_variations::Study_Channel_STABLE:
+ return chrome::VersionInfo::CHANNEL_STABLE;
+ }
+ // All enum values of |study_channel| were handled above.
+ NOTREACHED();
+ return chrome::VersionInfo::CHANNEL_UNKNOWN;
+}
+
} // namespace
// Static
@@ -94,3 +115,90 @@ void VariationsService::StoreSeedData(const std::string& seed_data,
VariationsService::VariationsService() {}
VariationsService::~VariationsService() {}
+
+// static
+bool VariationsService::ShouldAddStudy(const chrome_variations::Study& study) {
+ const chrome::VersionInfo current_version_info;
+ if (!current_version_info.is_valid())
+ return false;
+
+ if (!CheckStudyChannel(study, chrome::VersionInfo::GetChannel())) {
+ DVLOG(1) << "Filtered out study " << study.name() << " due to version.";
+ return false;
+ }
+
+ if (!CheckStudyVersion(study, current_version_info.Version())) {
+ DVLOG(1) << "Filtered out study " << study.name() << " due to version.";
+ return false;
+ }
+
+ // Use build time and not system time to match what is done in field_trial.cc.
+ if (!CheckStudyDate(study, base::GetBuildTime())) {
Ilya Sherman 2012/05/07 22:49:04 Hmm, this seems redundant with the version check.
Alexei Svitkine (slow) 2012/05/08 14:43:25 I agree, it's a bit strange. I think originally, t
Ilya Sherman 2012/05/08 22:36:31 That sounds good. I think it would also be helpfu
+ DVLOG(1) << "Filtered out study " << study.name() << " due to date.";
+ return false;
+ }
+
+ DVLOG(1) << "Kept study " << study.name() << ".";
+ return true;
+}
+
+// static
+bool VariationsService::CheckStudyChannel(
+ const chrome_variations::Study& study,
+ chrome::VersionInfo::Channel channel) {
+ for (int i = 0; i < study.channel_size(); ++i) {
+ if (ConvertStudyChannelToVersionChannel(study.channel(i)) == channel)
+ return true;
+ }
+ return false;
+}
+
+// static
+bool VariationsService::CheckStudyVersion(const chrome_variations::Study& study,
+ const std::string& version_string) {
+ const Version current_version(version_string);
+ if (!current_version.IsValid()) {
+ DCHECK(false);
Ilya Sherman 2012/05/07 22:49:04 nit: NOTREACHED()
+ return false;
+ }
+
+ if (study.has_min_version()) {
+ const Version min_version(study.min_version());
+ if (!min_version.IsValid())
+ return false;
+ if (current_version.CompareTo(min_version) < 0)
+ return false;
+ }
+
+ if (study.has_max_version()) {
+ const Version max_version(study.max_version());
+ if (!max_version.IsValid())
+ return false;
+ if (current_version.CompareTo(max_version) > 0)
+ return false;
+ }
+
+ return true;
+}
+
+// static
+bool VariationsService::CheckStudyDate(const chrome_variations::Study& study,
+ const base::Time& date_time) {
+ const base::Time epoch = base::Time::UnixEpoch();
+
+ if (study.has_start_date()) {
+ const base::Time start_date =
+ epoch + base::TimeDelta::FromMilliseconds(study.start_date());
+ if (date_time < start_date)
+ return false;
+ }
+
+ if (study.has_expiry_date()) {
+ const base::Time expiry_date =
+ epoch + base::TimeDelta::FromMilliseconds(study.expiry_date());
+ if (date_time >= expiry_date)
+ return false;
+ }
+
+ return true;
+}
« no previous file with comments | « chrome/browser/metrics/variations_service.h ('k') | chrome/browser/metrics/variations_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698