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