summaryrefslogtreecommitdiffstats
path: root/base/timer_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'base/timer_unittest.cc')
-rw-r--r--base/timer_unittest.cc41
1 files changed, 41 insertions, 0 deletions
diff --git a/base/timer_unittest.cc b/base/timer_unittest.cc
index 1fb44a3..8c1d58e 100644
--- a/base/timer_unittest.cc
+++ b/base/timer_unittest.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "base/message_loop.h"
+#include "base/scoped_ptr.h"
#include "base/task.h"
#include "base/timer.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -28,6 +29,26 @@ class OneShotTimerTester {
base::OneShotTimer<OneShotTimerTester> timer_;
};
+class OneShotSelfDeletingTimerTester {
+ public:
+ OneShotSelfDeletingTimerTester(bool* did_run) :
+ did_run_(did_run),
+ timer_(new base::OneShotTimer<OneShotSelfDeletingTimerTester>()) {
+ }
+ void Start() {
+ timer_->Start(TimeDelta::FromMilliseconds(10), this,
+ &OneShotSelfDeletingTimerTester::Run);
+ }
+ private:
+ void Run() {
+ *did_run_ = true;
+ timer_.reset();
+ MessageLoop::current()->Quit();
+ }
+ bool* did_run_;
+ scoped_ptr<base::OneShotTimer<OneShotSelfDeletingTimerTester> > timer_;
+};
+
class RepeatingTimerTester {
public:
RepeatingTimerTester(bool* did_run) : did_run_(did_run), counter_(10) {
@@ -82,6 +103,18 @@ void RunTest_OneShotTimer_Cancel(MessageLoop::Type message_loop_type) {
EXPECT_TRUE(did_run_b);
}
+void RunTest_OneShotSelfDeletingTimer(MessageLoop::Type message_loop_type) {
+ MessageLoop loop(message_loop_type);
+
+ bool did_run = false;
+ OneShotSelfDeletingTimerTester f(&did_run);
+ f.Start();
+
+ MessageLoop::current()->Run();
+
+ EXPECT_TRUE(did_run);
+}
+
void RunTest_RepeatingTimer(MessageLoop::Type message_loop_type) {
MessageLoop loop(message_loop_type);
@@ -134,6 +167,14 @@ TEST(TimerTest, OneShotTimer_Cancel) {
RunTest_OneShotTimer_Cancel(MessageLoop::TYPE_IO);
}
+// If underline timer does not handle properly, we will crash or fail
+// in full page heap or purify environment.
+TEST(TimerTest, OneShotSelfDeletingTimer) {
+ RunTest_OneShotSelfDeletingTimer(MessageLoop::TYPE_DEFAULT);
+ RunTest_OneShotSelfDeletingTimer(MessageLoop::TYPE_UI);
+ RunTest_OneShotSelfDeletingTimer(MessageLoop::TYPE_IO);
+}
+
TEST(TimerTest, RepeatingTimer) {
RunTest_RepeatingTimer(MessageLoop::TYPE_DEFAULT);
RunTest_RepeatingTimer(MessageLoop::TYPE_UI);