| 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 |