Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1052)

Side by Side Diff: base/message_pump_io_ios_unittest.cc

Issue 11412101: Provide an iOS message pump for IO implementation. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Response to review Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/message_pump_libevent.h" 5 #include "base/message_pump_io_ios.h"
6 6
7 #include <unistd.h> 7 #include <unistd.h>
8 8
9 #include "base/message_loop.h" 9 #include "base/message_loop.h"
10 #include "base/posix/eintr_wrapper.h" 10 #include "base/posix/eintr_wrapper.h"
11 #include "base/threading/thread.h" 11 #include "base/threading/thread.h"
12 #include "testing/gtest/include/gtest/gtest.h" 12 #include "testing/gtest/include/gtest/gtest.h"
13 13
14 #if defined(USE_SYSTEM_LIBEVENT)
15 #include <event.h>
16 #else
17 #include "third_party/libevent/event.h"
18 #endif
19
20 namespace base { 14 namespace base {
21 15
22 class MessagePumpLibeventTest : public testing::Test { 16 class MessagePumpIOSForIOTest : public testing::Test {
23 protected: 17 protected:
24 MessagePumpLibeventTest() 18 MessagePumpIOSForIOTest()
25 : ui_loop_(MessageLoop::TYPE_UI), 19 : ui_loop_(MessageLoop::TYPE_UI),
26 io_thread_("MessagePumpLibeventTestIOThread") {} 20 io_thread_("MessagePumpIOSForIOTestIOThread") {}
27 virtual ~MessagePumpLibeventTest() {} 21 virtual ~MessagePumpIOSForIOTest() {}
28 22
29 virtual void SetUp() OVERRIDE { 23 virtual void SetUp() {
30 Thread::Options options(MessageLoop::TYPE_IO, 0); 24 Thread::Options options(MessageLoop::TYPE_IO, 0);
31 ASSERT_TRUE(io_thread_.StartWithOptions(options)); 25 ASSERT_TRUE(io_thread_.StartWithOptions(options));
32 ASSERT_EQ(MessageLoop::TYPE_IO, io_thread_.message_loop()->type()); 26 ASSERT_EQ(MessageLoop::TYPE_IO, io_thread_.message_loop()->type());
33 int err = pipe(pipefds_); 27 int err = pipe(pipefds_);
wtc 2012/11/28 00:25:26 Nit: the return value of pipe() is the standard Un
blundell 2012/11/28 12:25:01 Done.
34 ASSERT_EQ(0, err); 28 ASSERT_EQ(0, err);
35 } 29 }
36 30
37 virtual void TearDown() OVERRIDE { 31 virtual void TearDown() OVERRIDE {
38 if (HANDLE_EINTR(close(pipefds_[0])) < 0) 32 if (HANDLE_EINTR(close(pipefds_[0])) < 0)
39 PLOG(ERROR) << "close"; 33 PLOG(ERROR) << "close";
40 if (HANDLE_EINTR(close(pipefds_[1])) < 0) 34 if (HANDLE_EINTR(close(pipefds_[1])) < 0)
41 PLOG(ERROR) << "close"; 35 PLOG(ERROR) << "close";
42 } 36 }
43 37
44 MessageLoop* ui_loop() { return &ui_loop_; } 38 MessageLoop* ui_loop() { return &ui_loop_; }
45 MessageLoopForIO* io_loop() const { 39 MessageLoopForIO* io_loop() const {
46 return static_cast<MessageLoopForIO*>(io_thread_.message_loop()); 40 return static_cast<MessageLoopForIO*>(io_thread_.message_loop());
47 } 41 }
48 42
49 void OnLibeventNotification( 43 void SetWatcherDelegate(MessageLoopForIO::FileDescriptorWatcher* watcher,
50 MessagePumpLibevent* pump, 44 MessageLoopForIO::Watcher* delegate) {
51 MessagePumpLibevent::FileDescriptorWatcher* controller) { 45 watcher->set_watcher(delegate);
52 pump->OnLibeventNotification(0, EV_WRITE | EV_READ, controller); 46 }
47
48 void HandleFdIOEvent(MessageLoopForIO::FileDescriptorWatcher* watcher) {
49 MessagePumpIOSForIO::HandleFdIOEvent(watcher->fdref_,
50 kCFFileDescriptorReadCallBack | kCFFileDescriptorWriteCallBack,
51 watcher);
53 } 52 }
54 53
55 MessageLoop ui_loop_; 54 MessageLoop ui_loop_;
56 Thread io_thread_; 55 Thread io_thread_;
56 DISALLOW_COPY_AND_ASSIGN(MessagePumpIOSForIOTest);
57 int pipefds_[2]; 57 int pipefds_[2];
wtc 2012/11/28 00:25:26 List pipefds_ before DISALLOW_COPY_AND_ASSIGN. Sh
blundell 2012/11/28 12:25:01 Made everything private that could be made private
58 }; 58 };
59 59
60 namespace { 60 namespace {
61 61
62 // Concrete implementation of MessagePumpLibevent::Watcher that does 62 // Concrete implementation of MessagePumpIOSForIO::Watcher that does
63 // nothing useful. 63 // nothing useful.
64 class StupidWatcher : public MessagePumpLibevent::Watcher { 64 class StupidWatcher : public MessagePumpIOSForIO::Watcher {
65 public: 65 public:
66 virtual ~StupidWatcher() {} 66 virtual ~StupidWatcher() {}
67 67
68 // base:MessagePumpLibevent::Watcher interface 68 // base:MessagePumpIOSForIO::Watcher interface
69 virtual void OnFileCanReadWithoutBlocking(int fd) OVERRIDE {} 69 virtual void OnFileCanReadWithoutBlocking(int fd) {}
70 virtual void OnFileCanWriteWithoutBlocking(int fd) OVERRIDE {} 70 virtual void OnFileCanWriteWithoutBlocking(int fd) {}
71 }; 71 };
72 72
73 #if GTEST_HAS_DEATH_TEST && !defined(NDEBUG) 73 #if GTEST_HAS_DEATH_TEST
74 74
75 // Test to make sure that we catch calling WatchFileDescriptor off of the 75 // Test to make sure that we catch calling WatchFileDescriptor off of the
76 // wrong thread. 76 // wrong thread.
77 TEST_F(MessagePumpLibeventTest, TestWatchingFromBadThread) { 77 TEST_F(MessagePumpIOSForIOTest, TestWatchingFromBadThread) {
78 MessagePumpLibevent::FileDescriptorWatcher watcher; 78 MessagePumpIOSForIO::FileDescriptorWatcher watcher;
79 StupidWatcher delegate; 79 StupidWatcher delegate;
80 80
81 ASSERT_DEATH(io_loop()->WatchFileDescriptor( 81 ASSERT_DEBUG_DEATH(io_loop()->WatchFileDescriptor(
82 STDOUT_FILENO, false, MessageLoopForIO::WATCH_READ, &watcher, &delegate), 82 STDOUT_FILENO, false, MessageLoopForIO::WATCH_READ, &watcher, &delegate),
83 "Check failed: " 83 "Check failed: "
84 "watch_file_descriptor_caller_checker_.CalledOnValidThread()"); 84 "watch_file_descriptor_caller_checker_.CalledOnValidThread()");
85 } 85 }
86 86
87 #endif // GTEST_HAS_DEATH_TEST && !defined(NDEBUG) 87 #endif // GTEST_HAS_DEATH_TEST
88 88
89 class BaseWatcher : public MessagePumpLibevent::Watcher { 89 class BaseWatcher : public MessagePumpIOSForIO::Watcher {
90 public: 90 public:
91 BaseWatcher(MessagePumpLibevent::FileDescriptorWatcher* controller) 91 BaseWatcher(MessagePumpIOSForIO::FileDescriptorWatcher* controller)
92 : controller_(controller) { 92 : controller_(controller) {
93 DCHECK(controller_); 93 DCHECK(controller_);
94 } 94 }
95 virtual ~BaseWatcher() {} 95 virtual ~BaseWatcher() {}
96 96
97 // base:MessagePumpLibevent::Watcher interface 97 // MessagePumpIOSForIO::Watcher interface
98 virtual void OnFileCanReadWithoutBlocking(int /* fd */) OVERRIDE { 98 virtual void OnFileCanReadWithoutBlocking(int /* fd */) OVERRIDE {
99 NOTREACHED(); 99 NOTREACHED();
100 } 100 }
101 101
102 virtual void OnFileCanWriteWithoutBlocking(int /* fd */) OVERRIDE { 102 virtual void OnFileCanWriteWithoutBlocking(int /* fd */) OVERRIDE {
103 NOTREACHED(); 103 NOTREACHED();
104 } 104 }
105 105
106 protected: 106 protected:
107 MessagePumpLibevent::FileDescriptorWatcher* controller_; 107 MessagePumpIOSForIO::FileDescriptorWatcher* controller_;
108 }; 108 };
109 109
110 class DeleteWatcher : public BaseWatcher { 110 class DeleteWatcher : public BaseWatcher {
111 public: 111 public:
112 explicit DeleteWatcher( 112 explicit DeleteWatcher(
113 MessagePumpLibevent::FileDescriptorWatcher* controller) 113 MessagePumpIOSForIO::FileDescriptorWatcher* controller)
114 : BaseWatcher(controller) {} 114 : BaseWatcher(controller) {}
115 115
116 virtual ~DeleteWatcher() { 116 virtual ~DeleteWatcher() {
117 DCHECK(!controller_); 117 DCHECK(!controller_);
118 } 118 }
119 119
120 virtual void OnFileCanWriteWithoutBlocking(int /* fd */) OVERRIDE { 120 virtual void OnFileCanWriteWithoutBlocking(int /* fd */) OVERRIDE {
121 DCHECK(controller_); 121 DCHECK(controller_);
122 delete controller_; 122 delete controller_;
123 controller_ = NULL; 123 controller_ = NULL;
124 } 124 }
125 }; 125 };
126 126
127 TEST_F(MessagePumpLibeventTest, DeleteWatcher) { 127 TEST_F(MessagePumpIOSForIOTest, DeleteWatcher) {
128 scoped_refptr<MessagePumpLibevent> pump(new MessagePumpLibevent); 128 scoped_refptr<MessagePumpIOSForIO> pump(new MessagePumpIOSForIO);
129 MessagePumpLibevent::FileDescriptorWatcher* watcher = 129 MessagePumpIOSForIO::FileDescriptorWatcher* watcher =
130 new MessagePumpLibevent::FileDescriptorWatcher; 130 new MessagePumpIOSForIO::FileDescriptorWatcher;
131 DeleteWatcher delegate(watcher); 131 DeleteWatcher delegate(watcher);
132 SetWatcherDelegate(watcher, &delegate);
133
132 pump->WatchFileDescriptor(pipefds_[1], 134 pump->WatchFileDescriptor(pipefds_[1],
133 false, MessagePumpLibevent::WATCH_READ_WRITE, watcher, &delegate); 135 false, MessagePumpIOSForIO::WATCH_READ_WRITE, watcher, &delegate);
134 136
135 // Spoof a libevent notification. 137 // Spoof a callback.
136 OnLibeventNotification(pump, watcher); 138 HandleFdIOEvent(watcher);
137 } 139 }
138 140
139 class StopWatcher : public BaseWatcher { 141 class StopWatcher : public BaseWatcher {
140 public: 142 public:
141 explicit StopWatcher( 143 explicit StopWatcher(
142 MessagePumpLibevent::FileDescriptorWatcher* controller) 144 MessagePumpIOSForIO::FileDescriptorWatcher* controller)
143 : BaseWatcher(controller) {} 145 : BaseWatcher(controller) {}
144 146
145 virtual ~StopWatcher() {} 147 virtual ~StopWatcher() {}
146 148
147 virtual void OnFileCanWriteWithoutBlocking(int /* fd */) OVERRIDE { 149 virtual void OnFileCanWriteWithoutBlocking(int /* fd */) OVERRIDE {
148 controller_->StopWatchingFileDescriptor(); 150 controller_->StopWatchingFileDescriptor();
149 } 151 }
150 }; 152 };
151 153
152 TEST_F(MessagePumpLibeventTest, StopWatcher) { 154 TEST_F(MessagePumpIOSForIOTest, StopWatcher) {
153 scoped_refptr<MessagePumpLibevent> pump(new MessagePumpLibevent); 155 scoped_refptr<MessagePumpIOSForIO> pump(new MessagePumpIOSForIO);
154 MessagePumpLibevent::FileDescriptorWatcher watcher; 156 MessagePumpIOSForIO::FileDescriptorWatcher watcher;
155 StopWatcher delegate(&watcher); 157 StopWatcher delegate(&watcher);
158 SetWatcherDelegate(&watcher, &delegate);
159
156 pump->WatchFileDescriptor(pipefds_[1], 160 pump->WatchFileDescriptor(pipefds_[1],
157 false, MessagePumpLibevent::WATCH_READ_WRITE, &watcher, &delegate); 161 false, MessagePumpIOSForIO::WATCH_READ_WRITE, &watcher, &delegate);
158 162
159 // Spoof a libevent notification. 163 // Spoof a callback.
160 OnLibeventNotification(pump, &watcher); 164 HandleFdIOEvent(&watcher);
161 } 165 }
162 166
163 } // namespace 167 } // namespace
164 168
165 } // namespace base 169 } // namespace base
170
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698