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

Unified Diff: chrome/installer/util/experiment_storage_unittest.cc

Issue 2889323004: Win 10 Inactive toast experiment metrics and storage modifications. (Closed)
Patch Set: Apply some comments and try bots errors Created 3 years, 6 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/installer/util/experiment_storage.cc ('k') | chrome/installer/util/experiment_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/installer/util/experiment_storage_unittest.cc
diff --git a/chrome/installer/util/experiment_storage_unittest.cc b/chrome/installer/util/experiment_storage_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..5f4d2d3a57235a9dbaef81b73d16814e0485d615
--- /dev/null
+++ b/chrome/installer/util/experiment_storage_unittest.cc
@@ -0,0 +1,182 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/installer/util/experiment_storage.h"
+
+#include "base/strings/string_piece.h"
+#include "base/test/test_reg_util_win.h"
+#include "chrome/install_static/install_details.h"
+#include "chrome/install_static/test/scoped_install_details.h"
+#include "chrome/installer/util/browser_distribution.h"
+#include "chrome/installer/util/experiment.h"
+#include "chrome/installer/util/experiment_metrics.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace installer {
+
+// A test fixture that can tests saving experiment data in windows registry.
+// Individual tests provide a parameter, which is true if Chrome is installed
+// in system level.
+class ExperimentStorageTest : public ::testing::TestWithParam<bool> {
+ protected:
+ ExperimentStorageTest()
+ : system_level_install_(GetParam()),
+ scoped_install_details_(system_level_install_, 0) {}
+
+ HKEY root() {
+ return system_level_install_ ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
+ }
+
+ void SetUp() override {
+ ::testing::TestWithParam<bool>::SetUp();
+ ASSERT_NO_FATAL_FAILURE(override_manager_.OverrideRegistry(root()));
+
+ // Create an empty participation key since participation registry is assumed
+ // to be present for chrome build.
+ base::win::RegKey key;
+ ASSERT_EQ(ERROR_SUCCESS, key.Create(root(),
+ install_static::InstallDetails::Get()
+ .GetClientStateKeyPath()
+ .c_str(),
+ KEY_WOW64_32KEY | KEY_QUERY_VALUE));
+ }
+
+ bool system_level_install_;
+
+ private:
+ install_static::ScopedInstallDetails scoped_install_details_;
+ registry_util::RegistryOverrideManager override_manager_;
+
+ DISALLOW_COPY_AND_ASSIGN(ExperimentStorageTest);
+};
+
+TEST_P(ExperimentStorageTest, TestEncodeDecodeMetrics) {
+ ExperimentMetrics metrics;
+ metrics.state = ExperimentMetrics::kGroupAssigned;
+ metrics.toast_location = ExperimentMetrics::kOverTaskbarPin;
+ metrics.toast_count = 1;
+ metrics.first_toast_offset_days = 30;
+ metrics.toast_hour = 3;
+ metrics.last_used_bucket = 2;
+ metrics.action_delay_bucket = 11;
+ metrics.session_length_bucket = 36;
+ base::string16 encoded_metrics(ExperimentStorage::EncodeMetrics(metrics));
+ EXPECT_EQ(L"5BIMD4IA", encoded_metrics);
+ ExperimentMetrics decoded_metrics;
+ ASSERT_TRUE(
+ ExperimentStorage::DecodeMetrics(encoded_metrics, &decoded_metrics));
+ EXPECT_EQ(metrics, decoded_metrics);
+}
+
+TEST_P(ExperimentStorageTest, TestEncodeDecodeForMax) {
+ Experiment experiment;
+ experiment.AssignGroup(ExperimentMetrics::kNumGroups - 1);
+ experiment.SetToastLocation(ExperimentMetrics::kOverNotificationArea);
+ experiment.SetInactiveDays(ExperimentMetrics::kMaxLastUsed);
+ experiment.SetToastCount(ExperimentMetrics::kMaxToastCount);
+ experiment.SetUserSessionUptime(
+ base::TimeDelta::FromMinutes(ExperimentMetrics::kMaxSessionLength));
+ experiment.SetActionDelay(
+ base::TimeDelta::FromSeconds(ExperimentMetrics::kMaxActionDelay));
+ experiment.SetDisplayTime(
+ base::Time::UnixEpoch() +
+ base::TimeDelta::FromSeconds(ExperimentMetrics::kExperimentStartSeconds) +
+ base::TimeDelta::FromDays(ExperimentMetrics::kMaxFirstToastOffsetDays));
+ experiment.SetState(ExperimentMetrics::kUserLogOff); // Max state.
+ ExperimentMetrics metrics = experiment.metrics();
+ // toast_hour uses LocalMidnight whose value depend on local time. So, reset
+ // it to its maximum value.
+ metrics.toast_hour = 24;
+ base::string16 encoded_metrics(ExperimentStorage::EncodeMetrics(metrics));
+ EXPECT_EQ(L"///j//8f", encoded_metrics);
+ ExperimentMetrics decoded_metrics;
+ ASSERT_TRUE(
+ ExperimentStorage::DecodeMetrics(encoded_metrics, &decoded_metrics));
+ EXPECT_EQ(decoded_metrics.state, ExperimentMetrics::kUserLogOff);
+ EXPECT_EQ(decoded_metrics.group, ExperimentMetrics::kNumGroups - 1);
+ EXPECT_EQ(decoded_metrics.toast_location,
+ ExperimentMetrics::kOverNotificationArea);
+ EXPECT_EQ(decoded_metrics.toast_count, ExperimentMetrics::kMaxToastCount);
+ EXPECT_EQ(decoded_metrics.first_toast_offset_days,
+ ExperimentMetrics::kMaxFirstToastOffsetDays);
+ EXPECT_EQ(decoded_metrics.toast_hour, 24);
+ // Following are exponential buckets. So, there max value will be
+ // 2^bits - 1
+ EXPECT_EQ(decoded_metrics.last_used_bucket,
+ (1 << ExperimentMetrics::kLastUsedBucketBits) - 1);
+ EXPECT_EQ(decoded_metrics.action_delay_bucket,
+ (1 << ExperimentMetrics::kActionDelayBucketBits) - 1);
+ EXPECT_EQ(decoded_metrics.session_length_bucket,
+ (1 << ExperimentMetrics::kSessionLengthBucketBits) - 1);
+}
+
+TEST_P(ExperimentStorageTest, TestEncodeDecodeForMin) {
+ ExperimentMetrics metrics;
+ metrics.state = ExperimentMetrics::kRelaunchFailed;
+ base::string16 encoded_metrics(ExperimentStorage::EncodeMetrics(metrics));
+ EXPECT_EQ(L"AAAAAAAA", encoded_metrics);
+ ExperimentMetrics decoded_metrics;
+ ASSERT_TRUE(
+ ExperimentStorage::DecodeMetrics(encoded_metrics, &decoded_metrics));
+ EXPECT_EQ(metrics, decoded_metrics);
+}
+
+TEST_P(ExperimentStorageTest, TestReadWriteParticipation) {
+ ExperimentStorage storage;
+ ExperimentStorage::Participation expected =
+ ExperimentStorage::Participation::kIsParticipating;
+ ASSERT_TRUE(storage.AcquireLock()->WriteParticipation(expected));
+ ExperimentStorage::Participation p;
+ ASSERT_TRUE(storage.AcquireLock()->ReadParticipation(&p));
+ EXPECT_EQ(expected, p);
+}
+
+TEST_P(ExperimentStorageTest, TestLoadStoreExperiment) {
+ Experiment experiment;
+ experiment.AssignGroup(5);
+ ExperimentStorage storage;
+ ASSERT_TRUE(storage.AcquireLock()->StoreExperiment(experiment));
+ Experiment stored_experiment;
+ ASSERT_TRUE(storage.AcquireLock()->LoadExperiment(&stored_experiment));
+ EXPECT_EQ(ExperimentMetrics::kGroupAssigned, stored_experiment.state());
+ EXPECT_EQ(5, stored_experiment.group());
+ // Verify that expeirment state is stored in correct location in registry.
+ base::win::RegKey key;
+ base::string16 client_state_path(
+ system_level_install_
+ ? BrowserDistribution::GetDistribution()->GetStateMediumKey()
+ : BrowserDistribution::GetDistribution()->GetStateKey());
+ client_state_path.append(L"\\Retention");
+ EXPECT_EQ(ERROR_SUCCESS, key.Open(root(), client_state_path.c_str(),
+ KEY_QUERY_VALUE | KEY_WOW64_32KEY));
+}
+
+TEST_P(ExperimentStorageTest, TestLoadStoreMetrics) {
+ ExperimentStorage storage;
+ ExperimentMetrics metrics;
+ metrics.state = ExperimentMetrics::kGroupAssigned;
+ metrics.toast_location = ExperimentMetrics::kOverTaskbarPin;
+ metrics.toast_count = 1;
+ metrics.first_toast_offset_days = 30;
+ metrics.toast_hour = 3;
+ metrics.last_used_bucket = 2;
+ metrics.action_delay_bucket = 11;
+ metrics.session_length_bucket = 36;
+ ASSERT_TRUE(storage.AcquireLock()->StoreMetrics(metrics));
+ ExperimentMetrics stored_metrics;
+ ASSERT_TRUE(storage.AcquireLock()->LoadMetrics(&stored_metrics));
+ EXPECT_EQ(L"5BIMD4IA", ExperimentStorage::EncodeMetrics(stored_metrics));
+ // Verify that expeirment labels are stored in registry.
+ EXPECT_EQ(metrics, stored_metrics);
+}
+
+INSTANTIATE_TEST_CASE_P(UserLevel,
+ ExperimentStorageTest,
+ ::testing::Values(false));
+
+INSTANTIATE_TEST_CASE_P(SystemLevel,
+ ExperimentStorageTest,
+ ::testing::Values(true));
+
+} // namespace installer
« no previous file with comments | « chrome/installer/util/experiment_storage.cc ('k') | chrome/installer/util/experiment_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698