diff options
author | willchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-09 21:20:41 +0000 |
---|---|---|
committer | willchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-09 21:20:41 +0000 |
commit | 9cfb89a8002a2fc6b0ea3fd4eccb33b6f4dd464a (patch) | |
tree | d30b49f072edfbdb4c812a0b34dc825c936dccbf /base/message_loop_unittest.cc | |
parent | 5d028b7b577d2efb96cd958ba4a7f1e5800fd9bb (diff) | |
download | chromium_src-9cfb89a8002a2fc6b0ea3fd4eccb33b6f4dd464a.zip chromium_src-9cfb89a8002a2fc6b0ea3fd4eccb33b6f4dd464a.tar.gz chromium_src-9cfb89a8002a2fc6b0ea3fd4eccb33b6f4dd464a.tar.bz2 |
Reland r49188.
It was reverted due to breaking a valgrind test which has since been disabled.
Review URL: http://codereview.chromium.org/2763004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@49320 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/message_loop_unittest.cc')
-rw-r--r-- | base/message_loop_unittest.cc | 81 |
1 files changed, 73 insertions, 8 deletions
diff --git a/base/message_loop_unittest.cc b/base/message_loop_unittest.cc index de039f2..ea04324 100644 --- a/base/message_loop_unittest.cc +++ b/base/message_loop_unittest.cc @@ -2,10 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "base/eintr_wrapper.h" #include "base/logging.h" #include "base/message_loop.h" #include "base/platform_thread.h" #include "base/ref_counted.h" +#include "base/task.h" #include "base/thread.h" #include "testing/gtest/include/gtest/gtest.h" @@ -1455,6 +1457,70 @@ TEST(MessageLoopTest, NonNestableDelayedInNestedLoop) { RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_IO, true); } +class DummyTask : public Task { + public: + DummyTask(int num_tasks) : num_tasks_(num_tasks) {} + + virtual void Run() { + if (num_tasks_ > 1) { + MessageLoop::current()->PostTask( + FROM_HERE, + new DummyTask(num_tasks_ - 1)); + } else { + MessageLoop::current()->Quit(); + } + } + + private: + const int num_tasks_; +}; + +class DummyTaskObserver : public MessageLoop::TaskObserver { + public: + DummyTaskObserver(int num_tasks) + : num_tasks_started_(0), + num_tasks_processed_(0), + num_tasks_(num_tasks) {} + + virtual ~DummyTaskObserver() {} + + virtual void WillProcessTask(base::TimeTicks /* birth_time */) { + num_tasks_started_++; + EXPECT_LE(num_tasks_started_, num_tasks_); + EXPECT_EQ(num_tasks_started_, num_tasks_processed_ + 1); + } + + virtual void DidProcessTask() { + num_tasks_processed_++; + EXPECT_LE(num_tasks_started_, num_tasks_); + EXPECT_EQ(num_tasks_started_, num_tasks_processed_); + } + + int num_tasks_started() const { return num_tasks_started_; } + int num_tasks_processed() const { return num_tasks_processed_; } + + private: + int num_tasks_started_; + int num_tasks_processed_; + const int num_tasks_; + + DISALLOW_COPY_AND_ASSIGN(DummyTaskObserver); +}; + +TEST(MessageLoopTest, TaskObserver) { + const int kNumTasks = 6; + DummyTaskObserver observer(kNumTasks); + + MessageLoop loop; + loop.AddTaskObserver(&observer); + loop.PostTask(FROM_HERE, new DummyTask(kNumTasks)); + loop.Run(); + loop.RemoveTaskObserver(&observer); + + EXPECT_EQ(kNumTasks, observer.num_tasks_started()); + EXPECT_EQ(kNumTasks, observer.num_tasks_processed()); +} + #if defined(OS_WIN) TEST(MessageLoopTest, Dispatcher) { // This test requires a UI loop @@ -1479,8 +1545,7 @@ TEST(MessageLoopTest, WaitForIO) { namespace { -class QuitDelegate : public - base::MessagePumpLibevent::Watcher { +class QuitDelegate : public base::MessagePumpLibevent::Watcher { public: virtual void OnFileCanWriteWithoutBlocking(int fd) { MessageLoop::current()->Quit(); @@ -1490,8 +1555,6 @@ class QuitDelegate : public } }; -} // namespace - TEST(MessageLoopTest, DISABLED_FileDescriptorWatcherOutlivesMessageLoop) { // Simulate a MessageLoop that dies before an FileDescriptorWatcher. // This could happen when people use the Singleton pattern or atexit. @@ -1518,8 +1581,8 @@ TEST(MessageLoopTest, DISABLED_FileDescriptorWatcherOutlivesMessageLoop) { // and don't run the message loop, just destroy it. } } - close(pipefds[0]); - close(pipefds[1]); + HANDLE_EINTR(close(pipefds[0])); + HANDLE_EINTR(close(pipefds[1])); } TEST(MessageLoopTest, FileDescriptorWatcherDoubleStop) { @@ -1541,8 +1604,10 @@ TEST(MessageLoopTest, FileDescriptorWatcherDoubleStop) { controller.StopWatchingFileDescriptor(); } } - close(pipefds[0]); - close(pipefds[1]); + HANDLE_EINTR(close(pipefds[0])); + HANDLE_EINTR(close(pipefds[1])); } +} // namespace + #endif // defined(OS_POSIX) |