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/message_pipe.h" | 5 #include "mojo/system/message_pipe.h" |
6 | 6 |
7 #include "base/memory/ref_counted.h" | 7 #include "base/memory/ref_counted.h" |
8 #include "base/threading/platform_thread.h" // For |Sleep()|. | 8 #include "base/threading/platform_thread.h" // For |Sleep()|. |
9 #include "base/time/time.h" | 9 #include "base/time/time.h" |
10 #include "mojo/system/waiter.h" | 10 #include "mojo/system/waiter.h" |
(...skipping 23 matching lines...) Expand all Loading... |
34 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); | 34 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
35 uint32_t buffer_size; | 35 uint32_t buffer_size; |
36 | 36 |
37 // Nothing to read yet on port 0. | 37 // Nothing to read yet on port 0. |
38 buffer[0] = 123; | 38 buffer[0] = 123; |
39 buffer[1] = 456; | 39 buffer[1] = 456; |
40 buffer_size = kBufferSize; | 40 buffer_size = kBufferSize; |
41 EXPECT_EQ(MOJO_RESULT_NOT_FOUND, | 41 EXPECT_EQ(MOJO_RESULT_NOT_FOUND, |
42 mp->ReadMessage(0, | 42 mp->ReadMessage(0, |
43 buffer, &buffer_size, | 43 buffer, &buffer_size, |
44 NULL, NULL, | 44 0, NULL, |
45 MOJO_READ_MESSAGE_FLAG_NONE)); | 45 MOJO_READ_MESSAGE_FLAG_NONE)); |
46 EXPECT_EQ(kBufferSize, buffer_size); | 46 EXPECT_EQ(kBufferSize, buffer_size); |
47 EXPECT_EQ(123, buffer[0]); | 47 EXPECT_EQ(123, buffer[0]); |
48 EXPECT_EQ(456, buffer[1]); | 48 EXPECT_EQ(456, buffer[1]); |
49 | 49 |
50 // Ditto for port 1. | 50 // Ditto for port 1. |
51 buffer[0] = 123; | 51 buffer[0] = 123; |
52 buffer[1] = 456; | 52 buffer[1] = 456; |
53 buffer_size = kBufferSize; | 53 buffer_size = kBufferSize; |
54 EXPECT_EQ(MOJO_RESULT_NOT_FOUND, | 54 EXPECT_EQ(MOJO_RESULT_NOT_FOUND, |
55 mp->ReadMessage(1, | 55 mp->ReadMessage(1, |
56 buffer, &buffer_size, | 56 buffer, &buffer_size, |
57 NULL, NULL, | 57 0, NULL, |
58 MOJO_READ_MESSAGE_FLAG_NONE)); | 58 MOJO_READ_MESSAGE_FLAG_NONE)); |
59 | 59 |
60 // Write from port 1 (to port 0). | 60 // Write from port 1 (to port 0). |
61 buffer[0] = 789012345; | 61 buffer[0] = 789012345; |
62 buffer[1] = 0; | 62 buffer[1] = 0; |
63 EXPECT_EQ(MOJO_RESULT_OK, | 63 EXPECT_EQ(MOJO_RESULT_OK, |
64 mp->WriteMessage(1, | 64 mp->WriteMessage(1, |
65 buffer, static_cast<uint32_t>(sizeof(buffer[0])), | 65 buffer, static_cast<uint32_t>(sizeof(buffer[0])), |
66 NULL, 0, | 66 NULL, |
67 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 67 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
68 | 68 |
69 // Read from port 0. | 69 // Read from port 0. |
70 buffer[0] = 123; | 70 buffer[0] = 123; |
71 buffer[1] = 456; | 71 buffer[1] = 456; |
72 buffer_size = kBufferSize; | 72 buffer_size = kBufferSize; |
73 EXPECT_EQ(MOJO_RESULT_OK, | 73 EXPECT_EQ(MOJO_RESULT_OK, |
74 mp->ReadMessage(0, | 74 mp->ReadMessage(0, |
75 buffer, &buffer_size, | 75 buffer, &buffer_size, |
76 NULL, NULL, | 76 0, NULL, |
77 MOJO_READ_MESSAGE_FLAG_NONE)); | 77 MOJO_READ_MESSAGE_FLAG_NONE)); |
78 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); | 78 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
79 EXPECT_EQ(789012345, buffer[0]); | 79 EXPECT_EQ(789012345, buffer[0]); |
80 EXPECT_EQ(456, buffer[1]); | 80 EXPECT_EQ(456, buffer[1]); |
81 | 81 |
82 // Read again from port 0 -- it should be empty. | 82 // Read again from port 0 -- it should be empty. |
83 buffer_size = kBufferSize; | 83 buffer_size = kBufferSize; |
84 EXPECT_EQ(MOJO_RESULT_NOT_FOUND, | 84 EXPECT_EQ(MOJO_RESULT_NOT_FOUND, |
85 mp->ReadMessage(0, | 85 mp->ReadMessage(0, |
86 buffer, &buffer_size, | 86 buffer, &buffer_size, |
87 NULL, NULL, | 87 0, NULL, |
88 MOJO_READ_MESSAGE_FLAG_NONE)); | 88 MOJO_READ_MESSAGE_FLAG_NONE)); |
89 | 89 |
90 // Write two messages from port 0 (to port 1). | 90 // Write two messages from port 0 (to port 1). |
91 buffer[0] = 123456789; | 91 buffer[0] = 123456789; |
92 buffer[1] = 0; | 92 buffer[1] = 0; |
93 EXPECT_EQ(MOJO_RESULT_OK, | 93 EXPECT_EQ(MOJO_RESULT_OK, |
94 mp->WriteMessage(0, | 94 mp->WriteMessage(0, |
95 buffer, static_cast<uint32_t>(sizeof(buffer[0])), | 95 buffer, static_cast<uint32_t>(sizeof(buffer[0])), |
96 NULL, 0, | 96 NULL, |
97 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 97 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
98 buffer[0] = 234567890; | 98 buffer[0] = 234567890; |
99 buffer[1] = 0; | 99 buffer[1] = 0; |
100 EXPECT_EQ(MOJO_RESULT_OK, | 100 EXPECT_EQ(MOJO_RESULT_OK, |
101 mp->WriteMessage(0, | 101 mp->WriteMessage(0, |
102 buffer, static_cast<uint32_t>(sizeof(buffer[0])), | 102 buffer, static_cast<uint32_t>(sizeof(buffer[0])), |
103 NULL, 0, | 103 NULL, |
104 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 104 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
105 | 105 |
106 // Read from port 1 with buffer size 0 (should get the size of next message). | 106 // Read from port 1 with buffer size 0 (should get the size of next message). |
107 // Also test that giving a null buffer is okay when the buffer size is 0. | 107 // Also test that giving a null buffer is okay when the buffer size is 0. |
108 buffer_size = 0; | 108 buffer_size = 0; |
109 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, | 109 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
110 mp->ReadMessage(1, | 110 mp->ReadMessage(1, |
111 NULL, &buffer_size, | 111 NULL, &buffer_size, |
112 NULL, NULL, | 112 0, NULL, |
113 MOJO_READ_MESSAGE_FLAG_NONE)); | 113 MOJO_READ_MESSAGE_FLAG_NONE)); |
114 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); | 114 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
115 | 115 |
116 // Read from port 1 with buffer size 1 (too small; should get the size of next | 116 // Read from port 1 with buffer size 1 (too small; should get the size of next |
117 // message). | 117 // message). |
118 buffer[0] = 123; | 118 buffer[0] = 123; |
119 buffer[1] = 456; | 119 buffer[1] = 456; |
120 buffer_size = 1; | 120 buffer_size = 1; |
121 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, | 121 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
122 mp->ReadMessage(1, | 122 mp->ReadMessage(1, |
123 buffer, &buffer_size, | 123 buffer, &buffer_size, |
124 NULL, NULL, | 124 0, NULL, |
125 MOJO_READ_MESSAGE_FLAG_NONE)); | 125 MOJO_READ_MESSAGE_FLAG_NONE)); |
126 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); | 126 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
127 EXPECT_EQ(123, buffer[0]); | 127 EXPECT_EQ(123, buffer[0]); |
128 EXPECT_EQ(456, buffer[1]); | 128 EXPECT_EQ(456, buffer[1]); |
129 | 129 |
130 // Read from port 1. | 130 // Read from port 1. |
131 buffer[0] = 123; | 131 buffer[0] = 123; |
132 buffer[1] = 456; | 132 buffer[1] = 456; |
133 buffer_size = kBufferSize; | 133 buffer_size = kBufferSize; |
134 EXPECT_EQ(MOJO_RESULT_OK, | 134 EXPECT_EQ(MOJO_RESULT_OK, |
135 mp->ReadMessage(1, | 135 mp->ReadMessage(1, |
136 buffer, &buffer_size, | 136 buffer, &buffer_size, |
137 NULL, NULL, | 137 0, NULL, |
138 MOJO_READ_MESSAGE_FLAG_NONE)); | 138 MOJO_READ_MESSAGE_FLAG_NONE)); |
139 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); | 139 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
140 EXPECT_EQ(123456789, buffer[0]); | 140 EXPECT_EQ(123456789, buffer[0]); |
141 EXPECT_EQ(456, buffer[1]); | 141 EXPECT_EQ(456, buffer[1]); |
142 | 142 |
143 // Read again from port 1. | 143 // Read again from port 1. |
144 buffer[0] = 123; | 144 buffer[0] = 123; |
145 buffer[1] = 456; | 145 buffer[1] = 456; |
146 buffer_size = kBufferSize; | 146 buffer_size = kBufferSize; |
147 EXPECT_EQ(MOJO_RESULT_OK, | 147 EXPECT_EQ(MOJO_RESULT_OK, |
148 mp->ReadMessage(1, | 148 mp->ReadMessage(1, |
149 buffer, &buffer_size, | 149 buffer, &buffer_size, |
150 NULL, NULL, | 150 0, NULL, |
151 MOJO_READ_MESSAGE_FLAG_NONE)); | 151 MOJO_READ_MESSAGE_FLAG_NONE)); |
152 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); | 152 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
153 EXPECT_EQ(234567890, buffer[0]); | 153 EXPECT_EQ(234567890, buffer[0]); |
154 EXPECT_EQ(456, buffer[1]); | 154 EXPECT_EQ(456, buffer[1]); |
155 | 155 |
156 // Read again from port 1 -- it should be empty. | 156 // Read again from port 1 -- it should be empty. |
157 buffer_size = kBufferSize; | 157 buffer_size = kBufferSize; |
158 EXPECT_EQ(MOJO_RESULT_NOT_FOUND, | 158 EXPECT_EQ(MOJO_RESULT_NOT_FOUND, |
159 mp->ReadMessage(1, | 159 mp->ReadMessage(1, |
160 buffer, &buffer_size, | 160 buffer, &buffer_size, |
161 NULL, NULL, | 161 0, NULL, |
162 MOJO_READ_MESSAGE_FLAG_NONE)); | 162 MOJO_READ_MESSAGE_FLAG_NONE)); |
163 | 163 |
164 // Write from port 0 (to port 1). | 164 // Write from port 0 (to port 1). |
165 buffer[0] = 345678901; | 165 buffer[0] = 345678901; |
166 buffer[1] = 0; | 166 buffer[1] = 0; |
167 EXPECT_EQ(MOJO_RESULT_OK, | 167 EXPECT_EQ(MOJO_RESULT_OK, |
168 mp->WriteMessage(0, | 168 mp->WriteMessage(0, |
169 buffer, static_cast<uint32_t>(sizeof(buffer[0])), | 169 buffer, static_cast<uint32_t>(sizeof(buffer[0])), |
170 NULL, 0, | 170 NULL, |
171 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 171 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
172 | 172 |
173 // Close port 0. | 173 // Close port 0. |
174 mp->Close(0); | 174 mp->Close(0); |
175 | 175 |
176 // Try to write from port 1 (to port 0). | 176 // Try to write from port 1 (to port 0). |
177 buffer[0] = 456789012; | 177 buffer[0] = 456789012; |
178 buffer[1] = 0; | 178 buffer[1] = 0; |
179 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 179 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
180 mp->WriteMessage(1, | 180 mp->WriteMessage(1, |
181 buffer, static_cast<uint32_t>(sizeof(buffer[0])), | 181 buffer, static_cast<uint32_t>(sizeof(buffer[0])), |
182 NULL, 0, | 182 NULL, |
183 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 183 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
184 | 184 |
185 // Read from port 1; should still get message (even though port 0 was closed). | 185 // Read from port 1; should still get message (even though port 0 was closed). |
186 buffer[0] = 123; | 186 buffer[0] = 123; |
187 buffer[1] = 456; | 187 buffer[1] = 456; |
188 buffer_size = kBufferSize; | 188 buffer_size = kBufferSize; |
189 EXPECT_EQ(MOJO_RESULT_OK, | 189 EXPECT_EQ(MOJO_RESULT_OK, |
190 mp->ReadMessage(1, | 190 mp->ReadMessage(1, |
191 buffer, &buffer_size, | 191 buffer, &buffer_size, |
192 NULL, NULL, | 192 0, NULL, |
193 MOJO_READ_MESSAGE_FLAG_NONE)); | 193 MOJO_READ_MESSAGE_FLAG_NONE)); |
194 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); | 194 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
195 EXPECT_EQ(345678901, buffer[0]); | 195 EXPECT_EQ(345678901, buffer[0]); |
196 EXPECT_EQ(456, buffer[1]); | 196 EXPECT_EQ(456, buffer[1]); |
197 | 197 |
198 // Read again from port 1 -- it should be empty (and port 0 is closed). | 198 // Read again from port 1 -- it should be empty (and port 0 is closed). |
199 buffer_size = kBufferSize; | 199 buffer_size = kBufferSize; |
200 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 200 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
201 mp->ReadMessage(1, | 201 mp->ReadMessage(1, |
202 buffer, &buffer_size, | 202 buffer, &buffer_size, |
203 NULL, NULL, | 203 0, NULL, |
204 MOJO_READ_MESSAGE_FLAG_NONE)); | 204 MOJO_READ_MESSAGE_FLAG_NONE)); |
205 | 205 |
206 mp->Close(1); | 206 mp->Close(1); |
207 } | 207 } |
208 | 208 |
209 TEST(MessagePipeTest, CloseWithQueuedIncomingMessages) { | 209 TEST(MessagePipeTest, CloseWithQueuedIncomingMessages) { |
210 scoped_refptr<MessagePipe> mp(new MessagePipe()); | 210 scoped_refptr<MessagePipe> mp(new MessagePipe()); |
211 | 211 |
212 int32_t buffer[1]; | 212 int32_t buffer[1]; |
213 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); | 213 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
214 uint32_t buffer_size; | 214 uint32_t buffer_size; |
215 | 215 |
216 // Write some messages from port 1 (to port 0). | 216 // Write some messages from port 1 (to port 0). |
217 for (size_t i = 0; i < 5; i++) { | 217 for (size_t i = 0; i < 5; i++) { |
218 buffer[0] = i; | 218 buffer[0] = i; |
219 EXPECT_EQ(MOJO_RESULT_OK, | 219 EXPECT_EQ(MOJO_RESULT_OK, |
220 mp->WriteMessage(1, | 220 mp->WriteMessage(1, |
221 buffer, kBufferSize, | 221 buffer, kBufferSize, |
222 NULL, 0, | 222 NULL, |
223 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 223 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
224 } | 224 } |
225 | 225 |
226 // Port 0 shouldn't be empty. | 226 // Port 0 shouldn't be empty. |
227 buffer_size = 0; | 227 buffer_size = 0; |
228 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, | 228 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
229 mp->ReadMessage(0, | 229 mp->ReadMessage(0, |
230 NULL, &buffer_size, | 230 NULL, &buffer_size, |
231 NULL, NULL, | 231 0, NULL, |
232 MOJO_READ_MESSAGE_FLAG_NONE)); | 232 MOJO_READ_MESSAGE_FLAG_NONE)); |
233 EXPECT_EQ(kBufferSize, buffer_size); | 233 EXPECT_EQ(kBufferSize, buffer_size); |
234 | 234 |
235 // Close port 0 first, which should have outstanding (incoming) messages. | 235 // Close port 0 first, which should have outstanding (incoming) messages. |
236 mp->Close(0); | 236 mp->Close(0); |
237 mp->Close(1); | 237 mp->Close(1); |
238 } | 238 } |
239 | 239 |
240 TEST(MessagePipeTest, DiscardMode) { | 240 TEST(MessagePipeTest, DiscardMode) { |
241 scoped_refptr<MessagePipe> mp(new MessagePipe()); | 241 scoped_refptr<MessagePipe> mp(new MessagePipe()); |
242 | 242 |
243 int32_t buffer[2]; | 243 int32_t buffer[2]; |
244 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); | 244 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
245 uint32_t buffer_size; | 245 uint32_t buffer_size; |
246 | 246 |
247 // Write from port 1 (to port 0). | 247 // Write from port 1 (to port 0). |
248 buffer[0] = 789012345; | 248 buffer[0] = 789012345; |
249 buffer[1] = 0; | 249 buffer[1] = 0; |
250 EXPECT_EQ(MOJO_RESULT_OK, | 250 EXPECT_EQ(MOJO_RESULT_OK, |
251 mp->WriteMessage(1, | 251 mp->WriteMessage(1, |
252 buffer, static_cast<uint32_t>(sizeof(buffer[0])), | 252 buffer, static_cast<uint32_t>(sizeof(buffer[0])), |
253 NULL, 0, | 253 NULL, |
254 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 254 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
255 | 255 |
256 // Read/discard from port 0 (no buffer); get size. | 256 // Read/discard from port 0 (no buffer); get size. |
257 buffer_size = 0; | 257 buffer_size = 0; |
258 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, | 258 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
259 mp->ReadMessage(0, | 259 mp->ReadMessage(0, |
260 NULL, &buffer_size, | 260 NULL, &buffer_size, |
261 NULL, NULL, | 261 0, NULL, |
262 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); | 262 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
263 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); | 263 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
264 | 264 |
265 // Read again from port 0 -- it should be empty. | 265 // Read again from port 0 -- it should be empty. |
266 buffer_size = kBufferSize; | 266 buffer_size = kBufferSize; |
267 EXPECT_EQ(MOJO_RESULT_NOT_FOUND, | 267 EXPECT_EQ(MOJO_RESULT_NOT_FOUND, |
268 mp->ReadMessage(0, | 268 mp->ReadMessage(0, |
269 buffer, &buffer_size, | 269 buffer, &buffer_size, |
270 NULL, NULL, | 270 0, NULL, |
271 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); | 271 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
272 | 272 |
273 // Write from port 1 (to port 0). | 273 // Write from port 1 (to port 0). |
274 buffer[0] = 890123456; | 274 buffer[0] = 890123456; |
275 buffer[1] = 0; | 275 buffer[1] = 0; |
276 EXPECT_EQ(MOJO_RESULT_OK, | 276 EXPECT_EQ(MOJO_RESULT_OK, |
277 mp->WriteMessage(1, | 277 mp->WriteMessage(1, |
278 buffer, static_cast<uint32_t>(sizeof(buffer[0])), | 278 buffer, static_cast<uint32_t>(sizeof(buffer[0])), |
279 NULL, 0, | 279 NULL, |
280 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 280 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
281 | 281 |
282 // Read from port 0 (buffer big enough). | 282 // Read from port 0 (buffer big enough). |
283 buffer[0] = 123; | 283 buffer[0] = 123; |
284 buffer[1] = 456; | 284 buffer[1] = 456; |
285 buffer_size = kBufferSize; | 285 buffer_size = kBufferSize; |
286 EXPECT_EQ(MOJO_RESULT_OK, | 286 EXPECT_EQ(MOJO_RESULT_OK, |
287 mp->ReadMessage(0, | 287 mp->ReadMessage(0, |
288 buffer, &buffer_size, | 288 buffer, &buffer_size, |
289 NULL, NULL, | 289 0, NULL, |
290 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); | 290 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
291 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); | 291 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
292 EXPECT_EQ(890123456, buffer[0]); | 292 EXPECT_EQ(890123456, buffer[0]); |
293 EXPECT_EQ(456, buffer[1]); | 293 EXPECT_EQ(456, buffer[1]); |
294 | 294 |
295 // Read again from port 0 -- it should be empty. | 295 // Read again from port 0 -- it should be empty. |
296 buffer_size = kBufferSize; | 296 buffer_size = kBufferSize; |
297 EXPECT_EQ(MOJO_RESULT_NOT_FOUND, | 297 EXPECT_EQ(MOJO_RESULT_NOT_FOUND, |
298 mp->ReadMessage(0, | 298 mp->ReadMessage(0, |
299 buffer, &buffer_size, | 299 buffer, &buffer_size, |
300 NULL, NULL, | 300 0, NULL, |
301 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); | 301 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
302 | 302 |
303 // Write from port 1 (to port 0). | 303 // Write from port 1 (to port 0). |
304 buffer[0] = 901234567; | 304 buffer[0] = 901234567; |
305 buffer[1] = 0; | 305 buffer[1] = 0; |
306 EXPECT_EQ(MOJO_RESULT_OK, | 306 EXPECT_EQ(MOJO_RESULT_OK, |
307 mp->WriteMessage(1, | 307 mp->WriteMessage(1, |
308 buffer, static_cast<uint32_t>(sizeof(buffer[0])), | 308 buffer, static_cast<uint32_t>(sizeof(buffer[0])), |
309 NULL, 0, | 309 NULL, |
310 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 310 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
311 | 311 |
312 // Read/discard from port 0 (buffer too small); get size. | 312 // Read/discard from port 0 (buffer too small); get size. |
313 buffer_size = 1; | 313 buffer_size = 1; |
314 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, | 314 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
315 mp->ReadMessage(0, | 315 mp->ReadMessage(0, |
316 buffer, &buffer_size, | 316 buffer, &buffer_size, |
317 NULL, NULL, | 317 0, NULL, |
318 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); | 318 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
319 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); | 319 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
320 | 320 |
321 // Read again from port 0 -- it should be empty. | 321 // Read again from port 0 -- it should be empty. |
322 buffer_size = kBufferSize; | 322 buffer_size = kBufferSize; |
323 EXPECT_EQ(MOJO_RESULT_NOT_FOUND, | 323 EXPECT_EQ(MOJO_RESULT_NOT_FOUND, |
324 mp->ReadMessage(0, | 324 mp->ReadMessage(0, |
325 buffer, &buffer_size, | 325 buffer, &buffer_size, |
326 NULL, NULL, | 326 0, NULL, |
327 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); | 327 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
328 | 328 |
329 // Write from port 1 (to port 0). | 329 // Write from port 1 (to port 0). |
330 buffer[0] = 123456789; | 330 buffer[0] = 123456789; |
331 buffer[1] = 0; | 331 buffer[1] = 0; |
332 EXPECT_EQ(MOJO_RESULT_OK, | 332 EXPECT_EQ(MOJO_RESULT_OK, |
333 mp->WriteMessage(1, | 333 mp->WriteMessage(1, |
334 buffer, static_cast<uint32_t>(sizeof(buffer[0])), | 334 buffer, static_cast<uint32_t>(sizeof(buffer[0])), |
335 NULL, 0, | 335 NULL, |
336 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 336 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
337 | 337 |
338 // Discard from port 0. | 338 // Discard from port 0. |
339 buffer_size = 1; | 339 buffer_size = 1; |
340 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, | 340 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
341 mp->ReadMessage(0, | 341 mp->ReadMessage(0, |
342 NULL, NULL, | 342 NULL, NULL, |
343 NULL, NULL, | 343 0, NULL, |
344 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); | 344 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
345 | 345 |
346 // Read again from port 0 -- it should be empty. | 346 // Read again from port 0 -- it should be empty. |
347 buffer_size = kBufferSize; | 347 buffer_size = kBufferSize; |
348 EXPECT_EQ(MOJO_RESULT_NOT_FOUND, | 348 EXPECT_EQ(MOJO_RESULT_NOT_FOUND, |
349 mp->ReadMessage(0, | 349 mp->ReadMessage(0, |
350 buffer, &buffer_size, | 350 buffer, &buffer_size, |
351 NULL, NULL, | 351 0, NULL, |
352 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); | 352 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
353 | 353 |
354 mp->Close(0); | 354 mp->Close(0); |
355 mp->Close(1); | 355 mp->Close(1); |
356 } | 356 } |
357 | 357 |
358 TEST(MessagePipeTest, BasicWaiting) { | 358 TEST(MessagePipeTest, BasicWaiting) { |
359 scoped_refptr<MessagePipe> mp(new MessagePipe()); | 359 scoped_refptr<MessagePipe> mp(new MessagePipe()); |
360 Waiter waiter; | 360 Waiter waiter; |
361 | 361 |
(...skipping 17 matching lines...) Expand all Loading... |
379 EXPECT_EQ(MOJO_RESULT_OK, | 379 EXPECT_EQ(MOJO_RESULT_OK, |
380 mp->AddWaiter(0, &waiter, MOJO_WAIT_FLAG_READABLE, 1)); | 380 mp->AddWaiter(0, &waiter, MOJO_WAIT_FLAG_READABLE, 1)); |
381 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0)); | 381 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0)); |
382 mp->RemoveWaiter(0, &waiter); | 382 mp->RemoveWaiter(0, &waiter); |
383 | 383 |
384 // Write from port 0 (to port 1), to make port 1 readable. | 384 // Write from port 0 (to port 1), to make port 1 readable. |
385 buffer[0] = 123456789; | 385 buffer[0] = 123456789; |
386 EXPECT_EQ(MOJO_RESULT_OK, | 386 EXPECT_EQ(MOJO_RESULT_OK, |
387 mp->WriteMessage(0, | 387 mp->WriteMessage(0, |
388 buffer, kBufferSize, | 388 buffer, kBufferSize, |
389 NULL, 0, | 389 NULL, |
390 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 390 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
391 | 391 |
392 // Port 1 should already be readable now. | 392 // Port 1 should already be readable now. |
393 waiter.Init(); | 393 waiter.Init(); |
394 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 394 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
395 mp->AddWaiter(1, &waiter, MOJO_WAIT_FLAG_READABLE, 2)); | 395 mp->AddWaiter(1, &waiter, MOJO_WAIT_FLAG_READABLE, 2)); |
396 waiter.Init(); | 396 waiter.Init(); |
397 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 397 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
398 mp->AddWaiter(1, | 398 mp->AddWaiter(1, |
399 &waiter, | 399 &waiter, |
(...skipping 16 matching lines...) Expand all Loading... |
416 waiter.Init(); | 416 waiter.Init(); |
417 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 417 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
418 mp->AddWaiter(1, &waiter, MOJO_WAIT_FLAG_READABLE, 5)); | 418 mp->AddWaiter(1, &waiter, MOJO_WAIT_FLAG_READABLE, 5)); |
419 | 419 |
420 // Read from port 1. | 420 // Read from port 1. |
421 buffer[0] = 0; | 421 buffer[0] = 0; |
422 buffer_size = kBufferSize; | 422 buffer_size = kBufferSize; |
423 EXPECT_EQ(MOJO_RESULT_OK, | 423 EXPECT_EQ(MOJO_RESULT_OK, |
424 mp->ReadMessage(1, | 424 mp->ReadMessage(1, |
425 buffer, &buffer_size, | 425 buffer, &buffer_size, |
426 NULL, NULL, | 426 0, NULL, |
427 MOJO_READ_MESSAGE_FLAG_NONE)); | 427 MOJO_READ_MESSAGE_FLAG_NONE)); |
428 EXPECT_EQ(123456789, buffer[0]); | 428 EXPECT_EQ(123456789, buffer[0]); |
429 | 429 |
430 // Now port 1 should no longer be readable. | 430 // Now port 1 should no longer be readable. |
431 waiter.Init(); | 431 waiter.Init(); |
432 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 432 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
433 mp->AddWaiter(1, &waiter, MOJO_WAIT_FLAG_READABLE, 6)); | 433 mp->AddWaiter(1, &waiter, MOJO_WAIT_FLAG_READABLE, 6)); |
434 | 434 |
435 mp->Close(1); | 435 mp->Close(1); |
436 } | 436 } |
(...skipping 12 matching lines...) Expand all Loading... |
449 thread.waiter()->Init(); | 449 thread.waiter()->Init(); |
450 EXPECT_EQ(MOJO_RESULT_OK, | 450 EXPECT_EQ(MOJO_RESULT_OK, |
451 mp->AddWaiter(1, thread.waiter(), MOJO_WAIT_FLAG_READABLE, 0)); | 451 mp->AddWaiter(1, thread.waiter(), MOJO_WAIT_FLAG_READABLE, 0)); |
452 thread.Start(); | 452 thread.Start(); |
453 | 453 |
454 buffer[0] = 123456789; | 454 buffer[0] = 123456789; |
455 // Write from port 0 (to port 1), which should wake up the waiter. | 455 // Write from port 0 (to port 1), which should wake up the waiter. |
456 EXPECT_EQ(MOJO_RESULT_OK, | 456 EXPECT_EQ(MOJO_RESULT_OK, |
457 mp->WriteMessage(0, | 457 mp->WriteMessage(0, |
458 buffer, kBufferSize, | 458 buffer, kBufferSize, |
459 NULL, 0, | 459 NULL, |
460 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 460 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
461 | 461 |
462 mp->RemoveWaiter(1, thread.waiter()); | 462 mp->RemoveWaiter(1, thread.waiter()); |
463 | 463 |
464 mp->Close(0); | 464 mp->Close(0); |
465 mp->Close(1); | 465 mp->Close(1); |
466 } // Joins |thread|. | 466 } // Joins |thread|. |
467 // The waiter should have woken up successfully. | 467 // The waiter should have woken up successfully. |
468 EXPECT_EQ(0, result); | 468 EXPECT_EQ(0, result); |
469 | 469 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
507 | 507 |
508 mp->CancelAllWaiters(1); | 508 mp->CancelAllWaiters(1); |
509 mp->Close(1); | 509 mp->Close(1); |
510 } // Joins |thread|. | 510 } // Joins |thread|. |
511 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); | 511 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); |
512 } | 512 } |
513 | 513 |
514 } // namespace | 514 } // namespace |
515 } // namespace system | 515 } // namespace system |
516 } // namespace mojo | 516 } // namespace mojo |
OLD | NEW |