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

Side by Side Diff: mojo/system/core_impl_unittest.cc

Issue 67413003: Mojo: Implement plumbing to support passing handles over MessagePipes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: old chunk mismatch Created 7 years, 1 month 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "mojo/system/core_impl.h" 5 #include "mojo/system/core_impl.h"
6 6
7 #include <limits>
8
7 #include "mojo/system/core_test_base.h" 9 #include "mojo/system/core_test_base.h"
8 10
9 namespace mojo { 11 namespace mojo {
10 namespace system { 12 namespace system {
11 namespace { 13 namespace {
12 14
13 class CoreImplTest : public test::CoreTestBase { 15 class CoreImplTest : public test::CoreTestBase {
14 }; 16 };
15 17
16 TEST_F(CoreImplTest, Basic) { 18 TEST_F(CoreImplTest, Basic) {
(...skipping 18 matching lines...) Expand all
35 uint32_t num_bytes = 0; 37 uint32_t num_bytes = 0;
36 EXPECT_EQ(MOJO_RESULT_OK, 38 EXPECT_EQ(MOJO_RESULT_OK,
37 core()->ReadMessage(h, NULL, &num_bytes, NULL, NULL, 39 core()->ReadMessage(h, NULL, &num_bytes, NULL, NULL,
38 MOJO_READ_MESSAGE_FLAG_NONE)); 40 MOJO_READ_MESSAGE_FLAG_NONE));
39 EXPECT_EQ(1u, info.GetReadMessageCallCount()); 41 EXPECT_EQ(1u, info.GetReadMessageCallCount());
40 num_bytes = 1; 42 num_bytes = 1;
41 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 43 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
42 core()->ReadMessage(h, NULL, &num_bytes, NULL, NULL, 44 core()->ReadMessage(h, NULL, &num_bytes, NULL, NULL,
43 MOJO_READ_MESSAGE_FLAG_NONE)); 45 MOJO_READ_MESSAGE_FLAG_NONE));
44 EXPECT_EQ(2u, info.GetReadMessageCallCount()); 46 EXPECT_EQ(2u, info.GetReadMessageCallCount());
47 EXPECT_EQ(MOJO_RESULT_OK,
48 core()->ReadMessage(h, NULL, NULL, NULL, NULL,
49 MOJO_READ_MESSAGE_FLAG_NONE));
50 EXPECT_EQ(3u, info.GetReadMessageCallCount());
45 51
46 EXPECT_EQ(0u, info.GetAddWaiterCallCount()); 52 EXPECT_EQ(0u, info.GetAddWaiterCallCount());
47 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 53 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
48 core()->Wait(h, MOJO_WAIT_FLAG_EVERYTHING, 54 core()->Wait(h, MOJO_WAIT_FLAG_EVERYTHING,
49 MOJO_DEADLINE_INDEFINITE)); 55 MOJO_DEADLINE_INDEFINITE));
50 EXPECT_EQ(1u, info.GetAddWaiterCallCount()); 56 EXPECT_EQ(1u, info.GetAddWaiterCallCount());
51 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 57 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
52 core()->Wait(h, MOJO_WAIT_FLAG_EVERYTHING, 0)); 58 core()->Wait(h, MOJO_WAIT_FLAG_EVERYTHING, 0));
53 EXPECT_EQ(2u, info.GetAddWaiterCallCount()); 59 EXPECT_EQ(2u, info.GetAddWaiterCallCount());
54 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 60 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 handles[1] = handles[0] + 1; // Invalid handle. 132 handles[1] = handles[0] + 1; // Invalid handle.
127 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 133 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
128 core()->WaitMany(handles, flags, 2, MOJO_DEADLINE_INDEFINITE)); 134 core()->WaitMany(handles, flags, 2, MOJO_DEADLINE_INDEFINITE));
129 handles[1] = CreateMockHandle(&info[1]); 135 handles[1] = CreateMockHandle(&info[1]);
130 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 136 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
131 core()->WaitMany(handles, flags, 2, MOJO_DEADLINE_INDEFINITE)); 137 core()->WaitMany(handles, flags, 2, MOJO_DEADLINE_INDEFINITE));
132 138
133 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[0])); 139 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[0]));
134 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[1])); 140 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[1]));
135 } 141 }
142
143 // |CreateMessagePipe()|:
144 {
145 MojoHandle h;
146 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
147 core()->CreateMessagePipe(NULL, NULL));
148 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
149 core()->CreateMessagePipe(&h, NULL));
150 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
151 core()->CreateMessagePipe(NULL, &h));
152 }
153
154 // |WriteMessage()|:
155 // Only check arguments checked by |CoreImpl|, namely |handle|, |handles|, and
156 // |num_handles|.
157 {
158 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
159 core()->WriteMessage(MOJO_HANDLE_INVALID, NULL, 0, NULL, 0,
160 MOJO_WRITE_MESSAGE_FLAG_NONE));
161
162 MockHandleInfo info;
163 MojoHandle h = CreateMockHandle(&info);
164 MojoHandle handles[2] = { MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID };
165
166 // Null |handles| with nonzero |num_handles|.
167 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
168 core()->WriteMessage(h, NULL, 0, NULL, 1,
169 MOJO_WRITE_MESSAGE_FLAG_NONE));
170 // Checked by |CoreImpl|, shouldn't go through to the dispatcher.
171 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
172
173 // Huge handle count (implausibly big on some systems -- more than can be
174 // stored in a 32-bit address space).
175 // Note: This may return either |MOJO_RESULT_INVALID_ARGUMENT| or
176 // |MOJO_RESULT_RESOURCE_EXHAUSTED|, depending on whether it's plausible or
177 // not.
178 EXPECT_NE(MOJO_RESULT_OK,
179 core()->WriteMessage(h, NULL, 0, handles,
180 std::numeric_limits<uint32_t>::max(),
181 MOJO_WRITE_MESSAGE_FLAG_NONE));
182 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
183
184 // Huge handle count (plausibly big).
185 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
186 core()->WriteMessage(h, NULL, 0, handles,
187 std::numeric_limits<uint32_t>::max() /
188 sizeof(handles[0]),
189 MOJO_WRITE_MESSAGE_FLAG_NONE));
190 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
191
192 // Invalid handle in |handles|.
193 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
194 core()->WriteMessage(h, NULL, 0, handles, 1,
195 MOJO_WRITE_MESSAGE_FLAG_NONE));
196 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
197
198 // Two invalid handles in |handles|.
199 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
200 core()->WriteMessage(h, NULL, 0, handles, 2,
201 MOJO_WRITE_MESSAGE_FLAG_NONE));
202 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
203
204 // Can't send a handle over itself.
205 handles[0] = h;
206 EXPECT_EQ(MOJO_RESULT_BUSY,
207 core()->WriteMessage(h, NULL, 0, handles, 1,
208 MOJO_WRITE_MESSAGE_FLAG_NONE));
209 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
210
211 MockHandleInfo info_2;
212 MojoHandle h_2 = CreateMockHandle(&info_2);
213
214 // This is "okay", but |MockDispatcher| doesn't implement it.
215 handles[0] = h_2;
216 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
217 core()->WriteMessage(h, NULL, 0, handles, 1,
218 MOJO_WRITE_MESSAGE_FLAG_NONE));
219 EXPECT_EQ(1u, info.GetWriteMessageCallCount());
220
221 // One of the |handles| is still invalid.
222 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
223 core()->WriteMessage(h, NULL, 0, handles, 2,
224 MOJO_WRITE_MESSAGE_FLAG_NONE));
225 EXPECT_EQ(1u, info.GetWriteMessageCallCount());
226
227 // One of the |handles| is the same as |handle|.
228 handles[1] = h;
229 EXPECT_EQ(MOJO_RESULT_BUSY,
230 core()->WriteMessage(h, NULL, 0, handles, 2,
231 MOJO_WRITE_MESSAGE_FLAG_NONE));
232 EXPECT_EQ(1u, info.GetWriteMessageCallCount());
233
234 // Can't send a handle twice in the same message.
235 handles[1] = h_2;
236 EXPECT_EQ(MOJO_RESULT_BUSY,
237 core()->WriteMessage(h, NULL, 0, handles, 2,
238 MOJO_WRITE_MESSAGE_FLAG_NONE));
239 EXPECT_EQ(1u, info.GetWriteMessageCallCount());
240
241 // Note: Since we never successfully sent anything with it, |h_2| should
242 // still be valid.
243 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_2));
244
245 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
246 }
247
248 // |ReadMessage()|:
249 // Only check arguments checked by |CoreImpl|, namely |handle|, |handles|, and
250 // |num_handles|.
251 {
252 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
253 core()->ReadMessage(MOJO_HANDLE_INVALID, NULL, NULL, NULL, NULL,
254 MOJO_READ_MESSAGE_FLAG_NONE));
255
256 MockHandleInfo info;
257 MojoHandle h = CreateMockHandle(&info);
258
259 uint32_t handle_count = 1;
260 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
261 core()->ReadMessage(h, NULL, NULL, NULL, &handle_count,
262 MOJO_READ_MESSAGE_FLAG_NONE));
263 // Checked by |CoreImpl|, shouldn't go through to the dispatcher.
264 EXPECT_EQ(0u, info.GetReadMessageCallCount());
265
266 // Okay.
267 handle_count = 0;
268 EXPECT_EQ(MOJO_RESULT_OK,
269 core()->ReadMessage(h, NULL, NULL, NULL, &handle_count,
270 MOJO_READ_MESSAGE_FLAG_NONE));
271 // Checked by |CoreImpl|, shouldn't go through to the dispatcher.
272 EXPECT_EQ(1u, info.GetReadMessageCallCount());
273
274 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
275 }
136 } 276 }
137 277
138 // TODO(vtl): test |Wait()| and |WaitMany()| properly 278 // TODO(vtl): test |Wait()| and |WaitMany()| properly
139 // - including |WaitMany()| with the same handle more than once (with 279 // - including |WaitMany()| with the same handle more than once (with
140 // same/different flags) 280 // same/different flags)
141 281
142 TEST_F(CoreImplTest, MessagePipe) { 282 TEST_F(CoreImplTest, MessagePipe) {
143 MojoHandle h[2]; 283 MojoHandle h[2];
144 284
145 EXPECT_EQ(MOJO_RESULT_OK, core()->CreateMessagePipe(&h[0], &h[1])); 285 EXPECT_EQ(MOJO_RESULT_OK, core()->CreateMessagePipe(&h[0], &h[1]));
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
236 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 376 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
237 core()->WriteMessage(h[1], buffer, 1, NULL, 0, 377 core()->WriteMessage(h[1], buffer, 1, NULL, 0,
238 MOJO_WRITE_MESSAGE_FLAG_NONE)); 378 MOJO_WRITE_MESSAGE_FLAG_NONE));
239 379
240 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[1])); 380 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[1]));
241 } 381 }
242 382
243 } // namespace 383 } // namespace
244 } // namespace system 384 } // namespace system
245 } // namespace mojo 385 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698