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