| Index: chromecast/crash/linux/synchronized_minidump_manager_unittest.cc
|
| diff --git a/chromecast/crash/linux/synchronized_minidump_manager_unittest.cc b/chromecast/crash/linux/synchronized_minidump_manager_unittest.cc
|
| index 94dabd611d9088a795f50a8740ca68ca71c3298b..d65a96840cb8fb3ac84ecb682fdf41a5e2ff0a29 100644
|
| --- a/chromecast/crash/linux/synchronized_minidump_manager_unittest.cc
|
| +++ b/chromecast/crash/linux/synchronized_minidump_manager_unittest.cc
|
| @@ -35,8 +35,8 @@ const char kMetadataName[] = "metadata";
|
| const char kMinidumpSubdir[] = "minidumps";
|
|
|
| // A trivial implementation of SynchronizedMinidumpManager, which does no work
|
| -// to the
|
| -// minidump and exposes its protected members for testing.
|
| +// to the minidump and exposes its protected members for testing. This simply
|
| +// adds an entry to the lockfile.
|
| class SynchronizedMinidumpManagerSimple : public SynchronizedMinidumpManager {
|
| public:
|
| SynchronizedMinidumpManagerSimple()
|
| @@ -77,6 +77,36 @@ void DoWorkLockedTask(SynchronizedMinidumpManagerSimple* manager) {
|
| manager->DoWorkLocked();
|
| }
|
|
|
| +// Simple SynchronizedMinidumpManager consumer. Checks if a dump can be uploaded
|
| +// then removes it from the lockfile.
|
| +class FakeSynchronizedMinidumpUploader : public SynchronizedMinidumpManager {
|
| + public:
|
| + FakeSynchronizedMinidumpUploader()
|
| + : SynchronizedMinidumpManager(), can_upload_return_val_(false) {}
|
| + ~FakeSynchronizedMinidumpUploader() override {}
|
| +
|
| + int DoWorkLocked() { return AcquireLockAndDoWork(); }
|
| +
|
| + // SynchronizedMinidumpManager implementation:
|
| + int DoWork() override {
|
| + can_upload_return_val_ = CanUploadDump();
|
| +
|
| + if (RemoveEntryFromLockFile(0) < 0)
|
| + return -1;
|
| +
|
| + if (IncrementNumDumpsInCurrentPeriod() < 0)
|
| + return -1;
|
| +
|
| + return 0;
|
| + }
|
| +
|
| + // Accessors for testing.
|
| + bool can_upload_return_val() { return can_upload_return_val_; }
|
| +
|
| + private:
|
| + bool can_upload_return_val_;
|
| +};
|
| +
|
| class SleepySynchronizedMinidumpManagerSimple
|
| : public SynchronizedMinidumpManagerSimple {
|
| public:
|
| @@ -138,6 +168,23 @@ class SynchronizedMinidumpManagerTest : public testing::Test {
|
| scoped_ptr<base::ScopedPathOverride> path_override_;
|
| };
|
|
|
| +// Have |producer| generate |num_dumps| while checking there are no errors.
|
| +void produce_dumps(SynchronizedMinidumpManagerSimple& producer, int num_dumps) {
|
| + for (int i = 0; i < num_dumps; ++i) {
|
| + ASSERT_EQ(0, producer.DoWorkLocked());
|
| + ASSERT_EQ(0, producer.add_entry_return_code());
|
| + }
|
| +}
|
| +
|
| +// Have |consumer| remove and process |num_dumps| while checking there are no
|
| +// errors.
|
| +void consume_dumps(FakeSynchronizedMinidumpUploader& consumer, int num_dumps) {
|
| + for (int i = 0; i < num_dumps; ++i) {
|
| + ASSERT_EQ(0, consumer.DoWorkLocked());
|
| + ASSERT_EQ(true, consumer.can_upload_return_val());
|
| + }
|
| +}
|
| +
|
| } // namespace
|
|
|
| TEST_F(SynchronizedMinidumpManagerTest, FilePathsAreCorrect) {
|
| @@ -384,72 +431,78 @@ TEST_F(SynchronizedMinidumpManagerTest,
|
| }
|
|
|
| TEST_F(SynchronizedMinidumpManagerTest,
|
| - AddEntryFailsWhenTooManyRecentDumpsPresent) {
|
| + Upload_SucceedsWhenDumpLimitsNotExceeded) {
|
| // Sample parameters.
|
| time_t now = time(0);
|
| MinidumpParams params;
|
| params.process_name = "process";
|
|
|
| - SynchronizedMinidumpManagerSimple manager;
|
| - manager.SetDumpInfoToWrite(
|
| + FakeSynchronizedMinidumpUploader uploader;
|
| + SynchronizedMinidumpManagerSimple producer;
|
| + producer.SetDumpInfoToWrite(
|
| make_scoped_ptr(new DumpInfo("dump1", "log1", now, params)));
|
|
|
| - for (int i = 0; i < SynchronizedMinidumpManager::kMaxLockfileDumps; ++i) {
|
| - // Adding these should succeed
|
| - ASSERT_EQ(0, manager.DoWorkLocked());
|
| - ASSERT_EQ(0, manager.add_entry_return_code());
|
| - }
|
| + const int max_dumps = SynchronizedMinidumpManager::kRatelimitPeriodMaxDumps;
|
| + produce_dumps(producer, max_dumps);
|
| + consume_dumps(uploader, max_dumps);
|
| +}
|
|
|
| - ASSERT_EQ(0, manager.DoWorkLocked());
|
| +TEST_F(SynchronizedMinidumpManagerTest, Upload_FailsWhenTooManyRecentDumps) {
|
| + // Sample parameters.
|
| + time_t now = time(0);
|
| + MinidumpParams params;
|
| + params.process_name = "process";
|
| +
|
| + FakeSynchronizedMinidumpUploader uploader;
|
| + SynchronizedMinidumpManagerSimple producer;
|
| + producer.SetDumpInfoToWrite(
|
| + make_scoped_ptr(new DumpInfo("dump1", "log1", now, params)));
|
|
|
| - // This one should fail
|
| - ASSERT_GT(0, manager.add_entry_return_code());
|
| + const int max_dumps = SynchronizedMinidumpManager::kRatelimitPeriodMaxDumps;
|
| + produce_dumps(producer, max_dumps + 1);
|
| + consume_dumps(uploader, max_dumps);
|
| +
|
| + // Should fail with too many dumps
|
| + ASSERT_EQ(0, uploader.DoWorkLocked());
|
| + ASSERT_EQ(false, uploader.can_upload_return_val());
|
| }
|
|
|
| -TEST_F(SynchronizedMinidumpManagerTest,
|
| - AddEntryFailsWhenRatelimitPeriodExceeded) {
|
| +TEST_F(SynchronizedMinidumpManagerTest, UploadSucceedsAfterRateLimitPeriodEnd) {
|
| // Sample parameters.
|
| time_t now = time(0);
|
| MinidumpParams params;
|
| params.process_name = "process";
|
|
|
| - SynchronizedMinidumpManagerSimple manager;
|
| - manager.SetDumpInfoToWrite(
|
| + FakeSynchronizedMinidumpUploader uploader;
|
| + SynchronizedMinidumpManagerSimple producer;
|
| + producer.SetDumpInfoToWrite(
|
| make_scoped_ptr(new DumpInfo("dump1", "log1", now, params)));
|
|
|
| - // Multiple iters to make sure period resets work correctly
|
| - for (int iter = 0; iter < 3; ++iter) {
|
| - time_t now = time(nullptr);
|
| -
|
| - // Write dump logs to the lockfile.
|
| - size_t too_many_recent_dumps =
|
| - SynchronizedMinidumpManager::kRatelimitPeriodMaxDumps;
|
| - for (size_t i = 0; i < too_many_recent_dumps; ++i) {
|
| - // Adding these should succeed
|
| - ASSERT_EQ(0, manager.DoWorkLocked());
|
| - ASSERT_EQ(0, manager.add_entry_return_code());
|
| + const int iters = 3;
|
| + const int max_dumps = SynchronizedMinidumpManager::kRatelimitPeriodMaxDumps;
|
|
|
| - // Clear dumps so we don't reach max dumps in lockfile
|
| - ASSERT_TRUE(ClearDumps(lockfile_.value()));
|
| - }
|
| + for (int i = 0; i < iters; ++i) {
|
| + produce_dumps(producer, max_dumps + 1);
|
| + consume_dumps(uploader, max_dumps);
|
|
|
| - ASSERT_EQ(0, manager.DoWorkLocked());
|
| // Should fail with too many dumps
|
| - ASSERT_GT(0, manager.add_entry_return_code());
|
| + ASSERT_EQ(0, uploader.DoWorkLocked());
|
| + ASSERT_EQ(false, uploader.can_upload_return_val());
|
|
|
| int64 period = SynchronizedMinidumpManager::kRatelimitPeriodSeconds;
|
|
|
| // Half period shouldn't trigger reset
|
| + produce_dumps(producer, 1);
|
| SetRatelimitPeriodStart(metadata_.value(), now - period / 2);
|
| - ASSERT_EQ(0, manager.DoWorkLocked());
|
| - ASSERT_GT(0, manager.add_entry_return_code());
|
| + ASSERT_EQ(0, uploader.DoWorkLocked());
|
| + ASSERT_EQ(false, uploader.can_upload_return_val());
|
|
|
| // Set period starting time to trigger a reset
|
| SetRatelimitPeriodStart(metadata_.value(), now - period);
|
| }
|
|
|
| - ASSERT_EQ(0, manager.DoWorkLocked());
|
| - ASSERT_EQ(0, manager.add_entry_return_code());
|
| + produce_dumps(producer, 1);
|
| + consume_dumps(uploader, 1);
|
| }
|
|
|
| } // namespace chromecast
|
|
|