OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |