Index: base/message_loop/message_pump_libevent_unittest.cc |
diff --git a/base/message_loop/message_pump_libevent_unittest.cc b/base/message_loop/message_pump_libevent_unittest.cc |
index 4530e188179308c0b0d75ef897e4aefda5ac147a..9298d687609cff87a05f43f1a1c55e728ef8fb5a 100644 |
--- a/base/message_loop/message_pump_libevent_unittest.cc |
+++ b/base/message_loop/message_pump_libevent_unittest.cc |
@@ -6,8 +6,10 @@ |
#include <unistd.h> |
+#include "base/bind.h" |
#include "base/message_loop/message_loop.h" |
#include "base/posix/eintr_wrapper.h" |
+#include "base/run_loop.h" |
#include "base/threading/thread.h" |
#include "testing/gtest/include/gtest/gtest.h" |
#include "third_party/libevent/event.h" |
@@ -81,6 +83,12 @@ TEST_F(MessagePumpLibeventTest, TestWatchingFromBadThread) { |
"watch_file_descriptor_caller_checker_.CalledOnValidThread\\(\\)"); |
} |
+TEST_F(MessagePumpLibeventTest, QuitOutsideOfRun) { |
+ scoped_ptr<MessagePumpLibevent> pump(new MessagePumpLibevent); |
+ ASSERT_DEATH(pump->Quit(), "Check failed: in_run_. " |
+ "Quit was called outside of Run!"); |
+} |
+ |
#endif // GTEST_HAS_DEATH_TEST && !defined(NDEBUG) |
class BaseWatcher : public MessagePumpLibevent::Watcher { |
@@ -157,6 +165,41 @@ TEST_F(MessagePumpLibeventTest, StopWatcher) { |
OnLibeventNotification(pump.get(), &watcher); |
} |
+void QuitMessageLoopAndStart(const Closure& quit_closure) { |
+ quit_closure.Run(); |
+ |
+ MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); |
+ RunLoop runloop; |
+ MessageLoop::current()->PostTask(FROM_HERE, runloop.QuitClosure()); |
+ runloop.Run(); |
+} |
+ |
+class NestedPumpWatcher : public MessagePumpLibevent::Watcher { |
+ public: |
+ NestedPumpWatcher() {} |
+ virtual ~NestedPumpWatcher() {} |
+ |
+ virtual void OnFileCanReadWithoutBlocking(int /* fd */) OVERRIDE { |
+ RunLoop runloop; |
+ MessageLoop::current()->PostTask(FROM_HERE, Bind(&QuitMessageLoopAndStart, |
+ runloop.QuitClosure())); |
+ runloop.Run(); |
+ } |
+ |
+ virtual void OnFileCanWriteWithoutBlocking(int /* fd */) OVERRIDE {} |
+}; |
+ |
+TEST_F(MessagePumpLibeventTest, NestedPumpWatcher) { |
+ scoped_ptr<MessagePumpLibevent> pump(new MessagePumpLibevent); |
+ MessagePumpLibevent::FileDescriptorWatcher watcher; |
+ NestedPumpWatcher delegate; |
+ pump->WatchFileDescriptor(pipefds_[1], |
+ false, MessagePumpLibevent::WATCH_READ, &watcher, &delegate); |
+ |
+ // Spoof a libevent notification. |
+ OnLibeventNotification(pump.get(), &watcher); |
+} |
+ |
} // namespace |
} // namespace base |