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 5fa5a79b7e00994fd97548ebe26da9c6d45b69e2..fa3e22c79c9088f2a4ea450be7d82bde7902e2f2 100644 |
--- a/chromecast/crash/linux/synchronized_minidump_manager_unittest.cc |
+++ b/chromecast/crash/linux/synchronized_minidump_manager_unittest.cc |
@@ -48,7 +48,7 @@ class SynchronizedMinidumpManagerSimple : public SynchronizedMinidumpManager { |
SynchronizedMinidumpManagerSimple() |
: SynchronizedMinidumpManager(), |
work_done_(false), |
- add_entry_return_code_(-1), |
+ add_entry_return_code_(false), |
lockfile_path_(dump_path_.Append(kLockfileName).value()) {} |
~SynchronizedMinidumpManagerSimple() override {} |
@@ -56,14 +56,14 @@ class SynchronizedMinidumpManagerSimple : public SynchronizedMinidumpManager { |
dump_info_ = std::move(dump_info); |
} |
- int DoWorkLocked() { return AcquireLockAndDoWork(); } |
+ bool DoWorkLocked() { return AcquireLockAndDoWork(); } |
// SynchronizedMinidumpManager implementation: |
- int DoWork() override { |
+ bool DoWork() override { |
if (dump_info_) |
add_entry_return_code_ = AddEntryToLockFile(*dump_info_); |
work_done_ = true; |
- return 0; |
+ return true; |
} |
// Accessors for testing. |
@@ -71,11 +71,11 @@ class SynchronizedMinidumpManagerSimple : public SynchronizedMinidumpManager { |
const std::string& dump_path() { return dump_path_.value(); } |
const std::string& lockfile_path() { return lockfile_path_; } |
bool work_done() { return work_done_; } |
- int add_entry_return_code() { return add_entry_return_code_; } |
+ bool add_entry_return_code() { return add_entry_return_code_; } |
private: |
bool work_done_; |
- int add_entry_return_code_; |
+ bool add_entry_return_code_; |
std::string lockfile_path_; |
std::unique_ptr<DumpInfo> dump_info_; |
}; |
@@ -92,19 +92,19 @@ class FakeSynchronizedMinidumpUploader : public SynchronizedMinidumpManager { |
: SynchronizedMinidumpManager(), can_upload_return_val_(false) {} |
~FakeSynchronizedMinidumpUploader() override {} |
- int DoWorkLocked() { return AcquireLockAndDoWork(); } |
+ bool DoWorkLocked() { return AcquireLockAndDoWork(); } |
// SynchronizedMinidumpManager implementation: |
- int DoWork() override { |
+ bool DoWork() override { |
can_upload_return_val_ = CanUploadDump(); |
- if (RemoveEntryFromLockFile(0) < 0) |
- return -1; |
+ if (!RemoveEntryFromLockFile(0)) |
+ return false; |
- if (IncrementNumDumpsInCurrentPeriod() < 0) |
- return -1; |
+ if (!IncrementNumDumpsInCurrentPeriod()) |
+ return false; |
- return 0; |
+ return true; |
} |
// Accessors for testing. |
@@ -124,7 +124,7 @@ class SleepySynchronizedMinidumpManagerSimple |
~SleepySynchronizedMinidumpManagerSimple() override {} |
// SynchronizedMinidumpManager implementation: |
- int DoWork() override { |
+ bool DoWork() override { |
// The lock has been acquired. Fall asleep for |kSleepDurationMs|, then |
// write the file. |
base::PlatformThread::Sleep( |
@@ -174,8 +174,8 @@ class SynchronizedMinidumpManagerTest : public testing::Test { |
// 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()); |
+ ASSERT_TRUE(producer.DoWorkLocked()); |
+ ASSERT_TRUE(producer.add_entry_return_code()); |
} |
} |
@@ -183,7 +183,7 @@ void produce_dumps(SynchronizedMinidumpManagerSimple& producer, int num_dumps) { |
// errors. |
void consume_dumps(FakeSynchronizedMinidumpUploader& consumer, int num_dumps) { |
for (int i = 0; i < num_dumps; ++i) { |
- ASSERT_EQ(0, consumer.DoWorkLocked()); |
+ ASSERT_TRUE(consumer.DoWorkLocked()); |
ASSERT_TRUE(consumer.can_upload_return_val()); |
} |
} |
@@ -204,7 +204,7 @@ TEST_F(SynchronizedMinidumpManagerTest, AcquireLockOnNonExistentDirectory) { |
ASSERT_FALSE(base::PathExists(minidump_dir_)); |
SynchronizedMinidumpManagerSimple manager; |
- ASSERT_EQ(0, manager.DoWorkLocked()); |
+ ASSERT_TRUE(manager.DoWorkLocked()); |
ASSERT_TRUE(manager.work_done()); |
// Verify the directory and the lockfile both exist. |
@@ -218,7 +218,7 @@ TEST_F(SynchronizedMinidumpManagerTest, AcquireLockOnExistingEmptyDirectory) { |
ASSERT_FALSE(base::PathExists(lockfile_)); |
SynchronizedMinidumpManagerSimple manager; |
- ASSERT_EQ(0, manager.DoWorkLocked()); |
+ ASSERT_TRUE(manager.DoWorkLocked()); |
ASSERT_TRUE(manager.work_done()); |
// Verify the directory and the lockfile both exist. |
@@ -229,7 +229,7 @@ TEST_F(SynchronizedMinidumpManagerTest, AcquireLockOnExistingEmptyDirectory) { |
TEST_F(SynchronizedMinidumpManagerTest, |
AcquireLockOnExistingDirectoryWithLockfile) { |
SynchronizedMinidumpManagerSimple manager; |
- ASSERT_EQ(0, manager.DoWorkLocked()); |
+ ASSERT_TRUE(manager.DoWorkLocked()); |
ASSERT_TRUE(manager.work_done()); |
// Verify the directory and the lockfile both exist. |
@@ -245,8 +245,8 @@ TEST_F(SynchronizedMinidumpManagerTest, |
// Test that the manager tried to log the entry and failed. |
SynchronizedMinidumpManagerSimple manager; |
manager.SetDumpInfoToWrite(base::WrapUnique(new DumpInfo(&val))); |
- ASSERT_EQ(0, manager.DoWorkLocked()); |
- ASSERT_EQ(-1, manager.add_entry_return_code()); |
+ ASSERT_TRUE(manager.DoWorkLocked()); |
+ ASSERT_FALSE(manager.add_entry_return_code()); |
// Verify the lockfile is untouched. |
ScopedVector<DumpInfo> dumps; |
@@ -257,7 +257,7 @@ TEST_F(SynchronizedMinidumpManagerTest, |
TEST_F(SynchronizedMinidumpManagerTest, |
AddEntryToLockFile_SucceedsWithValidEntries) { |
// Sample parameters. |
- time_t now = time(0); |
+ base::Time now = base::Time::Now(); |
MinidumpParams params; |
params.process_name = "process"; |
@@ -265,8 +265,8 @@ TEST_F(SynchronizedMinidumpManagerTest, |
SynchronizedMinidumpManagerSimple manager; |
manager.SetDumpInfoToWrite( |
base::WrapUnique(new DumpInfo("dump1", "log1", now, params))); |
- ASSERT_EQ(0, manager.DoWorkLocked()); |
- ASSERT_EQ(0, manager.add_entry_return_code()); |
+ ASSERT_TRUE(manager.DoWorkLocked()); |
+ ASSERT_TRUE(manager.add_entry_return_code()); |
// Test that the manager was successful in logging the entry. |
ScopedVector<DumpInfo> dumps; |
@@ -276,39 +276,17 @@ TEST_F(SynchronizedMinidumpManagerTest, |
// Write the second entry. |
manager.SetDumpInfoToWrite( |
base::WrapUnique(new DumpInfo("dump2", "log2", now, params))); |
- ASSERT_EQ(0, manager.DoWorkLocked()); |
- ASSERT_EQ(0, manager.add_entry_return_code()); |
+ ASSERT_TRUE(manager.DoWorkLocked()); |
+ ASSERT_TRUE(manager.add_entry_return_code()); |
// Test that the second entry is also valid. |
ASSERT_TRUE(FetchDumps(lockfile_.value(), &dumps)); |
ASSERT_EQ(2u, dumps.size()); |
} |
-TEST_F(SynchronizedMinidumpManagerTest, |
- AcquireLockFile_FailsWhenNonBlockingAndFileLocked) { |
- ASSERT_TRUE(CreateFiles(lockfile_.value(), metadata_.value())); |
- // Lock the lockfile here. Note that the Chromium base::File tools permit |
- // multiple locks on the same process to succeed, so we must use POSIX system |
- // calls to accomplish this. |
- int fd = open(lockfile_.value().c_str(), O_RDWR | O_CREAT, 0660); |
- ASSERT_GE(fd, 0); |
- ASSERT_EQ(0, flock(fd, LOCK_EX)); |
- |
- SynchronizedMinidumpManagerSimple manager; |
- manager.set_non_blocking(true); |
- ASSERT_EQ(-1, manager.DoWorkLocked()); |
- ASSERT_FALSE(manager.work_done()); |
- |
- // Test that the manager was not able to log the crash dump. |
- ScopedVector<DumpInfo> dumps; |
- ASSERT_TRUE(FetchDumps(lockfile_.value(), &dumps)); |
- ASSERT_EQ(0u, dumps.size()); |
-} |
- |
-TEST_F(SynchronizedMinidumpManagerTest, |
- AcquireLockFile_WaitsForOtherThreadWhenBlocking) { |
+TEST_F(SynchronizedMinidumpManagerTest, AcquireLockFile_WaitsForOtherThread) { |
// Create some parameters for a minidump. |
- time_t now = time(0); |
+ base::Time now = base::Time::Now(); |
MinidumpParams params; |
params.process_name = "process"; |
@@ -337,14 +315,13 @@ TEST_F(SynchronizedMinidumpManagerTest, |
SynchronizedMinidumpManagerSimple manager; |
manager.SetDumpInfoToWrite( |
base::WrapUnique(new DumpInfo("dump", "log", now, params))); |
- manager.set_non_blocking(false); |
- EXPECT_EQ(0, manager.DoWorkLocked()); |
- EXPECT_EQ(0, manager.add_entry_return_code()); |
+ EXPECT_TRUE(manager.DoWorkLocked()); |
+ EXPECT_TRUE(manager.add_entry_return_code()); |
EXPECT_TRUE(manager.work_done()); |
// Check that the other manager was also successful. |
- EXPECT_EQ(0, sleepy_manager.add_entry_return_code()); |
+ EXPECT_TRUE(sleepy_manager.add_entry_return_code()); |
EXPECT_TRUE(sleepy_manager.work_done()); |
// Test that both entries were logged. |
@@ -357,41 +334,9 @@ TEST_F(SynchronizedMinidumpManagerTest, |
// of all tests in this thread. Figure out how to lock the file more cleanly |
// from another process. |
TEST_F(SynchronizedMinidumpManagerTest, |
- DISABLED_AcquireLockFile_FailsWhenNonBlockingAndLockedFromOtherProcess) { |
- // Fork the process. |
- pid_t pid = base::ForkWithFlags(0u, nullptr, nullptr); |
- if (pid != 0) { |
- // The child process should instantiate a manager which immediately grabs |
- // the lock, and falls aleep for some period of time, then writes a dump, |
- // and finally releases the lock. |
- SleepySynchronizedMinidumpManagerSimple sleepy_manager(100); |
- ASSERT_EQ(0, sleepy_manager.DoWorkLocked()); |
- ASSERT_TRUE(sleepy_manager.work_done()); |
- return; |
- } |
- |
- // Meanwhile, this process should wait brielfy to allow the other thread to |
- // grab the lock. |
- base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(50)); |
- |
- SynchronizedMinidumpManagerSimple manager; |
- manager.set_non_blocking(true); |
- ASSERT_EQ(-1, manager.DoWorkLocked()); |
- ASSERT_FALSE(manager.work_done()); |
- |
- // Test that the manager was not able to log the crash dump. |
- ScopedVector<DumpInfo> dumps; |
- ASSERT_TRUE(FetchDumps(lockfile_.value(), &dumps)); |
- ASSERT_EQ(0u, dumps.size()); |
-} |
- |
-// TODO(slan): These tests are passing but forking them is creating duplicates |
-// of all tests in this thread. Figure out how to lock the file more cleanly |
-// from another process. |
-TEST_F(SynchronizedMinidumpManagerTest, |
- DISABLED_AcquireLockFile_WaitsForOtherProcessWhenBlocking) { |
+ DISABLED_AcquireLockFile_WaitsForOtherProcess) { |
// Create some parameters for a minidump. |
- time_t now = time(0); |
+ base::Time now = base::Time::Now(); |
MinidumpParams params; |
params.process_name = "process"; |
@@ -404,7 +349,7 @@ TEST_F(SynchronizedMinidumpManagerTest, |
SleepySynchronizedMinidumpManagerSimple sleepy_manager(100); |
sleepy_manager.SetDumpInfoToWrite( |
base::WrapUnique(new DumpInfo("dump", "log", now, params))); |
- ASSERT_EQ(0, sleepy_manager.DoWorkLocked()); |
+ ASSERT_TRUE(sleepy_manager.DoWorkLocked()); |
ASSERT_TRUE(sleepy_manager.work_done()); |
return; |
} |
@@ -421,10 +366,9 @@ TEST_F(SynchronizedMinidumpManagerTest, |
SynchronizedMinidumpManagerSimple manager; |
manager.SetDumpInfoToWrite( |
base::WrapUnique(new DumpInfo("dump", "log", now, params))); |
- manager.set_non_blocking(false); |
- EXPECT_EQ(0, manager.DoWorkLocked()); |
- EXPECT_EQ(0, manager.add_entry_return_code()); |
+ EXPECT_TRUE(manager.DoWorkLocked()); |
+ EXPECT_TRUE(manager.add_entry_return_code()); |
EXPECT_TRUE(manager.work_done()); |
// Test that both entries were logged. |
@@ -436,7 +380,7 @@ TEST_F(SynchronizedMinidumpManagerTest, |
TEST_F(SynchronizedMinidumpManagerTest, |
Upload_SucceedsWhenDumpLimitsNotExceeded) { |
// Sample parameters. |
- time_t now = time(0); |
+ base::Time now = base::Time::Now(); |
MinidumpParams params; |
params.process_name = "process"; |
@@ -452,7 +396,7 @@ TEST_F(SynchronizedMinidumpManagerTest, |
TEST_F(SynchronizedMinidumpManagerTest, Upload_FailsWhenTooManyRecentDumps) { |
// Sample parameters. |
- time_t now = time(0); |
+ base::Time now = base::Time::Now(); |
MinidumpParams params; |
params.process_name = "process"; |
@@ -466,13 +410,13 @@ TEST_F(SynchronizedMinidumpManagerTest, Upload_FailsWhenTooManyRecentDumps) { |
consume_dumps(uploader, max_dumps); |
// Should fail with too many dumps |
- ASSERT_EQ(0, uploader.DoWorkLocked()); |
+ ASSERT_TRUE(uploader.DoWorkLocked()); |
ASSERT_FALSE(uploader.can_upload_return_val()); |
} |
TEST_F(SynchronizedMinidumpManagerTest, UploadSucceedsAfterRateLimitPeriodEnd) { |
// Sample parameters. |
- time_t now = time(0); |
+ base::Time now = base::Time::Now(); |
MinidumpParams params; |
params.process_name = "process"; |
@@ -489,15 +433,17 @@ TEST_F(SynchronizedMinidumpManagerTest, UploadSucceedsAfterRateLimitPeriodEnd) { |
consume_dumps(uploader, max_dumps); |
// Should fail with too many dumps |
- ASSERT_EQ(0, uploader.DoWorkLocked()); |
+ ASSERT_TRUE(uploader.DoWorkLocked()); |
ASSERT_FALSE(uploader.can_upload_return_val()); |
- int64_t period = SynchronizedMinidumpManager::kRatelimitPeriodSeconds; |
+ base::TimeDelta period = base::TimeDelta::FromSeconds( |
+ SynchronizedMinidumpManager::kRatelimitPeriodSeconds); |
+ base::Time now = base::Time::Now(); |
// Half period shouldn't trigger reset |
produce_dumps(producer, 1); |
SetRatelimitPeriodStart(metadata_.value(), now - period / 2); |
- ASSERT_EQ(0, uploader.DoWorkLocked()); |
+ ASSERT_TRUE(uploader.DoWorkLocked()); |
ASSERT_FALSE(uploader.can_upload_return_val()); |
// Set period starting time to trigger a reset |
@@ -515,7 +461,7 @@ TEST_F(SynchronizedMinidumpManagerTest, HasDumpsWithoutDumps) { |
TEST_F(SynchronizedMinidumpManagerTest, HasDumpsWithDumps) { |
// Sample parameters. |
- time_t now = time(0); |
+ base::Time now = base::Time::Now(); |
MinidumpParams params; |
params.process_name = "process"; |