| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 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 #include "chrome/browser/metrics/metrics_state_manager.h" | |
| 6 | |
| 7 #include <ctype.h> | |
| 8 #include <string> | |
| 9 | |
| 10 #include "base/bind.h" | |
| 11 #include "base/command_line.h" | |
| 12 #include "base/prefs/testing_pref_service.h" | |
| 13 #include "chrome/common/chrome_switches.h" | |
| 14 #include "chrome/common/pref_names.h" | |
| 15 #include "components/metrics/metrics_pref_names.h" | |
| 16 #include "components/variations/caching_permuted_entropy_provider.h" | |
| 17 #include "components/variations/pref_names.h" | |
| 18 #include "testing/gtest/include/gtest/gtest.h" | |
| 19 | |
| 20 namespace metrics { | |
| 21 | |
| 22 class MetricsStateManagerTest : public testing::Test { | |
| 23 public: | |
| 24 MetricsStateManagerTest() : is_metrics_reporting_enabled_(false) { | |
| 25 MetricsStateManager::RegisterPrefs(prefs_.registry()); | |
| 26 } | |
| 27 | |
| 28 scoped_ptr<MetricsStateManager> CreateStateManager() { | |
| 29 return MetricsStateManager::Create( | |
| 30 &prefs_, | |
| 31 base::Bind(&MetricsStateManagerTest::is_metrics_reporting_enabled, | |
| 32 base::Unretained(this))).Pass(); | |
| 33 } | |
| 34 | |
| 35 // Sets metrics reporting as enabled for testing. | |
| 36 void EnableMetricsReporting() { | |
| 37 is_metrics_reporting_enabled_ = true; | |
| 38 } | |
| 39 | |
| 40 protected: | |
| 41 TestingPrefServiceSimple prefs_; | |
| 42 | |
| 43 private: | |
| 44 bool is_metrics_reporting_enabled() const { | |
| 45 return is_metrics_reporting_enabled_; | |
| 46 } | |
| 47 | |
| 48 bool is_metrics_reporting_enabled_; | |
| 49 | |
| 50 DISALLOW_COPY_AND_ASSIGN(MetricsStateManagerTest); | |
| 51 }; | |
| 52 | |
| 53 // Ensure the ClientId is formatted as expected. | |
| 54 TEST_F(MetricsStateManagerTest, ClientIdCorrectlyFormatted) { | |
| 55 scoped_ptr<MetricsStateManager> state_manager(CreateStateManager()); | |
| 56 state_manager->ForceClientIdCreation(); | |
| 57 | |
| 58 const std::string client_id = state_manager->client_id(); | |
| 59 EXPECT_EQ(36U, client_id.length()); | |
| 60 | |
| 61 for (size_t i = 0; i < client_id.length(); ++i) { | |
| 62 char current = client_id[i]; | |
| 63 if (i == 8 || i == 13 || i == 18 || i == 23) | |
| 64 EXPECT_EQ('-', current); | |
| 65 else | |
| 66 EXPECT_TRUE(isxdigit(current)); | |
| 67 } | |
| 68 } | |
| 69 | |
| 70 TEST_F(MetricsStateManagerTest, EntropySourceUsed_Low) { | |
| 71 scoped_ptr<MetricsStateManager> state_manager(CreateStateManager()); | |
| 72 state_manager->CreateEntropyProvider(); | |
| 73 EXPECT_EQ(MetricsStateManager::ENTROPY_SOURCE_LOW, | |
| 74 state_manager->entropy_source_returned()); | |
| 75 } | |
| 76 | |
| 77 TEST_F(MetricsStateManagerTest, EntropySourceUsed_High) { | |
| 78 EnableMetricsReporting(); | |
| 79 scoped_ptr<MetricsStateManager> state_manager(CreateStateManager()); | |
| 80 state_manager->CreateEntropyProvider(); | |
| 81 EXPECT_EQ(MetricsStateManager::ENTROPY_SOURCE_HIGH, | |
| 82 state_manager->entropy_source_returned()); | |
| 83 } | |
| 84 | |
| 85 TEST_F(MetricsStateManagerTest, LowEntropySource0NotReset) { | |
| 86 scoped_ptr<MetricsStateManager> state_manager(CreateStateManager()); | |
| 87 | |
| 88 // Get the low entropy source once, to initialize it. | |
| 89 state_manager->GetLowEntropySource(); | |
| 90 | |
| 91 // Now, set it to 0 and ensure it doesn't get reset. | |
| 92 state_manager->low_entropy_source_ = 0; | |
| 93 EXPECT_EQ(0, state_manager->GetLowEntropySource()); | |
| 94 // Call it another time, just to make sure. | |
| 95 EXPECT_EQ(0, state_manager->GetLowEntropySource()); | |
| 96 } | |
| 97 | |
| 98 TEST_F(MetricsStateManagerTest, | |
| 99 PermutedEntropyCacheClearedWhenLowEntropyReset) { | |
| 100 const PrefService::Preference* low_entropy_pref = | |
| 101 prefs_.FindPreference(::prefs::kMetricsLowEntropySource); | |
| 102 const char* kCachePrefName = prefs::kVariationsPermutedEntropyCache; | |
| 103 int low_entropy_value = -1; | |
| 104 | |
| 105 // First, generate an initial low entropy source value. | |
| 106 { | |
| 107 EXPECT_TRUE(low_entropy_pref->IsDefaultValue()); | |
| 108 | |
| 109 scoped_ptr<MetricsStateManager> state_manager(CreateStateManager()); | |
| 110 state_manager->GetLowEntropySource(); | |
| 111 | |
| 112 EXPECT_FALSE(low_entropy_pref->IsDefaultValue()); | |
| 113 EXPECT_TRUE(low_entropy_pref->GetValue()->GetAsInteger(&low_entropy_value)); | |
| 114 } | |
| 115 | |
| 116 // Now, set a dummy value in the permuted entropy cache pref and verify that | |
| 117 // another call to GetLowEntropySource() doesn't clobber it when | |
| 118 // --reset-variation-state wasn't specified. | |
| 119 { | |
| 120 prefs_.SetString(kCachePrefName, "test"); | |
| 121 | |
| 122 scoped_ptr<MetricsStateManager> state_manager(CreateStateManager()); | |
| 123 state_manager->GetLowEntropySource(); | |
| 124 | |
| 125 EXPECT_EQ("test", prefs_.GetString(kCachePrefName)); | |
| 126 EXPECT_EQ(low_entropy_value, | |
| 127 prefs_.GetInteger(::prefs::kMetricsLowEntropySource)); | |
| 128 } | |
| 129 | |
| 130 // Verify that the cache does get reset if --reset-variations-state is passed. | |
| 131 { | |
| 132 CommandLine::ForCurrentProcess()->AppendSwitch( | |
| 133 switches::kResetVariationState); | |
| 134 | |
| 135 scoped_ptr<MetricsStateManager> state_manager(CreateStateManager()); | |
| 136 state_manager->GetLowEntropySource(); | |
| 137 | |
| 138 EXPECT_TRUE(prefs_.GetString(kCachePrefName).empty()); | |
| 139 } | |
| 140 } | |
| 141 | |
| 142 // Check that setting the kMetricsResetIds pref to true causes the client id to | |
| 143 // be reset. We do not check that the low entropy source is reset because we | |
| 144 // cannot ensure that metrics state manager won't generate the same id again. | |
| 145 TEST_F(MetricsStateManagerTest, ResetMetricsIDs) { | |
| 146 // Set an initial client id in prefs. It should not be possible for the | |
| 147 // metrics state manager to generate this id randomly. | |
| 148 const std::string kInitialClientId = "initial client id"; | |
| 149 prefs_.SetString(::prefs::kMetricsClientID, kInitialClientId); | |
| 150 | |
| 151 // Make sure the initial client id isn't reset by the metrics state manager. | |
| 152 { | |
| 153 scoped_ptr<MetricsStateManager> state_manager(CreateStateManager()); | |
| 154 state_manager->ForceClientIdCreation(); | |
| 155 EXPECT_EQ(kInitialClientId, state_manager->client_id()); | |
| 156 } | |
| 157 | |
| 158 // Set the reset pref to cause the IDs to be reset. | |
| 159 prefs_.SetBoolean(prefs::kMetricsResetIds, true); | |
| 160 | |
| 161 // Cause the actual reset to happen. | |
| 162 { | |
| 163 scoped_ptr<MetricsStateManager> state_manager(CreateStateManager()); | |
| 164 state_manager->ForceClientIdCreation(); | |
| 165 EXPECT_NE(kInitialClientId, state_manager->client_id()); | |
| 166 | |
| 167 state_manager->GetLowEntropySource(); | |
| 168 | |
| 169 EXPECT_FALSE(prefs_.GetBoolean(prefs::kMetricsResetIds)); | |
| 170 } | |
| 171 | |
| 172 EXPECT_NE(kInitialClientId, prefs_.GetString(::prefs::kMetricsClientID)); | |
| 173 } | |
| 174 | |
| 175 } // namespace metrics | |
| OLD | NEW |