Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 <fcntl.h> | 5 #include <fcntl.h> |
| 6 #include <stdlib.h> | 6 #include <stdlib.h> |
| 7 #include <sys/file.h> | 7 #include <sys/file.h> |
| 8 #include <sys/stat.h> // mkdir | 8 #include <sys/stat.h> // mkdir |
| 9 #include <sys/types.h> // | 9 #include <sys/types.h> // |
| 10 #include <stdio.h> // perror | 10 #include <stdio.h> // perror |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 28 #include "testing/gtest/include/gtest/gtest.h" | 28 #include "testing/gtest/include/gtest/gtest.h" |
| 29 | 29 |
| 30 namespace chromecast { | 30 namespace chromecast { |
| 31 namespace { | 31 namespace { |
| 32 | 32 |
| 33 const char kLockfileName[] = "lockfile"; | 33 const char kLockfileName[] = "lockfile"; |
| 34 const char kMetadataName[] = "metadata"; | 34 const char kMetadataName[] = "metadata"; |
| 35 const char kMinidumpSubdir[] = "minidumps"; | 35 const char kMinidumpSubdir[] = "minidumps"; |
| 36 | 36 |
| 37 // A trivial implementation of SynchronizedMinidumpManager, which does no work | 37 // A trivial implementation of SynchronizedMinidumpManager, which does no work |
| 38 // to the | 38 // to the minidump and exposes its protected members for testing. This simply |
| 39 // minidump and exposes its protected members for testing. | 39 // adds an entry to the lockfile. |
| 40 class SynchronizedMinidumpManagerSimple : public SynchronizedMinidumpManager { | 40 class SynchronizedMinidumpManagerSimple : public SynchronizedMinidumpManager { |
| 41 public: | 41 public: |
| 42 SynchronizedMinidumpManagerSimple() | 42 SynchronizedMinidumpManagerSimple() |
| 43 : SynchronizedMinidumpManager(), | 43 : SynchronizedMinidumpManager(), |
| 44 work_done_(false), | 44 work_done_(false), |
| 45 add_entry_return_code_(-1), | 45 add_entry_return_code_(-1), |
| 46 lockfile_path_(dump_path_.Append(kLockfileName).value()) {} | 46 lockfile_path_(dump_path_.Append(kLockfileName).value()) {} |
| 47 ~SynchronizedMinidumpManagerSimple() override {} | 47 ~SynchronizedMinidumpManagerSimple() override {} |
| 48 | 48 |
| 49 void SetDumpInfoToWrite(scoped_ptr<DumpInfo> dump_info) { | 49 void SetDumpInfoToWrite(scoped_ptr<DumpInfo> dump_info) { |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 70 bool work_done_; | 70 bool work_done_; |
| 71 int add_entry_return_code_; | 71 int add_entry_return_code_; |
| 72 std::string lockfile_path_; | 72 std::string lockfile_path_; |
| 73 scoped_ptr<DumpInfo> dump_info_; | 73 scoped_ptr<DumpInfo> dump_info_; |
| 74 }; | 74 }; |
| 75 | 75 |
| 76 void DoWorkLockedTask(SynchronizedMinidumpManagerSimple* manager) { | 76 void DoWorkLockedTask(SynchronizedMinidumpManagerSimple* manager) { |
| 77 manager->DoWorkLocked(); | 77 manager->DoWorkLocked(); |
| 78 } | 78 } |
| 79 | 79 |
| 80 // Simple SynchronizedMinidumpManager consumer. Checks if a dump can be uploaded | |
| 81 // then removes it from the lockfile. | |
| 82 class SynchronizedMinidumpManagerUploader : public SynchronizedMinidumpManager { | |
|
slan
2015/09/09 19:08:11
Please rename to SynchronizedMinidumpManagerConsum
bcf_google
2015/09/09 21:20:29
Done.
| |
| 83 public: | |
| 84 SynchronizedMinidumpManagerUploader() | |
| 85 : SynchronizedMinidumpManager(), | |
| 86 can_upload_return_val_(false), | |
| 87 lockfile_path_(dump_path_.Append(kLockfileName).value()) {} | |
| 88 ~SynchronizedMinidumpManagerUploader() override {} | |
| 89 | |
| 90 int DoWorkLocked() { return AcquireLockAndDoWork(); } | |
| 91 | |
| 92 // SynchronizedMinidumpManager implementation: | |
| 93 int DoWork() override { | |
| 94 can_upload_return_val_ = CanUploadDump(); | |
| 95 | |
| 96 if (RemoveEntryFromLockFile(0) < 0) | |
| 97 return -1; | |
| 98 | |
| 99 if (IncrementRatelimitPeriodDumps() < 0) | |
| 100 return -1; | |
| 101 | |
| 102 return 0; | |
| 103 } | |
| 104 | |
| 105 // Accessors for testing. | |
| 106 const std::string& dump_path() { return dump_path_.value(); } | |
|
slan
2015/09/09 19:08:11
I don't see these methods called?
bcf_google
2015/09/09 21:20:29
Okay they were removed.
| |
| 107 const std::string& lockfile_path() { return lockfile_path_; } | |
| 108 bool can_upload_return_val() { return can_upload_return_val_; } | |
| 109 | |
| 110 private: | |
| 111 bool can_upload_return_val_; | |
| 112 std::string lockfile_path_; | |
| 113 }; | |
| 114 | |
| 80 class SleepySynchronizedMinidumpManagerSimple | 115 class SleepySynchronizedMinidumpManagerSimple |
| 81 : public SynchronizedMinidumpManagerSimple { | 116 : public SynchronizedMinidumpManagerSimple { |
| 82 public: | 117 public: |
| 83 SleepySynchronizedMinidumpManagerSimple(int sleep_duration_ms) | 118 SleepySynchronizedMinidumpManagerSimple(int sleep_duration_ms) |
| 84 : SynchronizedMinidumpManagerSimple(), | 119 : SynchronizedMinidumpManagerSimple(), |
| 85 sleep_duration_ms_(sleep_duration_ms) {} | 120 sleep_duration_ms_(sleep_duration_ms) {} |
| 86 ~SleepySynchronizedMinidumpManagerSimple() override {} | 121 ~SleepySynchronizedMinidumpManagerSimple() override {} |
| 87 | 122 |
| 88 // SynchronizedMinidumpManager implementation: | 123 // SynchronizedMinidumpManager implementation: |
| 89 int DoWork() override { | 124 int DoWork() override { |
| (...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 376 EXPECT_EQ(0, manager.DoWorkLocked()); | 411 EXPECT_EQ(0, manager.DoWorkLocked()); |
| 377 EXPECT_EQ(0, manager.add_entry_return_code()); | 412 EXPECT_EQ(0, manager.add_entry_return_code()); |
| 378 EXPECT_TRUE(manager.work_done()); | 413 EXPECT_TRUE(manager.work_done()); |
| 379 | 414 |
| 380 // Test that both entries were logged. | 415 // Test that both entries were logged. |
| 381 ScopedVector<DumpInfo> dumps; | 416 ScopedVector<DumpInfo> dumps; |
| 382 ASSERT_TRUE(FetchDumps(lockfile_.value(), &dumps)); | 417 ASSERT_TRUE(FetchDumps(lockfile_.value(), &dumps)); |
| 383 EXPECT_EQ(2u, dumps.size()); | 418 EXPECT_EQ(2u, dumps.size()); |
| 384 } | 419 } |
| 385 | 420 |
| 386 TEST_F(SynchronizedMinidumpManagerTest, | 421 TEST_F(SynchronizedMinidumpManagerTest, |
|
slan
2015/09/09 19:08:11
I know that this test was like this before this ch
bcf_google
2015/09/09 21:20:29
How does this look?
| |
| 387 AddEntryFailsWhenTooManyRecentDumpsPresent) { | 422 CanUploadFailsWhenRatelimitPeriodExceeded) { |
| 388 // Sample parameters. | 423 // Sample parameters. |
| 389 time_t now = time(0); | 424 time_t now = time(0); |
| 390 MinidumpParams params; | 425 MinidumpParams params; |
| 391 params.process_name = "process"; | 426 params.process_name = "process"; |
| 392 | 427 |
| 393 SynchronizedMinidumpManagerSimple manager; | 428 SynchronizedMinidumpManagerSimple producer; |
| 394 manager.SetDumpInfoToWrite( | 429 SynchronizedMinidumpManagerUploader uploader; |
| 395 make_scoped_ptr(new DumpInfo("dump1", "log1", now, params))); | 430 producer.SetDumpInfoToWrite( |
| 396 | |
| 397 for (int i = 0; i < SynchronizedMinidumpManager::kMaxLockfileDumps; ++i) { | |
| 398 // Adding these should succeed | |
| 399 ASSERT_EQ(0, manager.DoWorkLocked()); | |
| 400 ASSERT_EQ(0, manager.add_entry_return_code()); | |
| 401 } | |
| 402 | |
| 403 ASSERT_EQ(0, manager.DoWorkLocked()); | |
| 404 | |
| 405 // This one should fail | |
| 406 ASSERT_GT(0, manager.add_entry_return_code()); | |
| 407 } | |
| 408 | |
| 409 TEST_F(SynchronizedMinidumpManagerTest, | |
| 410 AddEntryFailsWhenRatelimitPeriodExceeded) { | |
| 411 // Sample parameters. | |
| 412 time_t now = time(0); | |
| 413 MinidumpParams params; | |
| 414 params.process_name = "process"; | |
| 415 | |
| 416 SynchronizedMinidumpManagerSimple manager; | |
| 417 manager.SetDumpInfoToWrite( | |
| 418 make_scoped_ptr(new DumpInfo("dump1", "log1", now, params))); | 431 make_scoped_ptr(new DumpInfo("dump1", "log1", now, params))); |
| 419 | 432 |
| 420 // Multiple iters to make sure period resets work correctly | 433 // Multiple iters to make sure period resets work correctly |
| 421 for (int iter = 0; iter < 3; ++iter) { | 434 for (int iter = 0; iter < 3; ++iter) { |
| 422 time_t now = time(nullptr); | 435 time_t now = time(nullptr); |
| 423 | 436 |
| 424 // Write dump logs to the lockfile. | 437 // Write dump logs to the lockfile. |
| 425 size_t too_many_recent_dumps = | 438 size_t too_many_recent_dumps = |
| 426 SynchronizedMinidumpManager::kRatelimitPeriodMaxDumps; | 439 SynchronizedMinidumpManager::kRatelimitPeriodMaxDumps; |
| 427 for (size_t i = 0; i < too_many_recent_dumps; ++i) { | 440 for (size_t i = 0; i < too_many_recent_dumps; ++i) { |
| 428 // Adding these should succeed | 441 // Uploading these should succeed |
| 429 ASSERT_EQ(0, manager.DoWorkLocked()); | 442 ASSERT_EQ(0, producer.DoWorkLocked()); |
| 430 ASSERT_EQ(0, manager.add_entry_return_code()); | 443 ASSERT_EQ(0, producer.add_entry_return_code()); |
| 431 | 444 |
| 432 // Clear dumps so we don't reach max dumps in lockfile | 445 ASSERT_EQ(0, uploader.DoWorkLocked()); |
| 433 ASSERT_TRUE(ClearDumps(lockfile_.value())); | 446 ASSERT_EQ(true, uploader.can_upload_return_val()); |
| 434 } | 447 } |
| 435 | 448 |
| 436 ASSERT_EQ(0, manager.DoWorkLocked()); | 449 ASSERT_EQ(0, producer.DoWorkLocked()); |
| 450 ASSERT_EQ(0, producer.add_entry_return_code()); | |
| 451 | |
| 437 // Should fail with too many dumps | 452 // Should fail with too many dumps |
| 438 ASSERT_GT(0, manager.add_entry_return_code()); | 453 ASSERT_EQ(0, uploader.DoWorkLocked()); |
| 454 ASSERT_EQ(false, uploader.can_upload_return_val()); | |
| 439 | 455 |
| 440 int64 period = SynchronizedMinidumpManager::kRatelimitPeriodSeconds; | 456 int64 period = SynchronizedMinidumpManager::kRatelimitPeriodSeconds; |
| 441 | 457 |
| 458 ASSERT_EQ(0, producer.DoWorkLocked()); | |
| 459 ASSERT_EQ(0, producer.add_entry_return_code()); | |
| 460 | |
| 442 // Half period shouldn't trigger reset | 461 // Half period shouldn't trigger reset |
| 443 SetRatelimitPeriodStart(metadata_.value(), now - period / 2); | 462 SetRatelimitPeriodStart(metadata_.value(), now - period / 2); |
| 444 ASSERT_EQ(0, manager.DoWorkLocked()); | 463 ASSERT_EQ(0, uploader.DoWorkLocked()); |
| 445 ASSERT_GT(0, manager.add_entry_return_code()); | 464 ASSERT_EQ(false, uploader.can_upload_return_val()); |
| 446 | 465 |
| 447 // Set period starting time to trigger a reset | 466 // Set period starting time to trigger a reset |
| 448 SetRatelimitPeriodStart(metadata_.value(), now - period); | 467 SetRatelimitPeriodStart(metadata_.value(), now - period); |
| 449 } | 468 } |
| 450 | 469 |
| 451 ASSERT_EQ(0, manager.DoWorkLocked()); | 470 ASSERT_EQ(0, producer.DoWorkLocked()); |
| 452 ASSERT_EQ(0, manager.add_entry_return_code()); | 471 ASSERT_EQ(0, producer.add_entry_return_code()); |
| 472 | |
| 473 ASSERT_EQ(0, uploader.DoWorkLocked()); | |
| 474 ASSERT_EQ(true, uploader.can_upload_return_val()); | |
| 453 } | 475 } |
| 454 | 476 |
| 455 } // namespace chromecast | 477 } // namespace chromecast |
| OLD | NEW |