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 21 matching lines...) Expand all Loading... |
32 | 32 |
33 int32_t buffer[2]; | 33 int32_t buffer[2]; |
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_SHOULD_WAIT, | 41 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
42 mp->ReadMessage(0, | 42 mp->ReadMessage(0, UserPointer<void>(buffer), |
43 buffer, &buffer_size, | 43 MakeUserPointer(&buffer_size), 0, NULL, |
44 0, NULL, | |
45 MOJO_READ_MESSAGE_FLAG_NONE)); | 44 MOJO_READ_MESSAGE_FLAG_NONE)); |
46 EXPECT_EQ(kBufferSize, buffer_size); | 45 EXPECT_EQ(kBufferSize, buffer_size); |
47 EXPECT_EQ(123, buffer[0]); | 46 EXPECT_EQ(123, buffer[0]); |
48 EXPECT_EQ(456, buffer[1]); | 47 EXPECT_EQ(456, buffer[1]); |
49 | 48 |
50 // Ditto for port 1. | 49 // Ditto for port 1. |
51 buffer[0] = 123; | 50 buffer[0] = 123; |
52 buffer[1] = 456; | 51 buffer[1] = 456; |
53 buffer_size = kBufferSize; | 52 buffer_size = kBufferSize; |
54 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 53 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
55 mp->ReadMessage(1, | 54 mp->ReadMessage(1, UserPointer<void>(buffer), |
56 buffer, &buffer_size, | 55 MakeUserPointer(&buffer_size), 0, NULL, |
57 0, NULL, | |
58 MOJO_READ_MESSAGE_FLAG_NONE)); | 56 MOJO_READ_MESSAGE_FLAG_NONE)); |
59 | 57 |
60 // Write from port 1 (to port 0). | 58 // Write from port 1 (to port 0). |
61 buffer[0] = 789012345; | 59 buffer[0] = 789012345; |
62 buffer[1] = 0; | 60 buffer[1] = 0; |
63 EXPECT_EQ(MOJO_RESULT_OK, | 61 EXPECT_EQ(MOJO_RESULT_OK, |
64 mp->WriteMessage(1, | 62 mp->WriteMessage(1, |
65 buffer, static_cast<uint32_t>(sizeof(buffer[0])), | 63 buffer, static_cast<uint32_t>(sizeof(buffer[0])), |
66 NULL, | 64 NULL, |
67 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 65 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
68 | 66 |
69 // Read from port 0. | 67 // Read from port 0. |
70 buffer[0] = 123; | 68 buffer[0] = 123; |
71 buffer[1] = 456; | 69 buffer[1] = 456; |
72 buffer_size = kBufferSize; | 70 buffer_size = kBufferSize; |
73 EXPECT_EQ(MOJO_RESULT_OK, | 71 EXPECT_EQ(MOJO_RESULT_OK, |
74 mp->ReadMessage(0, | 72 mp->ReadMessage(0, UserPointer<void>(buffer), |
75 buffer, &buffer_size, | 73 MakeUserPointer(&buffer_size), 0, NULL, |
76 0, NULL, | |
77 MOJO_READ_MESSAGE_FLAG_NONE)); | 74 MOJO_READ_MESSAGE_FLAG_NONE)); |
78 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); | 75 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
79 EXPECT_EQ(789012345, buffer[0]); | 76 EXPECT_EQ(789012345, buffer[0]); |
80 EXPECT_EQ(456, buffer[1]); | 77 EXPECT_EQ(456, buffer[1]); |
81 | 78 |
82 // Read again from port 0 -- it should be empty. | 79 // Read again from port 0 -- it should be empty. |
83 buffer_size = kBufferSize; | 80 buffer_size = kBufferSize; |
84 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 81 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
85 mp->ReadMessage(0, | 82 mp->ReadMessage(0, UserPointer<void>(buffer), |
86 buffer, &buffer_size, | 83 MakeUserPointer(&buffer_size), 0, NULL, |
87 0, NULL, | |
88 MOJO_READ_MESSAGE_FLAG_NONE)); | 84 MOJO_READ_MESSAGE_FLAG_NONE)); |
89 | 85 |
90 // Write two messages from port 0 (to port 1). | 86 // Write two messages from port 0 (to port 1). |
91 buffer[0] = 123456789; | 87 buffer[0] = 123456789; |
92 buffer[1] = 0; | 88 buffer[1] = 0; |
93 EXPECT_EQ(MOJO_RESULT_OK, | 89 EXPECT_EQ(MOJO_RESULT_OK, |
94 mp->WriteMessage(0, | 90 mp->WriteMessage(0, |
95 buffer, static_cast<uint32_t>(sizeof(buffer[0])), | 91 buffer, static_cast<uint32_t>(sizeof(buffer[0])), |
96 NULL, | 92 NULL, |
97 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 93 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
98 buffer[0] = 234567890; | 94 buffer[0] = 234567890; |
99 buffer[1] = 0; | 95 buffer[1] = 0; |
100 EXPECT_EQ(MOJO_RESULT_OK, | 96 EXPECT_EQ(MOJO_RESULT_OK, |
101 mp->WriteMessage(0, | 97 mp->WriteMessage(0, |
102 buffer, static_cast<uint32_t>(sizeof(buffer[0])), | 98 buffer, static_cast<uint32_t>(sizeof(buffer[0])), |
103 NULL, | 99 NULL, |
104 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 100 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
105 | 101 |
106 // Read from port 1 with buffer size 0 (should get the size of next message). | 102 // 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. | 103 // Also test that giving a null buffer is okay when the buffer size is 0. |
108 buffer_size = 0; | 104 buffer_size = 0; |
109 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, | 105 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
110 mp->ReadMessage(1, | 106 mp->ReadMessage(1, NullUserPointer(), MakeUserPointer(&buffer_size), |
111 NULL, &buffer_size, | |
112 0, NULL, | 107 0, NULL, |
113 MOJO_READ_MESSAGE_FLAG_NONE)); | 108 MOJO_READ_MESSAGE_FLAG_NONE)); |
114 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); | 109 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
115 | 110 |
116 // Read from port 1 with buffer size 1 (too small; should get the size of next | 111 // Read from port 1 with buffer size 1 (too small; should get the size of next |
117 // message). | 112 // message). |
118 buffer[0] = 123; | 113 buffer[0] = 123; |
119 buffer[1] = 456; | 114 buffer[1] = 456; |
120 buffer_size = 1; | 115 buffer_size = 1; |
121 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, | 116 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
122 mp->ReadMessage(1, | 117 mp->ReadMessage(1, UserPointer<void>(buffer), |
123 buffer, &buffer_size, | 118 MakeUserPointer(&buffer_size), 0, NULL, |
124 0, NULL, | |
125 MOJO_READ_MESSAGE_FLAG_NONE)); | 119 MOJO_READ_MESSAGE_FLAG_NONE)); |
126 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); | 120 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
127 EXPECT_EQ(123, buffer[0]); | 121 EXPECT_EQ(123, buffer[0]); |
128 EXPECT_EQ(456, buffer[1]); | 122 EXPECT_EQ(456, buffer[1]); |
129 | 123 |
130 // Read from port 1. | 124 // Read from port 1. |
131 buffer[0] = 123; | 125 buffer[0] = 123; |
132 buffer[1] = 456; | 126 buffer[1] = 456; |
133 buffer_size = kBufferSize; | 127 buffer_size = kBufferSize; |
134 EXPECT_EQ(MOJO_RESULT_OK, | 128 EXPECT_EQ(MOJO_RESULT_OK, |
135 mp->ReadMessage(1, | 129 mp->ReadMessage(1, UserPointer<void>(buffer), |
136 buffer, &buffer_size, | 130 MakeUserPointer(&buffer_size), 0, NULL, |
137 0, NULL, | |
138 MOJO_READ_MESSAGE_FLAG_NONE)); | 131 MOJO_READ_MESSAGE_FLAG_NONE)); |
139 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); | 132 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
140 EXPECT_EQ(123456789, buffer[0]); | 133 EXPECT_EQ(123456789, buffer[0]); |
141 EXPECT_EQ(456, buffer[1]); | 134 EXPECT_EQ(456, buffer[1]); |
142 | 135 |
143 // Read again from port 1. | 136 // Read again from port 1. |
144 buffer[0] = 123; | 137 buffer[0] = 123; |
145 buffer[1] = 456; | 138 buffer[1] = 456; |
146 buffer_size = kBufferSize; | 139 buffer_size = kBufferSize; |
147 EXPECT_EQ(MOJO_RESULT_OK, | 140 EXPECT_EQ(MOJO_RESULT_OK, |
148 mp->ReadMessage(1, | 141 mp->ReadMessage(1, UserPointer<void>(buffer), |
149 buffer, &buffer_size, | 142 MakeUserPointer(&buffer_size), 0, NULL, |
150 0, NULL, | |
151 MOJO_READ_MESSAGE_FLAG_NONE)); | 143 MOJO_READ_MESSAGE_FLAG_NONE)); |
152 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); | 144 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
153 EXPECT_EQ(234567890, buffer[0]); | 145 EXPECT_EQ(234567890, buffer[0]); |
154 EXPECT_EQ(456, buffer[1]); | 146 EXPECT_EQ(456, buffer[1]); |
155 | 147 |
156 // Read again from port 1 -- it should be empty. | 148 // Read again from port 1 -- it should be empty. |
157 buffer_size = kBufferSize; | 149 buffer_size = kBufferSize; |
158 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 150 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
159 mp->ReadMessage(1, | 151 mp->ReadMessage(1, UserPointer<void>(buffer), |
160 buffer, &buffer_size, | 152 MakeUserPointer(&buffer_size), 0, NULL, |
161 0, NULL, | |
162 MOJO_READ_MESSAGE_FLAG_NONE)); | 153 MOJO_READ_MESSAGE_FLAG_NONE)); |
163 | 154 |
164 // Write from port 0 (to port 1). | 155 // Write from port 0 (to port 1). |
165 buffer[0] = 345678901; | 156 buffer[0] = 345678901; |
166 buffer[1] = 0; | 157 buffer[1] = 0; |
167 EXPECT_EQ(MOJO_RESULT_OK, | 158 EXPECT_EQ(MOJO_RESULT_OK, |
168 mp->WriteMessage(0, | 159 mp->WriteMessage(0, |
169 buffer, static_cast<uint32_t>(sizeof(buffer[0])), | 160 buffer, static_cast<uint32_t>(sizeof(buffer[0])), |
170 NULL, | 161 NULL, |
171 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 162 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
172 | 163 |
173 // Close port 0. | 164 // Close port 0. |
174 mp->Close(0); | 165 mp->Close(0); |
175 | 166 |
176 // Try to write from port 1 (to port 0). | 167 // Try to write from port 1 (to port 0). |
177 buffer[0] = 456789012; | 168 buffer[0] = 456789012; |
178 buffer[1] = 0; | 169 buffer[1] = 0; |
179 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 170 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
180 mp->WriteMessage(1, | 171 mp->WriteMessage(1, |
181 buffer, static_cast<uint32_t>(sizeof(buffer[0])), | 172 buffer, static_cast<uint32_t>(sizeof(buffer[0])), |
182 NULL, | 173 NULL, |
183 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 174 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
184 | 175 |
185 // Read from port 1; should still get message (even though port 0 was closed). | 176 // Read from port 1; should still get message (even though port 0 was closed). |
186 buffer[0] = 123; | 177 buffer[0] = 123; |
187 buffer[1] = 456; | 178 buffer[1] = 456; |
188 buffer_size = kBufferSize; | 179 buffer_size = kBufferSize; |
189 EXPECT_EQ(MOJO_RESULT_OK, | 180 EXPECT_EQ(MOJO_RESULT_OK, |
190 mp->ReadMessage(1, | 181 mp->ReadMessage(1, UserPointer<void>(buffer), |
191 buffer, &buffer_size, | 182 MakeUserPointer(&buffer_size), 0, NULL, |
192 0, NULL, | |
193 MOJO_READ_MESSAGE_FLAG_NONE)); | 183 MOJO_READ_MESSAGE_FLAG_NONE)); |
194 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); | 184 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
195 EXPECT_EQ(345678901, buffer[0]); | 185 EXPECT_EQ(345678901, buffer[0]); |
196 EXPECT_EQ(456, buffer[1]); | 186 EXPECT_EQ(456, buffer[1]); |
197 | 187 |
198 // Read again from port 1 -- it should be empty (and port 0 is closed). | 188 // Read again from port 1 -- it should be empty (and port 0 is closed). |
199 buffer_size = kBufferSize; | 189 buffer_size = kBufferSize; |
200 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 190 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
201 mp->ReadMessage(1, | 191 mp->ReadMessage(1, UserPointer<void>(buffer), |
202 buffer, &buffer_size, | 192 MakeUserPointer(&buffer_size), 0, NULL, |
203 0, NULL, | |
204 MOJO_READ_MESSAGE_FLAG_NONE)); | 193 MOJO_READ_MESSAGE_FLAG_NONE)); |
205 | 194 |
206 mp->Close(1); | 195 mp->Close(1); |
207 } | 196 } |
208 | 197 |
209 TEST(MessagePipeTest, CloseWithQueuedIncomingMessages) { | 198 TEST(MessagePipeTest, CloseWithQueuedIncomingMessages) { |
210 scoped_refptr<MessagePipe> mp(new MessagePipe()); | 199 scoped_refptr<MessagePipe> mp(new MessagePipe()); |
211 | 200 |
212 int32_t buffer[1]; | 201 int32_t buffer[1]; |
213 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); | 202 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
214 uint32_t buffer_size; | 203 uint32_t buffer_size; |
215 | 204 |
216 // Write some messages from port 1 (to port 0). | 205 // Write some messages from port 1 (to port 0). |
217 for (int32_t i = 0; i < 5; i++) { | 206 for (int32_t i = 0; i < 5; i++) { |
218 buffer[0] = i; | 207 buffer[0] = i; |
219 EXPECT_EQ(MOJO_RESULT_OK, | 208 EXPECT_EQ(MOJO_RESULT_OK, |
220 mp->WriteMessage(1, | 209 mp->WriteMessage(1, |
221 buffer, kBufferSize, | 210 buffer, kBufferSize, |
222 NULL, | 211 NULL, |
223 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 212 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
224 } | 213 } |
225 | 214 |
226 // Port 0 shouldn't be empty. | 215 // Port 0 shouldn't be empty. |
227 buffer_size = 0; | 216 buffer_size = 0; |
228 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, | 217 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
229 mp->ReadMessage(0, | 218 mp->ReadMessage(0, NullUserPointer(), MakeUserPointer(&buffer_size), |
230 NULL, &buffer_size, | |
231 0, NULL, | 219 0, NULL, |
232 MOJO_READ_MESSAGE_FLAG_NONE)); | 220 MOJO_READ_MESSAGE_FLAG_NONE)); |
233 EXPECT_EQ(kBufferSize, buffer_size); | 221 EXPECT_EQ(kBufferSize, buffer_size); |
234 | 222 |
235 // Close port 0 first, which should have outstanding (incoming) messages. | 223 // Close port 0 first, which should have outstanding (incoming) messages. |
236 mp->Close(0); | 224 mp->Close(0); |
237 mp->Close(1); | 225 mp->Close(1); |
238 } | 226 } |
239 | 227 |
240 TEST(MessagePipeTest, DiscardMode) { | 228 TEST(MessagePipeTest, DiscardMode) { |
241 scoped_refptr<MessagePipe> mp(new MessagePipe()); | 229 scoped_refptr<MessagePipe> mp(new MessagePipe()); |
242 | 230 |
243 int32_t buffer[2]; | 231 int32_t buffer[2]; |
244 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); | 232 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
245 uint32_t buffer_size; | 233 uint32_t buffer_size; |
246 | 234 |
247 // Write from port 1 (to port 0). | 235 // Write from port 1 (to port 0). |
248 buffer[0] = 789012345; | 236 buffer[0] = 789012345; |
249 buffer[1] = 0; | 237 buffer[1] = 0; |
250 EXPECT_EQ(MOJO_RESULT_OK, | 238 EXPECT_EQ(MOJO_RESULT_OK, |
251 mp->WriteMessage(1, | 239 mp->WriteMessage(1, |
252 buffer, static_cast<uint32_t>(sizeof(buffer[0])), | 240 buffer, static_cast<uint32_t>(sizeof(buffer[0])), |
253 NULL, | 241 NULL, |
254 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 242 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
255 | 243 |
256 // Read/discard from port 0 (no buffer); get size. | 244 // Read/discard from port 0 (no buffer); get size. |
257 buffer_size = 0; | 245 buffer_size = 0; |
258 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, | 246 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
259 mp->ReadMessage(0, | 247 mp->ReadMessage(0, NullUserPointer(), MakeUserPointer(&buffer_size), |
260 NULL, &buffer_size, | |
261 0, NULL, | 248 0, NULL, |
262 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); | 249 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
263 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); | 250 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
264 | 251 |
265 // Read again from port 0 -- it should be empty. | 252 // Read again from port 0 -- it should be empty. |
266 buffer_size = kBufferSize; | 253 buffer_size = kBufferSize; |
267 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 254 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
268 mp->ReadMessage(0, | 255 mp->ReadMessage(0, UserPointer<void>(buffer), |
269 buffer, &buffer_size, | 256 MakeUserPointer(&buffer_size), 0, NULL, |
270 0, NULL, | |
271 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); | 257 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
272 | 258 |
273 // Write from port 1 (to port 0). | 259 // Write from port 1 (to port 0). |
274 buffer[0] = 890123456; | 260 buffer[0] = 890123456; |
275 buffer[1] = 0; | 261 buffer[1] = 0; |
276 EXPECT_EQ(MOJO_RESULT_OK, | 262 EXPECT_EQ(MOJO_RESULT_OK, |
277 mp->WriteMessage(1, | 263 mp->WriteMessage(1, |
278 buffer, static_cast<uint32_t>(sizeof(buffer[0])), | 264 buffer, static_cast<uint32_t>(sizeof(buffer[0])), |
279 NULL, | 265 NULL, |
280 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 266 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
281 | 267 |
282 // Read from port 0 (buffer big enough). | 268 // Read from port 0 (buffer big enough). |
283 buffer[0] = 123; | 269 buffer[0] = 123; |
284 buffer[1] = 456; | 270 buffer[1] = 456; |
285 buffer_size = kBufferSize; | 271 buffer_size = kBufferSize; |
286 EXPECT_EQ(MOJO_RESULT_OK, | 272 EXPECT_EQ(MOJO_RESULT_OK, |
287 mp->ReadMessage(0, | 273 mp->ReadMessage(0, UserPointer<void>(buffer), |
288 buffer, &buffer_size, | 274 MakeUserPointer(&buffer_size), 0, NULL, |
289 0, NULL, | |
290 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); | 275 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
291 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); | 276 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
292 EXPECT_EQ(890123456, buffer[0]); | 277 EXPECT_EQ(890123456, buffer[0]); |
293 EXPECT_EQ(456, buffer[1]); | 278 EXPECT_EQ(456, buffer[1]); |
294 | 279 |
295 // Read again from port 0 -- it should be empty. | 280 // Read again from port 0 -- it should be empty. |
296 buffer_size = kBufferSize; | 281 buffer_size = kBufferSize; |
297 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 282 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
298 mp->ReadMessage(0, | 283 mp->ReadMessage(0, UserPointer<void>(buffer), |
299 buffer, &buffer_size, | 284 MakeUserPointer(&buffer_size), 0, NULL, |
300 0, NULL, | |
301 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); | 285 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
302 | 286 |
303 // Write from port 1 (to port 0). | 287 // Write from port 1 (to port 0). |
304 buffer[0] = 901234567; | 288 buffer[0] = 901234567; |
305 buffer[1] = 0; | 289 buffer[1] = 0; |
306 EXPECT_EQ(MOJO_RESULT_OK, | 290 EXPECT_EQ(MOJO_RESULT_OK, |
307 mp->WriteMessage(1, | 291 mp->WriteMessage(1, |
308 buffer, static_cast<uint32_t>(sizeof(buffer[0])), | 292 buffer, static_cast<uint32_t>(sizeof(buffer[0])), |
309 NULL, | 293 NULL, |
310 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 294 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
311 | 295 |
312 // Read/discard from port 0 (buffer too small); get size. | 296 // Read/discard from port 0 (buffer too small); get size. |
313 buffer_size = 1; | 297 buffer_size = 1; |
314 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, | 298 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
315 mp->ReadMessage(0, | 299 mp->ReadMessage(0, UserPointer<void>(buffer), |
316 buffer, &buffer_size, | 300 MakeUserPointer(&buffer_size), 0, NULL, |
317 0, NULL, | |
318 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); | 301 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
319 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); | 302 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
320 | 303 |
321 // Read again from port 0 -- it should be empty. | 304 // Read again from port 0 -- it should be empty. |
322 buffer_size = kBufferSize; | 305 buffer_size = kBufferSize; |
323 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 306 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
324 mp->ReadMessage(0, | 307 mp->ReadMessage(0, UserPointer<void>(buffer), |
325 buffer, &buffer_size, | 308 MakeUserPointer(&buffer_size), 0, NULL, |
326 0, NULL, | |
327 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); | 309 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
328 | 310 |
329 // Write from port 1 (to port 0). | 311 // Write from port 1 (to port 0). |
330 buffer[0] = 123456789; | 312 buffer[0] = 123456789; |
331 buffer[1] = 0; | 313 buffer[1] = 0; |
332 EXPECT_EQ(MOJO_RESULT_OK, | 314 EXPECT_EQ(MOJO_RESULT_OK, |
333 mp->WriteMessage(1, | 315 mp->WriteMessage(1, |
334 buffer, static_cast<uint32_t>(sizeof(buffer[0])), | 316 buffer, static_cast<uint32_t>(sizeof(buffer[0])), |
335 NULL, | 317 NULL, |
336 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 318 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
337 | 319 |
338 // Discard from port 0. | 320 // Discard from port 0. |
339 buffer_size = 1; | 321 buffer_size = 1; |
340 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, | 322 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
341 mp->ReadMessage(0, | 323 mp->ReadMessage(0, NullUserPointer(), NullUserPointer(), 0, NULL, |
342 NULL, NULL, | |
343 0, NULL, | |
344 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); | 324 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
345 | 325 |
346 // Read again from port 0 -- it should be empty. | 326 // Read again from port 0 -- it should be empty. |
347 buffer_size = kBufferSize; | 327 buffer_size = kBufferSize; |
348 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 328 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
349 mp->ReadMessage(0, | 329 mp->ReadMessage(0, UserPointer<void>(buffer), |
350 buffer, &buffer_size, | 330 MakeUserPointer(&buffer_size), 0, NULL, |
351 0, NULL, | |
352 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); | 331 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
353 | 332 |
354 mp->Close(0); | 333 mp->Close(0); |
355 mp->Close(1); | 334 mp->Close(1); |
356 } | 335 } |
357 | 336 |
358 TEST(MessagePipeTest, BasicWaiting) { | 337 TEST(MessagePipeTest, BasicWaiting) { |
359 scoped_refptr<MessagePipe> mp(new MessagePipe()); | 338 scoped_refptr<MessagePipe> mp(new MessagePipe()); |
360 Waiter waiter; | 339 Waiter waiter; |
361 | 340 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
416 | 395 |
417 // But it should still be readable. | 396 // But it should still be readable. |
418 waiter.Init(); | 397 waiter.Init(); |
419 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 398 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
420 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 5)); | 399 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 5)); |
421 | 400 |
422 // Read from port 1. | 401 // Read from port 1. |
423 buffer[0] = 0; | 402 buffer[0] = 0; |
424 buffer_size = kBufferSize; | 403 buffer_size = kBufferSize; |
425 EXPECT_EQ(MOJO_RESULT_OK, | 404 EXPECT_EQ(MOJO_RESULT_OK, |
426 mp->ReadMessage(1, | 405 mp->ReadMessage(1, UserPointer<void>(buffer), |
427 buffer, &buffer_size, | 406 MakeUserPointer(&buffer_size), 0, NULL, |
428 0, NULL, | |
429 MOJO_READ_MESSAGE_FLAG_NONE)); | 407 MOJO_READ_MESSAGE_FLAG_NONE)); |
430 EXPECT_EQ(123456789, buffer[0]); | 408 EXPECT_EQ(123456789, buffer[0]); |
431 | 409 |
432 // Now port 1 should no longer be readable. | 410 // Now port 1 should no longer be readable. |
433 waiter.Init(); | 411 waiter.Init(); |
434 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 412 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
435 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 6)); | 413 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 6)); |
436 | 414 |
437 mp->Close(1); | 415 mp->Close(1); |
438 } | 416 } |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
516 mp->CancelAllWaiters(1); | 494 mp->CancelAllWaiters(1); |
517 mp->Close(1); | 495 mp->Close(1); |
518 } // Joins |thread|. | 496 } // Joins |thread|. |
519 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); | 497 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); |
520 EXPECT_EQ(3u, context); | 498 EXPECT_EQ(3u, context); |
521 } | 499 } |
522 | 500 |
523 } // namespace | 501 } // namespace |
524 } // namespace system | 502 } // namespace system |
525 } // namespace mojo | 503 } // namespace mojo |
OLD | NEW |