OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/metrics/metrics_state_manager.h" | 5 #include "components/metrics/metrics_state_manager.h" |
6 | 6 |
7 #include <ctype.h> | 7 #include <ctype.h> |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 #include <string> | 10 #include <string> |
(...skipping 10 matching lines...) Expand all Loading... |
21 #include "components/prefs/testing_pref_service.h" | 21 #include "components/prefs/testing_pref_service.h" |
22 #include "components/variations/caching_permuted_entropy_provider.h" | 22 #include "components/variations/caching_permuted_entropy_provider.h" |
23 #include "components/variations/pref_names.h" | 23 #include "components/variations/pref_names.h" |
24 #include "testing/gtest/include/gtest/gtest.h" | 24 #include "testing/gtest/include/gtest/gtest.h" |
25 | 25 |
26 namespace metrics { | 26 namespace metrics { |
27 | 27 |
28 class MetricsStateManagerTest : public testing::Test { | 28 class MetricsStateManagerTest : public testing::Test { |
29 public: | 29 public: |
30 MetricsStateManagerTest() | 30 MetricsStateManagerTest() |
31 : enabled_state_provider_(new TestEnabledStateProvider(false, false)) { | 31 : test_begin_time_(base::Time::Now().ToTimeT()), |
| 32 enabled_state_provider_(new TestEnabledStateProvider(false, false)) { |
32 MetricsService::RegisterPrefs(prefs_.registry()); | 33 MetricsService::RegisterPrefs(prefs_.registry()); |
33 } | 34 } |
34 | 35 |
35 std::unique_ptr<MetricsStateManager> CreateStateManager() { | 36 std::unique_ptr<MetricsStateManager> CreateStateManager() { |
36 return MetricsStateManager::Create( | 37 return MetricsStateManager::Create( |
37 &prefs_, enabled_state_provider_.get(), | 38 &prefs_, enabled_state_provider_.get(), |
38 base::Bind(&MetricsStateManagerTest::MockStoreClientInfoBackup, | 39 base::Bind(&MetricsStateManagerTest::MockStoreClientInfoBackup, |
39 base::Unretained(this)), | 40 base::Unretained(this)), |
40 base::Bind(&MetricsStateManagerTest::LoadFakeClientInfoBackup, | 41 base::Bind(&MetricsStateManagerTest::LoadFakeClientInfoBackup, |
41 base::Unretained(this))); | 42 base::Unretained(this))); |
42 } | 43 } |
43 | 44 |
44 // Sets metrics reporting as enabled for testing. | 45 // Sets metrics reporting as enabled for testing. |
45 void EnableMetricsReporting() { | 46 void EnableMetricsReporting() { |
46 enabled_state_provider_->set_consent(true); | 47 enabled_state_provider_->set_consent(true); |
47 enabled_state_provider_->set_enabled(true); | 48 enabled_state_provider_->set_enabled(true); |
48 } | 49 } |
49 | 50 |
| 51 void SetClientInfoPrefs(const ClientInfo& client_info) { |
| 52 prefs_.SetString(prefs::kMetricsClientID, client_info.client_id); |
| 53 prefs_.SetInt64(prefs::kInstallDate, client_info.installation_date); |
| 54 prefs_.SetInt64(prefs::kMetricsReportingEnabledTimestamp, |
| 55 client_info.reporting_enabled_date); |
| 56 } |
| 57 |
| 58 void SetFakeClientInfoBackup(const ClientInfo& client_info) { |
| 59 fake_client_info_backup_.reset(new ClientInfo); |
| 60 fake_client_info_backup_->client_id = client_info.client_id; |
| 61 fake_client_info_backup_->installation_date = client_info.installation_date; |
| 62 fake_client_info_backup_->reporting_enabled_date = |
| 63 client_info.reporting_enabled_date; |
| 64 } |
| 65 |
50 protected: | 66 protected: |
51 TestingPrefServiceSimple prefs_; | 67 TestingPrefServiceSimple prefs_; |
52 | 68 |
53 // Last ClientInfo stored by the MetricsStateManager via | 69 // Last ClientInfo stored by the MetricsStateManager via |
54 // MockStoreClientInfoBackup. | 70 // MockStoreClientInfoBackup. |
55 std::unique_ptr<ClientInfo> stored_client_info_backup_; | 71 std::unique_ptr<ClientInfo> stored_client_info_backup_; |
56 | 72 |
57 // If set, will be returned via LoadFakeClientInfoBackup if requested by the | 73 // If set, will be returned via LoadFakeClientInfoBackup if requested by the |
58 // MetricsStateManager. | 74 // MetricsStateManager. |
59 std::unique_ptr<ClientInfo> fake_client_info_backup_; | 75 std::unique_ptr<ClientInfo> fake_client_info_backup_; |
60 | 76 |
| 77 const int64_t test_begin_time_; |
| 78 |
61 private: | 79 private: |
62 // Stores the |client_info| in |stored_client_info_backup_| for verification | 80 // Stores the |client_info| in |stored_client_info_backup_| for verification |
63 // by the tests later. | 81 // by the tests later. |
64 void MockStoreClientInfoBackup(const ClientInfo& client_info) { | 82 void MockStoreClientInfoBackup(const ClientInfo& client_info) { |
65 stored_client_info_backup_.reset(new ClientInfo); | 83 stored_client_info_backup_.reset(new ClientInfo); |
66 stored_client_info_backup_->client_id = client_info.client_id; | 84 stored_client_info_backup_->client_id = client_info.client_id; |
67 stored_client_info_backup_->installation_date = | 85 stored_client_info_backup_->installation_date = |
68 client_info.installation_date; | 86 client_info.installation_date; |
69 stored_client_info_backup_->reporting_enabled_date = | 87 stored_client_info_backup_->reporting_enabled_date = |
70 client_info.reporting_enabled_date; | 88 client_info.reporting_enabled_date; |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
215 EXPECT_FALSE(prefs_.GetBoolean(prefs::kMetricsResetIds)); | 233 EXPECT_FALSE(prefs_.GetBoolean(prefs::kMetricsResetIds)); |
216 } | 234 } |
217 | 235 |
218 EXPECT_NE(kInitialClientId, prefs_.GetString(prefs::kMetricsClientID)); | 236 EXPECT_NE(kInitialClientId, prefs_.GetString(prefs::kMetricsClientID)); |
219 } | 237 } |
220 | 238 |
221 TEST_F(MetricsStateManagerTest, ForceClientIdCreation) { | 239 TEST_F(MetricsStateManagerTest, ForceClientIdCreation) { |
222 const int64_t kFakeInstallationDate = 12345; | 240 const int64_t kFakeInstallationDate = 12345; |
223 prefs_.SetInt64(prefs::kInstallDate, kFakeInstallationDate); | 241 prefs_.SetInt64(prefs::kInstallDate, kFakeInstallationDate); |
224 | 242 |
225 const int64_t test_begin_time = base::Time::Now().ToTimeT(); | |
226 | |
227 // Holds ClientInfo from previous scoped test for extra checks. | |
228 std::unique_ptr<ClientInfo> previous_client_info; | |
229 | |
230 { | 243 { |
231 std::unique_ptr<MetricsStateManager> state_manager(CreateStateManager()); | 244 std::unique_ptr<MetricsStateManager> state_manager(CreateStateManager()); |
232 | 245 |
233 // client_id shouldn't be auto-generated if metrics reporting is not | 246 // client_id shouldn't be auto-generated if metrics reporting is not |
234 // enabled. | 247 // enabled. |
235 EXPECT_EQ(std::string(), state_manager->client_id()); | 248 EXPECT_EQ(std::string(), state_manager->client_id()); |
236 EXPECT_EQ(0, prefs_.GetInt64(prefs::kMetricsReportingEnabledTimestamp)); | 249 EXPECT_EQ(0, prefs_.GetInt64(prefs::kMetricsReportingEnabledTimestamp)); |
237 | 250 |
238 // Confirm that the initial ForceClientIdCreation call creates the client id | 251 // Confirm that the initial ForceClientIdCreation call creates the client id |
239 // and backs it up via MockStoreClientInfoBackup. | 252 // and backs it up via MockStoreClientInfoBackup. |
240 EXPECT_FALSE(stored_client_info_backup_); | 253 EXPECT_FALSE(stored_client_info_backup_); |
241 state_manager->ForceClientIdCreation(); | 254 state_manager->ForceClientIdCreation(); |
242 EXPECT_NE(std::string(), state_manager->client_id()); | 255 EXPECT_NE(std::string(), state_manager->client_id()); |
243 EXPECT_GE(prefs_.GetInt64(prefs::kMetricsReportingEnabledTimestamp), | 256 EXPECT_GE(prefs_.GetInt64(prefs::kMetricsReportingEnabledTimestamp), |
244 test_begin_time); | 257 test_begin_time_); |
245 | 258 |
246 ASSERT_TRUE(stored_client_info_backup_); | 259 ASSERT_TRUE(stored_client_info_backup_); |
247 EXPECT_EQ(state_manager->client_id(), | 260 EXPECT_EQ(state_manager->client_id(), |
248 stored_client_info_backup_->client_id); | 261 stored_client_info_backup_->client_id); |
249 EXPECT_EQ(kFakeInstallationDate, | 262 EXPECT_EQ(kFakeInstallationDate, |
250 stored_client_info_backup_->installation_date); | 263 stored_client_info_backup_->installation_date); |
251 EXPECT_EQ(prefs_.GetInt64(prefs::kMetricsReportingEnabledTimestamp), | 264 EXPECT_EQ(prefs_.GetInt64(prefs::kMetricsReportingEnabledTimestamp), |
252 stored_client_info_backup_->reporting_enabled_date); | 265 stored_client_info_backup_->reporting_enabled_date); |
| 266 } |
| 267 } |
253 | 268 |
254 previous_client_info = std::move(stored_client_info_backup_); | 269 TEST_F(MetricsStateManagerTest, LoadPrefs) { |
255 } | 270 ClientInfo client_info; |
| 271 client_info.client_id = "AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEF"; |
| 272 client_info.installation_date = 1112; |
| 273 client_info.reporting_enabled_date = 2223; |
| 274 SetClientInfoPrefs(client_info); |
256 | 275 |
257 EnableMetricsReporting(); | 276 EnableMetricsReporting(); |
258 | |
259 { | 277 { |
| 278 EXPECT_FALSE(fake_client_info_backup_); |
260 EXPECT_FALSE(stored_client_info_backup_); | 279 EXPECT_FALSE(stored_client_info_backup_); |
261 | 280 |
262 std::unique_ptr<MetricsStateManager> state_manager(CreateStateManager()); | 281 std::unique_ptr<MetricsStateManager> state_manager(CreateStateManager()); |
263 | 282 |
264 // client_id should be auto-obtained from the constructor when metrics | 283 // client_id should be auto-obtained from the constructor when metrics |
265 // reporting is enabled. | 284 // reporting is enabled. |
266 EXPECT_EQ(previous_client_info->client_id, state_manager->client_id()); | 285 EXPECT_EQ(client_info.client_id, state_manager->client_id()); |
267 | 286 |
268 // The backup should also be refreshed when the client id re-initialized. | 287 // The backup should not be modified. |
269 ASSERT_TRUE(stored_client_info_backup_); | 288 ASSERT_FALSE(stored_client_info_backup_); |
270 EXPECT_EQ(previous_client_info->client_id, | |
271 stored_client_info_backup_->client_id); | |
272 EXPECT_EQ(kFakeInstallationDate, | |
273 stored_client_info_backup_->installation_date); | |
274 EXPECT_EQ(previous_client_info->reporting_enabled_date, | |
275 stored_client_info_backup_->reporting_enabled_date); | |
276 | 289 |
277 // Re-forcing client id creation shouldn't cause another backup and | 290 // Re-forcing client id creation shouldn't cause another backup and |
278 // shouldn't affect the existing client id. | 291 // shouldn't affect the existing client id. |
279 stored_client_info_backup_.reset(); | |
280 state_manager->ForceClientIdCreation(); | 292 state_manager->ForceClientIdCreation(); |
281 EXPECT_FALSE(stored_client_info_backup_); | 293 EXPECT_FALSE(stored_client_info_backup_); |
282 EXPECT_EQ(previous_client_info->client_id, state_manager->client_id()); | 294 EXPECT_EQ(client_info.client_id, state_manager->client_id()); |
283 } | 295 } |
| 296 } |
284 | 297 |
285 const int64_t kBackupInstallationDate = 1111; | 298 TEST_F(MetricsStateManagerTest, PreferPrefs) { |
286 const int64_t kBackupReportingEnabledDate = 2222; | 299 ClientInfo client_info; |
287 const char kBackupClientId[] = "AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE"; | 300 client_info.client_id = "AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEF"; |
288 fake_client_info_backup_.reset(new ClientInfo); | 301 client_info.installation_date = 1112; |
289 fake_client_info_backup_->client_id = kBackupClientId; | 302 client_info.reporting_enabled_date = 2223; |
290 fake_client_info_backup_->installation_date = kBackupInstallationDate; | 303 SetClientInfoPrefs(client_info); |
291 fake_client_info_backup_->reporting_enabled_date = | |
292 kBackupReportingEnabledDate; | |
293 | 304 |
| 305 ClientInfo client_info2; |
| 306 client_info2.client_id = "AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE"; |
| 307 client_info2.installation_date = 1111; |
| 308 client_info2.reporting_enabled_date = 2222; |
| 309 SetFakeClientInfoBackup(client_info2); |
| 310 |
| 311 EnableMetricsReporting(); |
294 { | 312 { |
295 // The existence of a backup should result in the same behaviour as | 313 // The backup should be ignored if we already have a client id. |
296 // before if we already have a client id. | |
297 | 314 |
298 EXPECT_FALSE(stored_client_info_backup_); | 315 EXPECT_FALSE(stored_client_info_backup_); |
299 | 316 |
300 std::unique_ptr<MetricsStateManager> state_manager(CreateStateManager()); | 317 std::unique_ptr<MetricsStateManager> state_manager(CreateStateManager()); |
301 EXPECT_EQ(previous_client_info->client_id, state_manager->client_id()); | 318 EXPECT_EQ(client_info.client_id, state_manager->client_id()); |
302 | 319 |
303 // The backup should also be refreshed when the client id re-initialized. | 320 // The backup should not be modified. |
304 ASSERT_TRUE(stored_client_info_backup_); | 321 ASSERT_FALSE(stored_client_info_backup_); |
305 EXPECT_EQ(previous_client_info->client_id, | |
306 stored_client_info_backup_->client_id); | |
307 EXPECT_EQ(kFakeInstallationDate, | |
308 stored_client_info_backup_->installation_date); | |
309 EXPECT_EQ(previous_client_info->reporting_enabled_date, | |
310 stored_client_info_backup_->reporting_enabled_date); | |
311 stored_client_info_backup_.reset(); | |
312 } | 322 } |
| 323 } |
| 324 |
| 325 TEST_F(MetricsStateManagerTest, RestoreBackup) { |
| 326 ClientInfo client_info; |
| 327 client_info.client_id = "AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEF"; |
| 328 client_info.installation_date = 1112; |
| 329 client_info.reporting_enabled_date = 2223; |
| 330 SetClientInfoPrefs(client_info); |
| 331 |
| 332 ClientInfo client_info2; |
| 333 client_info2.client_id = "AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE"; |
| 334 client_info2.installation_date = 1111; |
| 335 client_info2.reporting_enabled_date = 2222; |
| 336 SetFakeClientInfoBackup(client_info2); |
313 | 337 |
314 prefs_.ClearPref(prefs::kMetricsClientID); | 338 prefs_.ClearPref(prefs::kMetricsClientID); |
315 prefs_.ClearPref(prefs::kMetricsReportingEnabledTimestamp); | 339 prefs_.ClearPref(prefs::kMetricsReportingEnabledTimestamp); |
316 | 340 |
| 341 EnableMetricsReporting(); |
317 { | 342 { |
318 // The backup should kick in if the client id has gone missing. It should | 343 // The backup should kick in if the client id has gone missing. It should |
319 // replace remaining and missing dates as well. | 344 // replace remaining and missing dates as well. |
320 | 345 |
321 EXPECT_FALSE(stored_client_info_backup_); | 346 EXPECT_FALSE(stored_client_info_backup_); |
322 | 347 |
323 std::unique_ptr<MetricsStateManager> state_manager(CreateStateManager()); | 348 std::unique_ptr<MetricsStateManager> state_manager(CreateStateManager()); |
324 EXPECT_EQ(kBackupClientId, state_manager->client_id()); | 349 EXPECT_EQ(client_info2.client_id, state_manager->client_id()); |
325 EXPECT_EQ(kBackupInstallationDate, prefs_.GetInt64(prefs::kInstallDate)); | 350 EXPECT_EQ(client_info2.installation_date, |
326 EXPECT_EQ(kBackupReportingEnabledDate, | 351 prefs_.GetInt64(prefs::kInstallDate)); |
| 352 EXPECT_EQ(client_info2.reporting_enabled_date, |
327 prefs_.GetInt64(prefs::kMetricsReportingEnabledTimestamp)); | 353 prefs_.GetInt64(prefs::kMetricsReportingEnabledTimestamp)); |
328 | 354 |
329 EXPECT_TRUE(stored_client_info_backup_); | 355 EXPECT_TRUE(stored_client_info_backup_); |
330 stored_client_info_backup_.reset(); | |
331 } | 356 } |
| 357 } |
332 | 358 |
333 const char kNoDashesBackupClientId[] = "AAAAAAAABBBBCCCCDDDDEEEEEEEEEEEE"; | 359 TEST_F(MetricsStateManagerTest, ResetBackup) { |
334 fake_client_info_backup_.reset(new ClientInfo); | 360 ClientInfo client_info; |
335 fake_client_info_backup_->client_id = kNoDashesBackupClientId; | 361 client_info.client_id = "AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE"; |
| 362 client_info.installation_date = 1111; |
| 363 client_info.reporting_enabled_date = 2222; |
336 | 364 |
337 prefs_.ClearPref(prefs::kInstallDate); | 365 SetFakeClientInfoBackup(client_info); |
338 prefs_.ClearPref(prefs::kMetricsClientID); | 366 SetClientInfoPrefs(client_info); |
339 prefs_.ClearPref(prefs::kMetricsReportingEnabledTimestamp); | |
340 | |
341 { | |
342 // When running the backup from old-style client ids, dashes should be | |
343 // re-added. And missing dates in backup should be replaced by Time::Now(). | |
344 | |
345 EXPECT_FALSE(stored_client_info_backup_); | |
346 | |
347 std::unique_ptr<MetricsStateManager> state_manager(CreateStateManager()); | |
348 EXPECT_EQ(kBackupClientId, state_manager->client_id()); | |
349 EXPECT_GE(prefs_.GetInt64(prefs::kInstallDate), test_begin_time); | |
350 EXPECT_GE(prefs_.GetInt64(prefs::kMetricsReportingEnabledTimestamp), | |
351 test_begin_time); | |
352 | |
353 EXPECT_TRUE(stored_client_info_backup_); | |
354 previous_client_info = std::move(stored_client_info_backup_); | |
355 } | |
356 | 367 |
357 prefs_.SetBoolean(prefs::kMetricsResetIds, true); | 368 prefs_.SetBoolean(prefs::kMetricsResetIds, true); |
358 | 369 |
| 370 EnableMetricsReporting(); |
359 { | 371 { |
360 // Upon request to reset metrics ids, the existing backup should not be | 372 // Upon request to reset metrics ids, the existing backup should not be |
361 // restored. | 373 // restored. |
362 | 374 |
363 EXPECT_FALSE(stored_client_info_backup_); | |
364 | |
365 std::unique_ptr<MetricsStateManager> state_manager(CreateStateManager()); | 375 std::unique_ptr<MetricsStateManager> state_manager(CreateStateManager()); |
366 | 376 |
367 // A brand new client id should have been generated. | 377 // A brand new client id should have been generated. |
368 EXPECT_NE(std::string(), state_manager->client_id()); | 378 EXPECT_NE(std::string(), state_manager->client_id()); |
369 EXPECT_NE(previous_client_info->client_id, state_manager->client_id()); | 379 EXPECT_NE(client_info.client_id, state_manager->client_id()); |
| 380 EXPECT_TRUE(stored_client_info_backup_); |
370 | 381 |
371 // The installation date should not have been affected. | 382 // The installation date should not have been affected. |
372 EXPECT_EQ(previous_client_info->installation_date, | 383 EXPECT_EQ(client_info.installation_date, |
373 prefs_.GetInt64(prefs::kInstallDate)); | 384 prefs_.GetInt64(prefs::kInstallDate)); |
374 | 385 |
375 // The metrics-reporting-enabled date will be reset to Now(). | 386 // The metrics-reporting-enabled date will be reset to Now(). |
376 EXPECT_GE(prefs_.GetInt64(prefs::kMetricsReportingEnabledTimestamp), | 387 EXPECT_GE(prefs_.GetInt64(prefs::kMetricsReportingEnabledTimestamp), |
377 previous_client_info->reporting_enabled_date); | 388 test_begin_time_); |
378 | |
379 stored_client_info_backup_.reset(); | |
380 } | 389 } |
381 } | 390 } |
382 | 391 |
383 } // namespace metrics | 392 } // namespace metrics |
OLD | NEW |