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 |