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 |