| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 // Tests for Watchdog class. | 5 // Tests for Watchdog class. |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/watchdog.h" | 8 #include "base/platform_thread.h" |
| 9 #include "base/spin_wait.h" | 9 #include "base/spin_wait.h" |
| 10 #include "base/time.h" | 10 #include "base/time.h" |
| 11 #include "base/watchdog.h" |
| 11 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
| 12 | 13 |
| 13 using base::TimeDelta; | 14 using base::TimeDelta; |
| 14 | 15 |
| 15 namespace { | 16 namespace { |
| 16 | 17 |
| 17 //------------------------------------------------------------------------------ | 18 //------------------------------------------------------------------------------ |
| 18 // Provide a derived class to facilitate testing. | 19 // Provide a derived class to facilitate testing. |
| 19 | 20 |
| 20 // TODO(JAR): Remove default argument from constructor, and make mandatory. | |
| 21 class WatchdogCounter : public Watchdog { | 21 class WatchdogCounter : public Watchdog { |
| 22 public: | 22 public: |
| 23 WatchdogCounter(const TimeDelta& duration, | 23 WatchdogCounter(const TimeDelta& duration, |
| 24 const std::wstring& thread_watched_name, | 24 const std::string& thread_watched_name, |
| 25 bool enabled = true) | 25 bool enabled) |
| 26 : Watchdog(duration, thread_watched_name, enabled), alarm_counter_(0) { | 26 : Watchdog(duration, thread_watched_name, enabled), alarm_counter_(0) { |
| 27 } | 27 } |
| 28 | 28 |
| 29 virtual ~WatchdogCounter() {} | 29 virtual ~WatchdogCounter() {} |
| 30 | 30 |
| 31 virtual void Alarm() { | 31 virtual void Alarm() { |
| 32 alarm_counter_++; | 32 alarm_counter_++; |
| 33 Watchdog::Alarm(); | 33 Watchdog::Alarm(); |
| 34 } | 34 } |
| 35 | 35 |
| 36 int alarm_counter() { return alarm_counter_; } | 36 int alarm_counter() { return alarm_counter_; } |
| 37 | 37 |
| 38 private: | 38 private: |
| 39 int alarm_counter_; | 39 int alarm_counter_; |
| 40 | 40 |
| 41 DISALLOW_EVIL_CONSTRUCTORS(WatchdogCounter); | 41 DISALLOW_COPY_AND_ASSIGN(WatchdogCounter); |
| 42 }; | 42 }; |
| 43 | 43 |
| 44 class WatchdogTest : public testing::Test { | 44 class WatchdogTest : public testing::Test { |
| 45 }; | 45 }; |
| 46 | 46 |
| 47 | 47 |
| 48 //------------------------------------------------------------------------------ | 48 //------------------------------------------------------------------------------ |
| 49 // Actual tests | 49 // Actual tests |
| 50 | 50 |
| 51 // Minimal constructor/destructor test. | 51 // Minimal constructor/destructor test. |
| 52 TEST(WatchdogTest, StartupShutdownTest) { | 52 TEST(WatchdogTest, StartupShutdownTest) { |
| 53 Watchdog watchdog1(TimeDelta::FromMilliseconds(300), L"Disabled", false); | 53 Watchdog watchdog1(TimeDelta::FromMilliseconds(300), "Disabled", false); |
| 54 Watchdog watchdog2(TimeDelta::FromMilliseconds(300), L"Enabled", true); | 54 Watchdog watchdog2(TimeDelta::FromMilliseconds(300), "Enabled", true); |
| 55 | |
| 56 // The following test is depricated, and should be removed when the | |
| 57 // default argument constructor is no longer accepted. | |
| 58 Watchdog watchdog3(TimeDelta::FromMilliseconds(300), L"Default"); | |
| 59 } | 55 } |
| 60 | 56 |
| 61 // Test ability to call Arm and Disarm repeatedly. | 57 // Test ability to call Arm and Disarm repeatedly. |
| 62 TEST(WatchdogTest, ArmDisarmTest) { | 58 TEST(WatchdogTest, ArmDisarmTest) { |
| 63 Watchdog watchdog1(TimeDelta::FromMilliseconds(300), L"Disabled", false); | 59 Watchdog watchdog1(TimeDelta::FromMilliseconds(300), "Disabled", false); |
| 64 watchdog1.Arm(); | 60 watchdog1.Arm(); |
| 65 watchdog1.Disarm(); | 61 watchdog1.Disarm(); |
| 66 watchdog1.Arm(); | 62 watchdog1.Arm(); |
| 67 watchdog1.Disarm(); | 63 watchdog1.Disarm(); |
| 68 | 64 |
| 69 Watchdog watchdog2(TimeDelta::FromMilliseconds(300), L"Enabled", true); | 65 Watchdog watchdog2(TimeDelta::FromMilliseconds(300), "Enabled", true); |
| 70 watchdog2.Arm(); | 66 watchdog2.Arm(); |
| 71 watchdog2.Disarm(); | 67 watchdog2.Disarm(); |
| 72 watchdog2.Arm(); | 68 watchdog2.Arm(); |
| 73 watchdog2.Disarm(); | 69 watchdog2.Disarm(); |
| 74 | |
| 75 // The following test is depricated, and should be removed when the | |
| 76 // default argument constructor is no longer accepted. | |
| 77 Watchdog watchdog3(TimeDelta::FromMilliseconds(300), L"Default"); | |
| 78 watchdog3.Arm(); | |
| 79 watchdog3.Disarm(); | |
| 80 watchdog3.Arm(); | |
| 81 watchdog3.Disarm(); | |
| 82 } | 70 } |
| 83 | 71 |
| 84 // Make sure a basic alarm fires when the time has expired. | 72 // Make sure a basic alarm fires when the time has expired. |
| 85 TEST(WatchdogTest, AlarmTest) { | 73 TEST(WatchdogTest, AlarmTest) { |
| 86 WatchdogCounter watchdog(TimeDelta::FromMilliseconds(10), L"Enabled", true); | 74 WatchdogCounter watchdog(TimeDelta::FromMilliseconds(10), "Enabled", true); |
| 87 watchdog.Arm(); | 75 watchdog.Arm(); |
| 88 SPIN_FOR_TIMEDELTA_OR_UNTIL_TRUE(TimeDelta::FromSeconds(1), | 76 SPIN_FOR_TIMEDELTA_OR_UNTIL_TRUE(TimeDelta::FromSeconds(1), |
| 89 watchdog.alarm_counter() > 0); | 77 watchdog.alarm_counter() > 0); |
| 90 EXPECT_EQ(1, watchdog.alarm_counter()); | 78 EXPECT_EQ(1, watchdog.alarm_counter()); |
| 91 | 79 |
| 92 // Set a time greater than the timeout into the past. | 80 // Set a time greater than the timeout into the past. |
| 93 watchdog.ArmSomeTimeDeltaAgo(TimeDelta::FromSeconds(2)); | 81 watchdog.ArmSomeTimeDeltaAgo(TimeDelta::FromSeconds(2)); |
| 94 // It should instantly go off, but certainly in less than a second. | 82 // It should instantly go off, but certainly in less than a second. |
| 95 SPIN_FOR_TIMEDELTA_OR_UNTIL_TRUE(TimeDelta::FromSeconds(1), | 83 SPIN_FOR_TIMEDELTA_OR_UNTIL_TRUE(TimeDelta::FromSeconds(1), |
| 96 watchdog.alarm_counter() > 1); | 84 watchdog.alarm_counter() > 1); |
| 97 | 85 |
| 98 EXPECT_EQ(2, watchdog.alarm_counter()); | 86 EXPECT_EQ(2, watchdog.alarm_counter()); |
| 99 } | 87 } |
| 100 | 88 |
| 101 // Make sure a disable alarm does nothing, even if we arm it. | 89 // Make sure a disable alarm does nothing, even if we arm it. |
| 102 TEST(WatchdogTest, ConstructorDisabledTest) { | 90 TEST(WatchdogTest, ConstructorDisabledTest) { |
| 103 WatchdogCounter watchdog(TimeDelta::FromMilliseconds(10), L"Disabled", false); | 91 WatchdogCounter watchdog(TimeDelta::FromMilliseconds(10), "Disabled", false); |
| 104 watchdog.Arm(); | 92 watchdog.Arm(); |
| 105 // Alarm should not fire, as it was disabled. | 93 // Alarm should not fire, as it was disabled. |
| 106 Sleep(500); | 94 PlatformThread::Sleep(500); |
| 107 EXPECT_EQ(0, watchdog.alarm_counter()); | 95 EXPECT_EQ(0, watchdog.alarm_counter()); |
| 108 } | 96 } |
| 109 | 97 |
| 110 // Make sure Disarming will prevent firing, even after Arming. | 98 // Make sure Disarming will prevent firing, even after Arming. |
| 111 TEST(WatchdogTest, DisarmTest) { | 99 TEST(WatchdogTest, DisarmTest) { |
| 112 WatchdogCounter watchdog(TimeDelta::FromSeconds(1), L"Enabled", true); | 100 WatchdogCounter watchdog(TimeDelta::FromSeconds(1), "Enabled", true); |
| 113 watchdog.Arm(); | 101 watchdog.Arm(); |
| 114 Sleep(100); // Don't sleep too long | 102 PlatformThread::Sleep(100); // Don't sleep too long |
| 115 watchdog.Disarm(); | 103 watchdog.Disarm(); |
| 116 // Alarm should not fire. | 104 // Alarm should not fire. |
| 117 Sleep(1500); | 105 PlatformThread::Sleep(1500); |
| 118 EXPECT_EQ(0, watchdog.alarm_counter()); | 106 EXPECT_EQ(0, watchdog.alarm_counter()); |
| 119 | 107 |
| 120 // ...but even after disarming, we can still use the alarm... | 108 // ...but even after disarming, we can still use the alarm... |
| 121 // Set a time greater than the timeout into the past. | 109 // Set a time greater than the timeout into the past. |
| 122 watchdog.ArmSomeTimeDeltaAgo(TimeDelta::FromSeconds(2)); | 110 watchdog.ArmSomeTimeDeltaAgo(TimeDelta::FromSeconds(2)); |
| 123 // It should almost instantly go off, but certainly in less than a second. | 111 // It should almost instantly go off, but certainly in less than a second. |
| 124 SPIN_FOR_TIMEDELTA_OR_UNTIL_TRUE(TimeDelta::FromSeconds(1), | 112 SPIN_FOR_TIMEDELTA_OR_UNTIL_TRUE(TimeDelta::FromSeconds(1), |
| 125 watchdog.alarm_counter() > 0); | 113 watchdog.alarm_counter() > 0); |
| 126 | 114 |
| 127 EXPECT_EQ(1, watchdog.alarm_counter()); | 115 EXPECT_EQ(1, watchdog.alarm_counter()); |
| 128 } | 116 } |
| 129 | 117 |
| 130 } // namespace | 118 } // namespace |
| 131 | 119 |
| OLD | NEW |