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 |