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