| // Copyright (c) 2013 The Chromium OS 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 "mist/event_dispatcher.h" |
| |
| #include <sys/epoll.h> |
| |
| #include <vector> |
| |
| #include <gtest/gtest.h> |
| |
| using base::MessageLoopForIO; |
| using std::vector; |
| |
| namespace mist { |
| |
| class TestFileDescriptorWatcher : public MessageLoopForIO::Watcher { |
| public: |
| void OnFileCanReadWithoutBlocking(int file_descriptor) {} |
| void OnFileCanWriteWithoutBlocking(int file_descriptor) {} |
| }; |
| |
| class EventDispatcherTest : public testing::Test { |
| protected: |
| void TearDown() { |
| // Close all file descriptors opened by CreatePollFileDescriptor(). |
| for (size_t i = 0; i < file_descriptors_.size(); ++i) { |
| close(file_descriptors_[i]); |
| } |
| file_descriptors_.clear(); |
| } |
| |
| // Creates and returns an epoll file descriptor that can be watched by |
| // EventDispatcher::StartWatchingFileDescriptor(). |
| int CreatePollFileDescriptor() { |
| int file_descriptor = epoll_create1(0); |
| EXPECT_NE(-1, file_descriptor); |
| file_descriptors_.push_back(file_descriptor); |
| return file_descriptor; |
| } |
| |
| EventDispatcher dispatcher_; |
| TestFileDescriptorWatcher watcher_; |
| vector<int> file_descriptors_; |
| }; |
| |
| TEST_F(EventDispatcherTest, StartAndStopWatchingFileDescriptor) { |
| int file_descriptor = CreatePollFileDescriptor(); |
| |
| // StopWatchingFileDescriptor on a file descriptor, which is not being |
| // watched, should fail. |
| EXPECT_FALSE(dispatcher_.StopWatchingFileDescriptor(file_descriptor)); |
| |
| EXPECT_TRUE(dispatcher_.StartWatchingFileDescriptor( |
| file_descriptor, MessageLoopForIO::WATCH_READ, &watcher_)); |
| |
| // StartWatchingFileDescriptor on the same file descriptor should be ok. |
| EXPECT_TRUE(dispatcher_.StartWatchingFileDescriptor( |
| file_descriptor, MessageLoopForIO::WATCH_READ, &watcher_)); |
| EXPECT_TRUE(dispatcher_.StartWatchingFileDescriptor( |
| file_descriptor, MessageLoopForIO::WATCH_WRITE, &watcher_)); |
| EXPECT_TRUE(dispatcher_.StartWatchingFileDescriptor( |
| file_descriptor, MessageLoopForIO::WATCH_READ_WRITE, &watcher_)); |
| |
| EXPECT_TRUE(dispatcher_.StopWatchingFileDescriptor(file_descriptor)); |
| EXPECT_FALSE(dispatcher_.StopWatchingFileDescriptor(file_descriptor)); |
| } |
| |
| TEST_F(EventDispatcherTest, StopWatchingAllFileDescriptors) { |
| int file_descriptor1 = CreatePollFileDescriptor(); |
| int file_descriptor2 = CreatePollFileDescriptor(); |
| |
| EXPECT_TRUE(dispatcher_.StartWatchingFileDescriptor( |
| file_descriptor1, MessageLoopForIO::WATCH_READ, &watcher_)); |
| EXPECT_TRUE(dispatcher_.StartWatchingFileDescriptor( |
| file_descriptor2, MessageLoopForIO::WATCH_READ, &watcher_)); |
| dispatcher_.StopWatchingAllFileDescriptors(); |
| EXPECT_FALSE(dispatcher_.StopWatchingFileDescriptor(file_descriptor1)); |
| EXPECT_FALSE(dispatcher_.StopWatchingFileDescriptor(file_descriptor2)); |
| } |
| |
| } // namespace mist |