Index: base/threading/watchdog_unittest.cc |
=================================================================== |
--- base/threading/watchdog_unittest.cc (revision 0) |
+++ base/threading/watchdog_unittest.cc (revision 0) |
@@ -0,0 +1,140 @@ |
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/threading/watchdog.h" |
+ |
+#include "base/logging.h" |
+#include "base/platform_thread.h" |
+#include "base/spin_wait.h" |
+#include "base/time.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace base { |
+ |
+namespace { |
+ |
+//------------------------------------------------------------------------------ |
+// Provide a derived class to facilitate testing. |
+ |
+class WatchdogCounter : public Watchdog { |
+ public: |
+ WatchdogCounter(const TimeDelta& duration, |
+ const std::string& thread_watched_name, |
+ bool enabled) |
+ : Watchdog(duration, thread_watched_name, enabled), alarm_counter_(0) { |
+ } |
+ |
+ virtual ~WatchdogCounter() {} |
+ |
+ virtual void Alarm() { |
+ alarm_counter_++; |
+ Watchdog::Alarm(); |
+ } |
+ |
+ int alarm_counter() { return alarm_counter_; } |
+ |
+ private: |
+ int alarm_counter_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(WatchdogCounter); |
+}; |
+ |
+class WatchdogTest : public testing::Test { |
+ public: |
+ void SetUp() { |
+ Watchdog::ResetStaticData(); |
+ } |
+}; |
+ |
+} // namespace |
+ |
+//------------------------------------------------------------------------------ |
+// Actual tests |
+ |
+// Minimal constructor/destructor test. |
+TEST_F(WatchdogTest, StartupShutdownTest) { |
+ Watchdog watchdog1(TimeDelta::FromMilliseconds(300), "Disabled", false); |
+ Watchdog watchdog2(TimeDelta::FromMilliseconds(300), "Enabled", true); |
+} |
+ |
+// Test ability to call Arm and Disarm repeatedly. |
+TEST_F(WatchdogTest, ArmDisarmTest) { |
+ Watchdog watchdog1(TimeDelta::FromMilliseconds(300), "Disabled", false); |
+ watchdog1.Arm(); |
+ watchdog1.Disarm(); |
+ watchdog1.Arm(); |
+ watchdog1.Disarm(); |
+ |
+ Watchdog watchdog2(TimeDelta::FromMilliseconds(300), "Enabled", true); |
+ watchdog2.Arm(); |
+ watchdog2.Disarm(); |
+ watchdog2.Arm(); |
+ watchdog2.Disarm(); |
+} |
+ |
+// Make sure a basic alarm fires when the time has expired. |
+TEST_F(WatchdogTest, AlarmTest) { |
+ WatchdogCounter watchdog(TimeDelta::FromMilliseconds(10), "Enabled", true); |
+ watchdog.Arm(); |
+ SPIN_FOR_TIMEDELTA_OR_UNTIL_TRUE(TimeDelta::FromMinutes(5), |
+ watchdog.alarm_counter() > 0); |
+ EXPECT_EQ(1, watchdog.alarm_counter()); |
+} |
+ |
+// Make sure a basic alarm fires when the time has expired. |
+TEST_F(WatchdogTest, AlarmPriorTimeTest) { |
+ WatchdogCounter watchdog(TimeDelta(), "Enabled2", true); |
+ // Set a time in the past. |
+ watchdog.ArmSomeTimeDeltaAgo(TimeDelta::FromSeconds(2)); |
+ // It should instantly go off, but certainly in less than 5 minutes. |
+ SPIN_FOR_TIMEDELTA_OR_UNTIL_TRUE(TimeDelta::FromMinutes(5), |
+ watchdog.alarm_counter() > 0); |
+ |
+ EXPECT_EQ(1, watchdog.alarm_counter()); |
+} |
+ |
+// Make sure a disable alarm does nothing, even if we arm it. |
+TEST_F(WatchdogTest, ConstructorDisabledTest) { |
+ WatchdogCounter watchdog(TimeDelta::FromMilliseconds(10), "Disabled", false); |
+ watchdog.Arm(); |
+ // Alarm should not fire, as it was disabled. |
+ PlatformThread::Sleep(500); |
+ EXPECT_EQ(0, watchdog.alarm_counter()); |
+} |
+ |
+// Make sure Disarming will prevent firing, even after Arming. |
+TEST_F(WatchdogTest, DisarmTest) { |
+ WatchdogCounter watchdog(TimeDelta::FromSeconds(1), "Enabled3", true); |
+ |
+ TimeTicks start = TimeTicks::Now(); |
+ watchdog.Arm(); |
+ PlatformThread::Sleep(100); // Sleep a bit, but not past the alarm point. |
+ watchdog.Disarm(); |
+ TimeTicks end = TimeTicks::Now(); |
+ |
+ if (end - start > TimeDelta::FromMilliseconds(500)) { |
+ LOG(WARNING) << "100ms sleep took over 500ms, making the results of this " |
+ << "timing-sensitive test suspicious. Aborting now."; |
+ return; |
+ } |
+ |
+ // Alarm should not have fired before it was disarmed. |
+ EXPECT_EQ(0, watchdog.alarm_counter()); |
+ |
+ // Sleep past the point where it would have fired if it wasn't disarmed, |
+ // and verify that it didn't fire. |
+ PlatformThread::Sleep(1000); |
+ EXPECT_EQ(0, watchdog.alarm_counter()); |
+ |
+ // ...but even after disarming, we can still use the alarm... |
+ // Set a time greater than the timeout into the past. |
+ watchdog.ArmSomeTimeDeltaAgo(TimeDelta::FromSeconds(10)); |
+ // It should almost instantly go off, but certainly in less than 5 minutes. |
+ SPIN_FOR_TIMEDELTA_OR_UNTIL_TRUE(TimeDelta::FromMinutes(5), |
+ watchdog.alarm_counter() > 0); |
+ |
+ EXPECT_EQ(1, watchdog.alarm_counter()); |
+} |
+ |
+} // namespace base |
Property changes on: base/threading/watchdog_unittest.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |