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 "chromecast/crash/linux/synchronized_minidump_manager.h" | 5 #include "chromecast/crash/linux/synchronized_minidump_manager.h" |
| 6 | 6 |
| 7 #include <fcntl.h> | 7 #include <fcntl.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 #include <stdio.h> // perror | 9 #include <stdio.h> // perror |
| 10 #include <stdlib.h> | 10 #include <stdlib.h> |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 250 | 250 |
| 251 // Verify the lockfile is untouched. | 251 // Verify the lockfile is untouched. |
| 252 ScopedVector<DumpInfo> dumps; | 252 ScopedVector<DumpInfo> dumps; |
| 253 ASSERT_TRUE(FetchDumps(lockfile_.value(), &dumps)); | 253 ASSERT_TRUE(FetchDumps(lockfile_.value(), &dumps)); |
| 254 ASSERT_EQ(0u, dumps.size()); | 254 ASSERT_EQ(0u, dumps.size()); |
| 255 } | 255 } |
| 256 | 256 |
| 257 TEST_F(SynchronizedMinidumpManagerTest, | 257 TEST_F(SynchronizedMinidumpManagerTest, |
| 258 AddEntryToLockFile_SucceedsWithValidEntries) { | 258 AddEntryToLockFile_SucceedsWithValidEntries) { |
| 259 // Sample parameters. | 259 // Sample parameters. |
| 260 time_t now = time(0); | 260 base::Time now = base::Time::Now(); |
| 261 MinidumpParams params; | 261 MinidumpParams params; |
| 262 params.process_name = "process"; | 262 params.process_name = "process"; |
| 263 | 263 |
| 264 // Write the first entry. | 264 // Write the first entry. |
| 265 SynchronizedMinidumpManagerSimple manager; | 265 SynchronizedMinidumpManagerSimple manager; |
| 266 manager.SetDumpInfoToWrite( | 266 manager.SetDumpInfoToWrite( |
| 267 base::WrapUnique(new DumpInfo("dump1", "log1", now, params))); | 267 base::WrapUnique(new DumpInfo("dump1", "log1", now, params))); |
| 268 ASSERT_EQ(0, manager.DoWorkLocked()); | 268 ASSERT_EQ(0, manager.DoWorkLocked()); |
| 269 ASSERT_EQ(0, manager.add_entry_return_code()); | 269 ASSERT_EQ(0, manager.add_entry_return_code()); |
| 270 | 270 |
| 271 // Test that the manager was successful in logging the entry. | 271 // Test that the manager was successful in logging the entry. |
| 272 ScopedVector<DumpInfo> dumps; | 272 ScopedVector<DumpInfo> dumps; |
| 273 ASSERT_TRUE(FetchDumps(lockfile_.value(), &dumps)); | 273 ASSERT_TRUE(FetchDumps(lockfile_.value(), &dumps)); |
| 274 ASSERT_EQ(1u, dumps.size()); | 274 ASSERT_EQ(1u, dumps.size()); |
| 275 | 275 |
| 276 // Write the second entry. | 276 // Write the second entry. |
| 277 manager.SetDumpInfoToWrite( | 277 manager.SetDumpInfoToWrite( |
| 278 base::WrapUnique(new DumpInfo("dump2", "log2", now, params))); | 278 base::WrapUnique(new DumpInfo("dump2", "log2", now, params))); |
| 279 ASSERT_EQ(0, manager.DoWorkLocked()); | 279 ASSERT_EQ(0, manager.DoWorkLocked()); |
| 280 ASSERT_EQ(0, manager.add_entry_return_code()); | 280 ASSERT_EQ(0, manager.add_entry_return_code()); |
| 281 | 281 |
| 282 // Test that the second entry is also valid. | 282 // Test that the second entry is also valid. |
| 283 ASSERT_TRUE(FetchDumps(lockfile_.value(), &dumps)); | 283 ASSERT_TRUE(FetchDumps(lockfile_.value(), &dumps)); |
| 284 ASSERT_EQ(2u, dumps.size()); | 284 ASSERT_EQ(2u, dumps.size()); |
| 285 } | 285 } |
| 286 | 286 |
| 287 TEST_F(SynchronizedMinidumpManagerTest, | 287 TEST_F(SynchronizedMinidumpManagerTest, |
|
bcf
2016/08/05 03:33:23
Why are we keeping this around?
ameyak
2016/08/05 18:45:06
Initial thought was it would be cleaner to just di
| |
| 288 AcquireLockFile_FailsWhenNonBlockingAndFileLocked) { | 288 DISABLED_AcquireLockFile_FailsWhenNonBlockingAndFileLocked) { |
| 289 ASSERT_TRUE(CreateFiles(lockfile_.value(), metadata_.value())); | 289 ASSERT_TRUE(CreateFiles(lockfile_.value(), metadata_.value())); |
| 290 // Lock the lockfile here. Note that the Chromium base::File tools permit | 290 // Lock the lockfile here. Note that the Chromium base::File tools permit |
| 291 // multiple locks on the same process to succeed, so we must use POSIX system | 291 // multiple locks on the same process to succeed, so we must use POSIX system |
| 292 // calls to accomplish this. | 292 // calls to accomplish this. |
| 293 int fd = open(lockfile_.value().c_str(), O_RDWR | O_CREAT, 0660); | 293 int fd = open(lockfile_.value().c_str(), O_RDWR | O_CREAT, 0660); |
| 294 ASSERT_GE(fd, 0); | 294 ASSERT_GE(fd, 0); |
| 295 ASSERT_EQ(0, flock(fd, LOCK_EX)); | 295 ASSERT_EQ(0, flock(fd, LOCK_EX)); |
| 296 | 296 |
| 297 SynchronizedMinidumpManagerSimple manager; | 297 SynchronizedMinidumpManagerSimple manager; |
| 298 manager.set_non_blocking(true); | 298 // manager.set_non_blocking(true); This method has been deprecated. |
| 299 ASSERT_EQ(-1, manager.DoWorkLocked()); | 299 ASSERT_EQ(-1, manager.DoWorkLocked()); |
| 300 ASSERT_FALSE(manager.work_done()); | 300 ASSERT_FALSE(manager.work_done()); |
| 301 | |
| 302 // Test that the manager was not able to log the crash dump. | 301 // Test that the manager was not able to log the crash dump. |
| 303 ScopedVector<DumpInfo> dumps; | 302 ScopedVector<DumpInfo> dumps; |
| 304 ASSERT_TRUE(FetchDumps(lockfile_.value(), &dumps)); | 303 ASSERT_TRUE(FetchDumps(lockfile_.value(), &dumps)); |
| 305 ASSERT_EQ(0u, dumps.size()); | 304 ASSERT_EQ(0u, dumps.size()); |
| 306 } | 305 } |
| 307 | 306 |
| 308 TEST_F(SynchronizedMinidumpManagerTest, | 307 TEST_F(SynchronizedMinidumpManagerTest, AcquireLockFile_WaitsForOtherThread) { |
| 309 AcquireLockFile_WaitsForOtherThreadWhenBlocking) { | |
| 310 // Create some parameters for a minidump. | 308 // Create some parameters for a minidump. |
| 311 time_t now = time(0); | 309 base::Time now = base::Time::Now(); |
| 312 MinidumpParams params; | 310 MinidumpParams params; |
| 313 params.process_name = "process"; | 311 params.process_name = "process"; |
| 314 | 312 |
| 315 // Create a manager that grabs the lock then sleeps. Post a DoWork task to | 313 // Create a manager that grabs the lock then sleeps. Post a DoWork task to |
| 316 // another thread. |sleepy_manager| will grab the lock and hold it for | 314 // another thread. |sleepy_manager| will grab the lock and hold it for |
| 317 // |sleep_time_ms|. It will then write a dump and release the lock. | 315 // |sleep_time_ms|. It will then write a dump and release the lock. |
| 318 const int sleep_time_ms = 100; | 316 const int sleep_time_ms = 100; |
| 319 SleepySynchronizedMinidumpManagerSimple sleepy_manager(sleep_time_ms); | 317 SleepySynchronizedMinidumpManagerSimple sleepy_manager(sleep_time_ms); |
| 320 sleepy_manager.SetDumpInfoToWrite( | 318 sleepy_manager.SetDumpInfoToWrite( |
| 321 base::WrapUnique(new DumpInfo("dump", "log", now, params))); | 319 base::WrapUnique(new DumpInfo("dump", "log", now, params))); |
| 322 base::Thread sleepy_thread("sleepy"); | 320 base::Thread sleepy_thread("sleepy"); |
| 323 sleepy_thread.Start(); | 321 sleepy_thread.Start(); |
| 324 sleepy_thread.task_runner()->PostTask( | 322 sleepy_thread.task_runner()->PostTask( |
| 325 FROM_HERE, | 323 FROM_HERE, |
| 326 base::Bind(&DoWorkLockedTask, base::Unretained(&sleepy_manager))); | 324 base::Bind(&DoWorkLockedTask, base::Unretained(&sleepy_manager))); |
| 327 | 325 |
| 328 // Meanwhile, this thread should wait brielfy to allow the other thread to | 326 // Meanwhile, this thread should wait brielfy to allow the other thread to |
| 329 // grab the lock. | 327 // grab the lock. |
| 330 const int concurrency_delay = 50; | 328 const int concurrency_delay = 50; |
| 331 base::PlatformThread::Sleep( | 329 base::PlatformThread::Sleep( |
| 332 base::TimeDelta::FromMilliseconds(concurrency_delay)); | 330 base::TimeDelta::FromMilliseconds(concurrency_delay)); |
| 333 | 331 |
| 334 // |sleepy_manager| has the lock by now, but has not released it. Attempt to | 332 // |sleepy_manager| has the lock by now, but has not released it. Attempt to |
| 335 // grab it. DoWorkLocked() should block until |manager| has a chance to write | 333 // grab it. DoWorkLocked() should block until |manager| has a chance to write |
| 336 // the dump. | 334 // the dump. |
| 337 SynchronizedMinidumpManagerSimple manager; | 335 SynchronizedMinidumpManagerSimple manager; |
| 338 manager.SetDumpInfoToWrite( | 336 manager.SetDumpInfoToWrite( |
| 339 base::WrapUnique(new DumpInfo("dump", "log", now, params))); | 337 base::WrapUnique(new DumpInfo("dump", "log", now, params))); |
| 340 manager.set_non_blocking(false); | |
| 341 | 338 |
| 342 EXPECT_EQ(0, manager.DoWorkLocked()); | 339 EXPECT_EQ(0, manager.DoWorkLocked()); |
| 343 EXPECT_EQ(0, manager.add_entry_return_code()); | 340 EXPECT_EQ(0, manager.add_entry_return_code()); |
| 344 EXPECT_TRUE(manager.work_done()); | 341 EXPECT_TRUE(manager.work_done()); |
| 345 | 342 |
| 346 // Check that the other manager was also successful. | 343 // Check that the other manager was also successful. |
| 347 EXPECT_EQ(0, sleepy_manager.add_entry_return_code()); | 344 EXPECT_EQ(0, sleepy_manager.add_entry_return_code()); |
| 348 EXPECT_TRUE(sleepy_manager.work_done()); | 345 EXPECT_TRUE(sleepy_manager.work_done()); |
| 349 | 346 |
| 350 // Test that both entries were logged. | 347 // Test that both entries were logged. |
| 351 ScopedVector<DumpInfo> dumps; | 348 ScopedVector<DumpInfo> dumps; |
| 352 ASSERT_TRUE(FetchDumps(lockfile_.value(), &dumps)); | 349 ASSERT_TRUE(FetchDumps(lockfile_.value(), &dumps)); |
| 353 EXPECT_EQ(2u, dumps.size()); | 350 EXPECT_EQ(2u, dumps.size()); |
| 354 } | 351 } |
| 355 | 352 |
| 356 // TODO(slan): These tests are passing but forking them is creating duplicates | 353 // TODO(slan): These tests are passing but forking them is creating duplicates |
| 357 // of all tests in this thread. Figure out how to lock the file more cleanly | 354 // of all tests in this thread. Figure out how to lock the file more cleanly |
| 358 // from another process. | 355 // from another process. |
| 359 TEST_F(SynchronizedMinidumpManagerTest, | 356 TEST_F(SynchronizedMinidumpManagerTest, |
|
bcf
2016/08/05 03:33:23
Ditto
ameyak
2016/08/05 18:45:07
See comment above.
| |
| 360 DISABLED_AcquireLockFile_FailsWhenNonBlockingAndLockedFromOtherProcess) { | 357 DISABLED_AcquireLockFile_FailsWhenNonBlockingAndLockedFromOtherProcess) { |
| 361 // Fork the process. | 358 // Fork the process. |
| 362 pid_t pid = base::ForkWithFlags(0u, nullptr, nullptr); | 359 pid_t pid = base::ForkWithFlags(0u, nullptr, nullptr); |
| 363 if (pid != 0) { | 360 if (pid != 0) { |
| 364 // The child process should instantiate a manager which immediately grabs | 361 // The child process should instantiate a manager which immediately grabs |
| 365 // the lock, and falls aleep for some period of time, then writes a dump, | 362 // the lock, and falls aleep for some period of time, then writes a dump, |
| 366 // and finally releases the lock. | 363 // and finally releases the lock. |
| 367 SleepySynchronizedMinidumpManagerSimple sleepy_manager(100); | 364 SleepySynchronizedMinidumpManagerSimple sleepy_manager(100); |
| 368 ASSERT_EQ(0, sleepy_manager.DoWorkLocked()); | 365 ASSERT_EQ(0, sleepy_manager.DoWorkLocked()); |
| 369 ASSERT_TRUE(sleepy_manager.work_done()); | 366 ASSERT_TRUE(sleepy_manager.work_done()); |
| 370 return; | 367 return; |
| 371 } | 368 } |
| 372 | 369 |
| 373 // Meanwhile, this process should wait brielfy to allow the other thread to | 370 // Meanwhile, this process should wait brielfy to allow the other thread to |
| 374 // grab the lock. | 371 // grab the lock. |
| 375 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(50)); | 372 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(50)); |
| 376 | 373 |
| 377 SynchronizedMinidumpManagerSimple manager; | 374 SynchronizedMinidumpManagerSimple manager; |
| 378 manager.set_non_blocking(true); | 375 // manager.set_non_blocking(true); This method has been deprecated. |
| 379 ASSERT_EQ(-1, manager.DoWorkLocked()); | 376 ASSERT_EQ(-1, manager.DoWorkLocked()); |
| 380 ASSERT_FALSE(manager.work_done()); | 377 ASSERT_FALSE(manager.work_done()); |
| 381 | |
| 382 // Test that the manager was not able to log the crash dump. | 378 // Test that the manager was not able to log the crash dump. |
| 383 ScopedVector<DumpInfo> dumps; | 379 ScopedVector<DumpInfo> dumps; |
| 384 ASSERT_TRUE(FetchDumps(lockfile_.value(), &dumps)); | 380 ASSERT_TRUE(FetchDumps(lockfile_.value(), &dumps)); |
| 385 ASSERT_EQ(0u, dumps.size()); | 381 ASSERT_EQ(0u, dumps.size()); |
| 386 } | 382 } |
| 387 | 383 |
| 388 // TODO(slan): These tests are passing but forking them is creating duplicates | 384 // TODO(slan): These tests are passing but forking them is creating duplicates |
| 389 // of all tests in this thread. Figure out how to lock the file more cleanly | 385 // of all tests in this thread. Figure out how to lock the file more cleanly |
| 390 // from another process. | 386 // from another process. |
| 391 TEST_F(SynchronizedMinidumpManagerTest, | 387 TEST_F(SynchronizedMinidumpManagerTest, |
| 392 DISABLED_AcquireLockFile_WaitsForOtherProcessWhenBlocking) { | 388 DISABLED_AcquireLockFile_WaitsForOtherProcess) { |
| 393 // Create some parameters for a minidump. | 389 // Create some parameters for a minidump. |
| 394 time_t now = time(0); | 390 base::Time now = base::Time::Now(); |
| 395 MinidumpParams params; | 391 MinidumpParams params; |
| 396 params.process_name = "process"; | 392 params.process_name = "process"; |
| 397 | 393 |
| 398 // Fork the process. | 394 // Fork the process. |
| 399 pid_t pid = base::ForkWithFlags(0u, nullptr, nullptr); | 395 pid_t pid = base::ForkWithFlags(0u, nullptr, nullptr); |
| 400 if (pid != 0) { | 396 if (pid != 0) { |
| 401 // The child process should instantiate a manager which immediately grabs | 397 // The child process should instantiate a manager which immediately grabs |
| 402 // the lock, and falls aleep for some period of time, then writes a dump, | 398 // the lock, and falls aleep for some period of time, then writes a dump, |
| 403 // and finally releases the lock. | 399 // and finally releases the lock. |
| 404 SleepySynchronizedMinidumpManagerSimple sleepy_manager(100); | 400 SleepySynchronizedMinidumpManagerSimple sleepy_manager(100); |
| 405 sleepy_manager.SetDumpInfoToWrite( | 401 sleepy_manager.SetDumpInfoToWrite( |
| 406 base::WrapUnique(new DumpInfo("dump", "log", now, params))); | 402 base::WrapUnique(new DumpInfo("dump", "log", now, params))); |
| 407 ASSERT_EQ(0, sleepy_manager.DoWorkLocked()); | 403 ASSERT_EQ(0, sleepy_manager.DoWorkLocked()); |
| 408 ASSERT_TRUE(sleepy_manager.work_done()); | 404 ASSERT_TRUE(sleepy_manager.work_done()); |
| 409 return; | 405 return; |
| 410 } | 406 } |
| 411 | 407 |
| 412 // Meanwhile, this process should wait brielfy to allow the other thread to | 408 // Meanwhile, this process should wait brielfy to allow the other thread to |
| 413 // grab the lock. | 409 // grab the lock. |
| 414 const int concurrency_delay = 50; | 410 const int concurrency_delay = 50; |
| 415 base::PlatformThread::Sleep( | 411 base::PlatformThread::Sleep( |
| 416 base::TimeDelta::FromMilliseconds(concurrency_delay)); | 412 base::TimeDelta::FromMilliseconds(concurrency_delay)); |
| 417 | 413 |
| 418 // |sleepy_manager| has the lock by now, but has not released it. Attempt to | 414 // |sleepy_manager| has the lock by now, but has not released it. Attempt to |
| 419 // grab it. DoWorkLocked() should block until |manager| has a chance to write | 415 // grab it. DoWorkLocked() should block until |manager| has a chance to write |
| 420 // the dump. | 416 // the dump. |
| 421 SynchronizedMinidumpManagerSimple manager; | 417 SynchronizedMinidumpManagerSimple manager; |
| 422 manager.SetDumpInfoToWrite( | 418 manager.SetDumpInfoToWrite( |
| 423 base::WrapUnique(new DumpInfo("dump", "log", now, params))); | 419 base::WrapUnique(new DumpInfo("dump", "log", now, params))); |
| 424 manager.set_non_blocking(false); | |
| 425 | 420 |
| 426 EXPECT_EQ(0, manager.DoWorkLocked()); | 421 EXPECT_EQ(0, manager.DoWorkLocked()); |
| 427 EXPECT_EQ(0, manager.add_entry_return_code()); | 422 EXPECT_EQ(0, manager.add_entry_return_code()); |
| 428 EXPECT_TRUE(manager.work_done()); | 423 EXPECT_TRUE(manager.work_done()); |
| 429 | 424 |
| 430 // Test that both entries were logged. | 425 // Test that both entries were logged. |
| 431 ScopedVector<DumpInfo> dumps; | 426 ScopedVector<DumpInfo> dumps; |
| 432 ASSERT_TRUE(FetchDumps(lockfile_.value(), &dumps)); | 427 ASSERT_TRUE(FetchDumps(lockfile_.value(), &dumps)); |
| 433 EXPECT_EQ(2u, dumps.size()); | 428 EXPECT_EQ(2u, dumps.size()); |
| 434 } | 429 } |
| 435 | 430 |
| 436 TEST_F(SynchronizedMinidumpManagerTest, | 431 TEST_F(SynchronizedMinidumpManagerTest, |
| 437 Upload_SucceedsWhenDumpLimitsNotExceeded) { | 432 Upload_SucceedsWhenDumpLimitsNotExceeded) { |
| 438 // Sample parameters. | 433 // Sample parameters. |
| 439 time_t now = time(0); | 434 base::Time now = base::Time::Now(); |
| 440 MinidumpParams params; | 435 MinidumpParams params; |
| 441 params.process_name = "process"; | 436 params.process_name = "process"; |
| 442 | 437 |
| 443 FakeSynchronizedMinidumpUploader uploader; | 438 FakeSynchronizedMinidumpUploader uploader; |
| 444 SynchronizedMinidumpManagerSimple producer; | 439 SynchronizedMinidumpManagerSimple producer; |
| 445 producer.SetDumpInfoToWrite( | 440 producer.SetDumpInfoToWrite( |
| 446 base::WrapUnique(new DumpInfo("dump1", "log1", now, params))); | 441 base::WrapUnique(new DumpInfo("dump1", "log1", now, params))); |
| 447 | 442 |
| 448 const int max_dumps = SynchronizedMinidumpManager::kRatelimitPeriodMaxDumps; | 443 const int max_dumps = SynchronizedMinidumpManager::kRatelimitPeriodMaxDumps; |
| 449 produce_dumps(producer, max_dumps); | 444 produce_dumps(producer, max_dumps); |
| 450 consume_dumps(uploader, max_dumps); | 445 consume_dumps(uploader, max_dumps); |
| 451 } | 446 } |
| 452 | 447 |
| 453 TEST_F(SynchronizedMinidumpManagerTest, Upload_FailsWhenTooManyRecentDumps) { | 448 TEST_F(SynchronizedMinidumpManagerTest, Upload_FailsWhenTooManyRecentDumps) { |
| 454 // Sample parameters. | 449 // Sample parameters. |
| 455 time_t now = time(0); | 450 base::Time now = base::Time::Now(); |
| 456 MinidumpParams params; | 451 MinidumpParams params; |
| 457 params.process_name = "process"; | 452 params.process_name = "process"; |
| 458 | 453 |
| 459 FakeSynchronizedMinidumpUploader uploader; | 454 FakeSynchronizedMinidumpUploader uploader; |
| 460 SynchronizedMinidumpManagerSimple producer; | 455 SynchronizedMinidumpManagerSimple producer; |
| 461 producer.SetDumpInfoToWrite( | 456 producer.SetDumpInfoToWrite( |
| 462 base::WrapUnique(new DumpInfo("dump1", "log1", now, params))); | 457 base::WrapUnique(new DumpInfo("dump1", "log1", now, params))); |
| 463 | 458 |
| 464 const int max_dumps = SynchronizedMinidumpManager::kRatelimitPeriodMaxDumps; | 459 const int max_dumps = SynchronizedMinidumpManager::kRatelimitPeriodMaxDumps; |
| 465 produce_dumps(producer, max_dumps + 1); | 460 produce_dumps(producer, max_dumps + 1); |
| 466 consume_dumps(uploader, max_dumps); | 461 consume_dumps(uploader, max_dumps); |
| 467 | 462 |
| 468 // Should fail with too many dumps | 463 // Should fail with too many dumps |
| 469 ASSERT_EQ(0, uploader.DoWorkLocked()); | 464 ASSERT_EQ(0, uploader.DoWorkLocked()); |
| 470 ASSERT_FALSE(uploader.can_upload_return_val()); | 465 ASSERT_FALSE(uploader.can_upload_return_val()); |
| 471 } | 466 } |
| 472 | 467 |
| 473 TEST_F(SynchronizedMinidumpManagerTest, UploadSucceedsAfterRateLimitPeriodEnd) { | 468 TEST_F(SynchronizedMinidumpManagerTest, UploadSucceedsAfterRateLimitPeriodEnd) { |
| 474 // Sample parameters. | 469 // Sample parameters. |
| 475 time_t now = time(0); | 470 base::Time now = base::Time::Now(); |
| 476 MinidumpParams params; | 471 MinidumpParams params; |
| 477 params.process_name = "process"; | 472 params.process_name = "process"; |
| 478 | 473 |
| 479 FakeSynchronizedMinidumpUploader uploader; | 474 FakeSynchronizedMinidumpUploader uploader; |
| 480 SynchronizedMinidumpManagerSimple producer; | 475 SynchronizedMinidumpManagerSimple producer; |
| 481 producer.SetDumpInfoToWrite( | 476 producer.SetDumpInfoToWrite( |
| 482 base::WrapUnique(new DumpInfo("dump1", "log1", now, params))); | 477 base::WrapUnique(new DumpInfo("dump1", "log1", now, params))); |
| 483 | 478 |
| 484 const int iters = 3; | 479 const int iters = 3; |
| 485 const int max_dumps = SynchronizedMinidumpManager::kRatelimitPeriodMaxDumps; | 480 const int max_dumps = SynchronizedMinidumpManager::kRatelimitPeriodMaxDumps; |
| 486 | 481 |
| 487 for (int i = 0; i < iters; ++i) { | 482 for (int i = 0; i < iters; ++i) { |
| 488 produce_dumps(producer, max_dumps + 1); | 483 produce_dumps(producer, max_dumps + 1); |
| 489 consume_dumps(uploader, max_dumps); | 484 consume_dumps(uploader, max_dumps); |
| 490 | 485 |
| 491 // Should fail with too many dumps | 486 // Should fail with too many dumps |
| 492 ASSERT_EQ(0, uploader.DoWorkLocked()); | 487 ASSERT_EQ(0, uploader.DoWorkLocked()); |
| 493 ASSERT_FALSE(uploader.can_upload_return_val()); | 488 ASSERT_FALSE(uploader.can_upload_return_val()); |
| 494 | 489 |
| 495 int64_t period = SynchronizedMinidumpManager::kRatelimitPeriodSeconds; | 490 base::TimeDelta period = base::TimeDelta::FromSeconds( |
| 491 SynchronizedMinidumpManager::kRatelimitPeriodSeconds); | |
| 492 base::Time now = base::Time::Now(); | |
| 496 | 493 |
| 497 // Half period shouldn't trigger reset | 494 // Half period shouldn't trigger reset |
| 498 produce_dumps(producer, 1); | 495 produce_dumps(producer, 1); |
| 499 SetRatelimitPeriodStart(metadata_.value(), now - period / 2); | 496 SetRatelimitPeriodStart(metadata_.value(), now - period / 2); |
| 500 ASSERT_EQ(0, uploader.DoWorkLocked()); | 497 ASSERT_EQ(0, uploader.DoWorkLocked()); |
| 501 ASSERT_FALSE(uploader.can_upload_return_val()); | 498 ASSERT_FALSE(uploader.can_upload_return_val()); |
| 502 | 499 |
| 503 // Set period starting time to trigger a reset | 500 // Set period starting time to trigger a reset |
| 504 SetRatelimitPeriodStart(metadata_.value(), now - period); | 501 SetRatelimitPeriodStart(metadata_.value(), now - period); |
| 505 } | 502 } |
| 506 | 503 |
| 507 produce_dumps(producer, 1); | 504 produce_dumps(producer, 1); |
| 508 consume_dumps(uploader, 1); | 505 consume_dumps(uploader, 1); |
| 509 } | 506 } |
| 510 | 507 |
| 511 TEST_F(SynchronizedMinidumpManagerTest, HasDumpsWithoutDumps) { | 508 TEST_F(SynchronizedMinidumpManagerTest, HasDumpsWithoutDumps) { |
| 512 FakeSynchronizedMinidumpUploader uploader; | 509 FakeSynchronizedMinidumpUploader uploader; |
| 513 ASSERT_FALSE(uploader.HasDumps()); | 510 ASSERT_FALSE(uploader.HasDumps()); |
| 514 } | 511 } |
| 515 | 512 |
| 516 TEST_F(SynchronizedMinidumpManagerTest, HasDumpsWithDumps) { | 513 TEST_F(SynchronizedMinidumpManagerTest, HasDumpsWithDumps) { |
| 517 // Sample parameters. | 514 // Sample parameters. |
| 518 time_t now = time(0); | 515 base::Time now = base::Time::Now(); |
| 519 MinidumpParams params; | 516 MinidumpParams params; |
| 520 params.process_name = "process"; | 517 params.process_name = "process"; |
| 521 | 518 |
| 522 SynchronizedMinidumpManagerSimple producer; | 519 SynchronizedMinidumpManagerSimple producer; |
| 523 FakeSynchronizedMinidumpUploader uploader; | 520 FakeSynchronizedMinidumpUploader uploader; |
| 524 | 521 |
| 525 producer.SetDumpInfoToWrite( | 522 producer.SetDumpInfoToWrite( |
| 526 base::WrapUnique(new DumpInfo("dump1", "log1", now, params))); | 523 base::WrapUnique(new DumpInfo("dump1", "log1", now, params))); |
| 527 | 524 |
| 528 const int kNumDumps = 3; | 525 const int kNumDumps = 3; |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 547 const base::FilePath path = | 544 const base::FilePath path = |
| 548 base::FilePath(manager.dump_path()).Append("hello123"); | 545 base::FilePath(manager.dump_path()).Append("hello123"); |
| 549 const char kFileContents[] = "foobar"; | 546 const char kFileContents[] = "foobar"; |
| 550 ASSERT_EQ(static_cast<int>(sizeof(kFileContents)), | 547 ASSERT_EQ(static_cast<int>(sizeof(kFileContents)), |
| 551 WriteFile(path, kFileContents, sizeof(kFileContents))); | 548 WriteFile(path, kFileContents, sizeof(kFileContents))); |
| 552 | 549 |
| 553 ASSERT_TRUE(manager.HasDumps()); | 550 ASSERT_TRUE(manager.HasDumps()); |
| 554 } | 551 } |
| 555 | 552 |
| 556 } // namespace chromecast | 553 } // namespace chromecast |
| OLD | NEW |