| 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/edk/system/local_data_pipe.h" | 5 #include "mojo/edk/system/local_data_pipe.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include "base/macros.h" | 9 #include "base/macros.h" |
| 10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
| 11 #include "mojo/edk/system/data_pipe.h" | 11 #include "mojo/edk/system/data_pipe.h" |
| 12 #include "mojo/edk/system/waiter.h" | 12 #include "mojo/edk/system/waiter.h" |
| 13 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| 14 | 14 |
| 15 namespace mojo { | 15 namespace mojo { |
| 16 namespace system { | 16 namespace system { |
| 17 namespace { | 17 namespace { |
| 18 | 18 |
| 19 const uint32_t kSizeOfOptions = | 19 const uint32_t kSizeOfOptions = |
| 20 static_cast<uint32_t>(sizeof(MojoCreateDataPipeOptions)); | 20 static_cast<uint32_t>(sizeof(MojoCreateDataPipeOptions)); |
| 21 | 21 |
| 22 // Validate options. | 22 // Validate options. |
| 23 TEST(LocalDataPipeTest, Creation) { | 23 TEST(LocalDataPipeTest, Creation) { |
| 24 // Create using default options. | 24 // Create using default options. |
| 25 { | 25 { |
| 26 // Get default options. | 26 // Get default options. |
| 27 MojoCreateDataPipeOptions default_options = {0}; | 27 MojoCreateDataPipeOptions default_options = {0}; |
| 28 EXPECT_EQ( | 28 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( |
| 29 MOJO_RESULT_OK, | 29 NullUserPointer(), &default_options)); |
| 30 DataPipe::ValidateCreateOptions(NullUserPointer(), &default_options)); | |
| 31 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(default_options)); | 30 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(default_options)); |
| 32 dp->ProducerClose(); | 31 dp->ProducerClose(); |
| 33 dp->ConsumerClose(); | 32 dp->ConsumerClose(); |
| 34 } | 33 } |
| 35 | 34 |
| 36 // Create using non-default options. | 35 // Create using non-default options. |
| 37 { | 36 { |
| 38 const MojoCreateDataPipeOptions options = { | 37 const MojoCreateDataPipeOptions options = { |
| 39 kSizeOfOptions, // |struct_size|. | 38 kSizeOfOptions, // |struct_size|. |
| 40 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 39 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 } | 97 } |
| 99 | 98 |
| 100 TEST(LocalDataPipeTest, SimpleReadWrite) { | 99 TEST(LocalDataPipeTest, SimpleReadWrite) { |
| 101 const MojoCreateDataPipeOptions options = { | 100 const MojoCreateDataPipeOptions options = { |
| 102 kSizeOfOptions, // |struct_size|. | 101 kSizeOfOptions, // |struct_size|. |
| 103 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 102 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| 104 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 103 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
| 105 1000 * sizeof(int32_t) // |capacity_num_bytes|. | 104 1000 * sizeof(int32_t) // |capacity_num_bytes|. |
| 106 }; | 105 }; |
| 107 MojoCreateDataPipeOptions validated_options = {0}; | 106 MojoCreateDataPipeOptions validated_options = {0}; |
| 108 EXPECT_EQ(MOJO_RESULT_OK, | 107 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( |
| 109 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), | 108 MakeUserPointer(&options), &validated_options)); |
| 110 &validated_options)); | |
| 111 | 109 |
| 112 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 110 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 113 | 111 |
| 114 int32_t elements[10] = {0}; | 112 int32_t elements[10] = {0}; |
| 115 uint32_t num_bytes = 0; | 113 uint32_t num_bytes = 0; |
| 116 | 114 |
| 117 // Try reading; nothing there yet. | 115 // Try reading; nothing there yet. |
| 118 num_bytes = static_cast<uint32_t>(arraysize(elements) * sizeof(elements[0])); | 116 num_bytes = static_cast<uint32_t>(arraysize(elements) * sizeof(elements[0])); |
| 119 EXPECT_EQ( | 117 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
| 120 MOJO_RESULT_SHOULD_WAIT, | 118 dp->ConsumerReadData(UserPointer<void>(elements), |
| 121 dp->ConsumerReadData(UserPointer<void>(elements), | 119 MakeUserPointer(&num_bytes), false, false)); |
| 122 MakeUserPointer(&num_bytes), | |
| 123 false, | |
| 124 false)); | |
| 125 | 120 |
| 126 // Query; nothing there yet. | 121 // Query; nothing there yet. |
| 127 num_bytes = 0; | 122 num_bytes = 0; |
| 128 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); | 123 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
| 129 EXPECT_EQ(0u, num_bytes); | 124 EXPECT_EQ(0u, num_bytes); |
| 130 | 125 |
| 131 // Discard; nothing there yet. | 126 // Discard; nothing there yet. |
| 132 num_bytes = static_cast<uint32_t>(5u * sizeof(elements[0])); | 127 num_bytes = static_cast<uint32_t>(5u * sizeof(elements[0])); |
| 133 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 128 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
| 134 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), false)); | 129 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), false)); |
| 135 | 130 |
| 136 // Read with invalid |num_bytes|. | 131 // Read with invalid |num_bytes|. |
| 137 num_bytes = sizeof(elements[0]) + 1; | 132 num_bytes = sizeof(elements[0]) + 1; |
| 138 EXPECT_EQ( | 133 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 139 MOJO_RESULT_INVALID_ARGUMENT, | 134 dp->ConsumerReadData(UserPointer<void>(elements), |
| 140 dp->ConsumerReadData(UserPointer<void>(elements), | 135 MakeUserPointer(&num_bytes), false, false)); |
| 141 MakeUserPointer(&num_bytes), | |
| 142 false, | |
| 143 false)); | |
| 144 | 136 |
| 145 // Write two elements. | 137 // Write two elements. |
| 146 elements[0] = 123; | 138 elements[0] = 123; |
| 147 elements[1] = 456; | 139 elements[1] = 456; |
| 148 num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); | 140 num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); |
| 149 EXPECT_EQ(MOJO_RESULT_OK, | 141 EXPECT_EQ(MOJO_RESULT_OK, |
| 150 dp->ProducerWriteData(UserPointer<const void>(elements), | 142 dp->ProducerWriteData(UserPointer<const void>(elements), |
| 151 MakeUserPointer(&num_bytes), | 143 MakeUserPointer(&num_bytes), false)); |
| 152 false)); | |
| 153 // It should have written everything (even without "all or none"). | 144 // It should have written everything (even without "all or none"). |
| 154 EXPECT_EQ(2u * sizeof(elements[0]), num_bytes); | 145 EXPECT_EQ(2u * sizeof(elements[0]), num_bytes); |
| 155 | 146 |
| 156 // Query. | 147 // Query. |
| 157 num_bytes = 0; | 148 num_bytes = 0; |
| 158 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); | 149 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
| 159 EXPECT_EQ(2 * sizeof(elements[0]), num_bytes); | 150 EXPECT_EQ(2 * sizeof(elements[0]), num_bytes); |
| 160 | 151 |
| 161 // Read one element. | 152 // Read one element. |
| 162 elements[0] = -1; | 153 elements[0] = -1; |
| 163 elements[1] = -1; | 154 elements[1] = -1; |
| 164 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 155 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 165 EXPECT_EQ( | 156 EXPECT_EQ(MOJO_RESULT_OK, |
| 166 MOJO_RESULT_OK, | 157 dp->ConsumerReadData(UserPointer<void>(elements), |
| 167 dp->ConsumerReadData(UserPointer<void>(elements), | 158 MakeUserPointer(&num_bytes), false, false)); |
| 168 MakeUserPointer(&num_bytes), | |
| 169 false, | |
| 170 false)); | |
| 171 EXPECT_EQ(1u * sizeof(elements[0]), num_bytes); | 159 EXPECT_EQ(1u * sizeof(elements[0]), num_bytes); |
| 172 EXPECT_EQ(123, elements[0]); | 160 EXPECT_EQ(123, elements[0]); |
| 173 EXPECT_EQ(-1, elements[1]); | 161 EXPECT_EQ(-1, elements[1]); |
| 174 | 162 |
| 175 // Query. | 163 // Query. |
| 176 num_bytes = 0; | 164 num_bytes = 0; |
| 177 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); | 165 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
| 178 EXPECT_EQ(1 * sizeof(elements[0]), num_bytes); | 166 EXPECT_EQ(1 * sizeof(elements[0]), num_bytes); |
| 179 | 167 |
| 180 // Peek one element. | 168 // Peek one element. |
| 181 elements[0] = -1; | 169 elements[0] = -1; |
| 182 elements[1] = -1; | 170 elements[1] = -1; |
| 183 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 171 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 184 EXPECT_EQ( | 172 EXPECT_EQ(MOJO_RESULT_OK, |
| 185 MOJO_RESULT_OK, | 173 dp->ConsumerReadData(UserPointer<void>(elements), |
| 186 dp->ConsumerReadData(UserPointer<void>(elements), | 174 MakeUserPointer(&num_bytes), false, true)); |
| 187 MakeUserPointer(&num_bytes), | |
| 188 false, | |
| 189 true)); | |
| 190 EXPECT_EQ(1u * sizeof(elements[0]), num_bytes); | 175 EXPECT_EQ(1u * sizeof(elements[0]), num_bytes); |
| 191 EXPECT_EQ(456, elements[0]); | 176 EXPECT_EQ(456, elements[0]); |
| 192 EXPECT_EQ(-1, elements[1]); | 177 EXPECT_EQ(-1, elements[1]); |
| 193 | 178 |
| 194 // Query. Still has 1 element remaining. | 179 // Query. Still has 1 element remaining. |
| 195 num_bytes = 0; | 180 num_bytes = 0; |
| 196 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); | 181 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
| 197 EXPECT_EQ(1 * sizeof(elements[0]), num_bytes); | 182 EXPECT_EQ(1 * sizeof(elements[0]), num_bytes); |
| 198 | 183 |
| 199 // Try to read two elements, with "all or none". | 184 // Try to read two elements, with "all or none". |
| 200 elements[0] = -1; | 185 elements[0] = -1; |
| 201 elements[1] = -1; | 186 elements[1] = -1; |
| 202 num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); | 187 num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); |
| 203 EXPECT_EQ( | 188 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
| 204 MOJO_RESULT_OUT_OF_RANGE, | 189 dp->ConsumerReadData(UserPointer<void>(elements), |
| 205 dp->ConsumerReadData(UserPointer<void>(elements), | 190 MakeUserPointer(&num_bytes), true, false)); |
| 206 MakeUserPointer(&num_bytes), | |
| 207 true, | |
| 208 false)); | |
| 209 EXPECT_EQ(-1, elements[0]); | 191 EXPECT_EQ(-1, elements[0]); |
| 210 EXPECT_EQ(-1, elements[1]); | 192 EXPECT_EQ(-1, elements[1]); |
| 211 | 193 |
| 212 // Try to read two elements, without "all or none". | 194 // Try to read two elements, without "all or none". |
| 213 elements[0] = -1; | 195 elements[0] = -1; |
| 214 elements[1] = -1; | 196 elements[1] = -1; |
| 215 num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); | 197 num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); |
| 216 EXPECT_EQ( | 198 EXPECT_EQ(MOJO_RESULT_OK, |
| 217 MOJO_RESULT_OK, | 199 dp->ConsumerReadData(UserPointer<void>(elements), |
| 218 dp->ConsumerReadData(UserPointer<void>(elements), | 200 MakeUserPointer(&num_bytes), false, false)); |
| 219 MakeUserPointer(&num_bytes), | |
| 220 false, | |
| 221 false)); | |
| 222 EXPECT_EQ(456, elements[0]); | 201 EXPECT_EQ(456, elements[0]); |
| 223 EXPECT_EQ(-1, elements[1]); | 202 EXPECT_EQ(-1, elements[1]); |
| 224 | 203 |
| 225 // Query. | 204 // Query. |
| 226 num_bytes = 0; | 205 num_bytes = 0; |
| 227 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); | 206 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
| 228 EXPECT_EQ(0u, num_bytes); | 207 EXPECT_EQ(0u, num_bytes); |
| 229 | 208 |
| 230 dp->ProducerClose(); | 209 dp->ProducerClose(); |
| 231 dp->ConsumerClose(); | 210 dp->ConsumerClose(); |
| 232 } | 211 } |
| 233 | 212 |
| 234 // Note: The "basic" waiting tests test that the "wait states" are correct in | 213 // Note: The "basic" waiting tests test that the "wait states" are correct in |
| 235 // various situations; they don't test that waiters are properly awoken on state | 214 // various situations; they don't test that waiters are properly awoken on state |
| 236 // changes. (For that, we need to use multiple threads.) | 215 // changes. (For that, we need to use multiple threads.) |
| 237 TEST(LocalDataPipeTest, BasicProducerWaiting) { | 216 TEST(LocalDataPipeTest, BasicProducerWaiting) { |
| 238 // Note: We take advantage of the fact that for |LocalDataPipe|, capacities | 217 // Note: We take advantage of the fact that for |LocalDataPipe|, capacities |
| 239 // are strict maximums. This is not guaranteed by the API. | 218 // are strict maximums. This is not guaranteed by the API. |
| 240 | 219 |
| 241 const MojoCreateDataPipeOptions options = { | 220 const MojoCreateDataPipeOptions options = { |
| 242 kSizeOfOptions, // |struct_size|. | 221 kSizeOfOptions, // |struct_size|. |
| 243 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 222 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| 244 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 223 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
| 245 2 * sizeof(int32_t) // |capacity_num_bytes|. | 224 2 * sizeof(int32_t) // |capacity_num_bytes|. |
| 246 }; | 225 }; |
| 247 MojoCreateDataPipeOptions validated_options = {0}; | 226 MojoCreateDataPipeOptions validated_options = {0}; |
| 248 EXPECT_EQ(MOJO_RESULT_OK, | 227 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( |
| 249 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), | 228 MakeUserPointer(&options), &validated_options)); |
| 250 &validated_options)); | |
| 251 | 229 |
| 252 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 230 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 253 Waiter waiter; | 231 Waiter waiter; |
| 254 uint32_t context = 0; | 232 uint32_t context = 0; |
| 255 HandleSignalsState hss; | 233 HandleSignalsState hss; |
| 256 | 234 |
| 257 // Never readable. | 235 // Never readable. |
| 258 waiter.Init(); | 236 waiter.Init(); |
| 259 hss = HandleSignalsState(); | 237 hss = HandleSignalsState(); |
| 260 EXPECT_EQ( | 238 EXPECT_EQ( |
| 261 MOJO_RESULT_FAILED_PRECONDITION, | 239 MOJO_RESULT_FAILED_PRECONDITION, |
| 262 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss)); | 240 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss)); |
| 263 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 241 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 264 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); | 242 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); |
| 265 | 243 |
| 266 // Already writable. | 244 // Already writable. |
| 267 waiter.Init(); | 245 waiter.Init(); |
| 268 hss = HandleSignalsState(); | 246 hss = HandleSignalsState(); |
| 269 EXPECT_EQ( | 247 EXPECT_EQ( |
| 270 MOJO_RESULT_ALREADY_EXISTS, | 248 MOJO_RESULT_ALREADY_EXISTS, |
| 271 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 34, &hss)); | 249 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 34, &hss)); |
| 272 | 250 |
| 273 // Write two elements. | 251 // Write two elements. |
| 274 int32_t elements[2] = {123, 456}; | 252 int32_t elements[2] = {123, 456}; |
| 275 uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); | 253 uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); |
| 276 EXPECT_EQ(MOJO_RESULT_OK, | 254 EXPECT_EQ(MOJO_RESULT_OK, |
| 277 dp->ProducerWriteData(UserPointer<const void>(elements), | 255 dp->ProducerWriteData(UserPointer<const void>(elements), |
| 278 MakeUserPointer(&num_bytes), | 256 MakeUserPointer(&num_bytes), true)); |
| 279 true)); | |
| 280 EXPECT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes); | 257 EXPECT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes); |
| 281 | 258 |
| 282 // Adding a waiter should now succeed. | 259 // Adding a waiter should now succeed. |
| 283 waiter.Init(); | 260 waiter.Init(); |
| 284 ASSERT_EQ( | 261 ASSERT_EQ( |
| 285 MOJO_RESULT_OK, | 262 MOJO_RESULT_OK, |
| 286 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 56, nullptr)); | 263 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 56, nullptr)); |
| 287 // And it shouldn't be writable yet. | 264 // And it shouldn't be writable yet. |
| 288 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); | 265 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); |
| 289 hss = HandleSignalsState(); | 266 hss = HandleSignalsState(); |
| 290 dp->ProducerRemoveWaiter(&waiter, &hss); | 267 dp->ProducerRemoveWaiter(&waiter, &hss); |
| 291 EXPECT_EQ(0u, hss.satisfied_signals); | 268 EXPECT_EQ(0u, hss.satisfied_signals); |
| 292 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); | 269 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); |
| 293 | 270 |
| 294 // Peek one element. | 271 // Peek one element. |
| 295 elements[0] = -1; | 272 elements[0] = -1; |
| 296 elements[1] = -1; | 273 elements[1] = -1; |
| 297 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 274 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 298 EXPECT_EQ( | 275 EXPECT_EQ(MOJO_RESULT_OK, |
| 299 MOJO_RESULT_OK, | 276 dp->ConsumerReadData(UserPointer<void>(elements), |
| 300 dp->ConsumerReadData(UserPointer<void>(elements), | 277 MakeUserPointer(&num_bytes), true, true)); |
| 301 MakeUserPointer(&num_bytes), | |
| 302 true, | |
| 303 true)); | |
| 304 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 278 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 305 EXPECT_EQ(123, elements[0]); | 279 EXPECT_EQ(123, elements[0]); |
| 306 EXPECT_EQ(-1, elements[1]); | 280 EXPECT_EQ(-1, elements[1]); |
| 307 | 281 |
| 308 // Add a waiter. | 282 // Add a waiter. |
| 309 waiter.Init(); | 283 waiter.Init(); |
| 310 ASSERT_EQ( | 284 ASSERT_EQ( |
| 311 MOJO_RESULT_OK, | 285 MOJO_RESULT_OK, |
| 312 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 56, nullptr)); | 286 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 56, nullptr)); |
| 313 // And it still shouldn't be writable yet. | 287 // And it still shouldn't be writable yet. |
| 314 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); | 288 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); |
| 315 hss = HandleSignalsState(); | 289 hss = HandleSignalsState(); |
| 316 dp->ProducerRemoveWaiter(&waiter, &hss); | 290 dp->ProducerRemoveWaiter(&waiter, &hss); |
| 317 EXPECT_EQ(0u, hss.satisfied_signals); | 291 EXPECT_EQ(0u, hss.satisfied_signals); |
| 318 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); | 292 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); |
| 319 | 293 |
| 320 // Do it again. | 294 // Do it again. |
| 321 waiter.Init(); | 295 waiter.Init(); |
| 322 ASSERT_EQ( | 296 ASSERT_EQ( |
| 323 MOJO_RESULT_OK, | 297 MOJO_RESULT_OK, |
| 324 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 78, nullptr)); | 298 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 78, nullptr)); |
| 325 | 299 |
| 326 // Read one element. | 300 // Read one element. |
| 327 elements[0] = -1; | 301 elements[0] = -1; |
| 328 elements[1] = -1; | 302 elements[1] = -1; |
| 329 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 303 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 330 EXPECT_EQ( | 304 EXPECT_EQ(MOJO_RESULT_OK, |
| 331 MOJO_RESULT_OK, | 305 dp->ConsumerReadData(UserPointer<void>(elements), |
| 332 dp->ConsumerReadData(UserPointer<void>(elements), | 306 MakeUserPointer(&num_bytes), true, false)); |
| 333 MakeUserPointer(&num_bytes), | |
| 334 true, | |
| 335 false)); | |
| 336 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 307 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 337 EXPECT_EQ(123, elements[0]); | 308 EXPECT_EQ(123, elements[0]); |
| 338 EXPECT_EQ(-1, elements[1]); | 309 EXPECT_EQ(-1, elements[1]); |
| 339 | 310 |
| 340 // Waiting should now succeed. | 311 // Waiting should now succeed. |
| 341 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context)); | 312 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context)); |
| 342 EXPECT_EQ(78u, context); | 313 EXPECT_EQ(78u, context); |
| 343 hss = HandleSignalsState(); | 314 hss = HandleSignalsState(); |
| 344 dp->ProducerRemoveWaiter(&waiter, &hss); | 315 dp->ProducerRemoveWaiter(&waiter, &hss); |
| 345 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 316 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 346 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); | 317 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); |
| 347 | 318 |
| 348 // Try writing, using a two-phase write. | 319 // Try writing, using a two-phase write. |
| 349 void* buffer = nullptr; | 320 void* buffer = nullptr; |
| 350 num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0])); | 321 num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0])); |
| 351 EXPECT_EQ(MOJO_RESULT_OK, | 322 EXPECT_EQ(MOJO_RESULT_OK, |
| 352 dp->ProducerBeginWriteData( | 323 dp->ProducerBeginWriteData(MakeUserPointer(&buffer), |
| 353 MakeUserPointer(&buffer), MakeUserPointer(&num_bytes), false)); | 324 MakeUserPointer(&num_bytes), false)); |
| 354 EXPECT_TRUE(buffer); | 325 EXPECT_TRUE(buffer); |
| 355 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 326 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 356 | 327 |
| 357 static_cast<int32_t*>(buffer)[0] = 789; | 328 static_cast<int32_t*>(buffer)[0] = 789; |
| 358 EXPECT_EQ(MOJO_RESULT_OK, | 329 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(static_cast<uint32_t>( |
| 359 dp->ProducerEndWriteData( | 330 1u * sizeof(elements[0])))); |
| 360 static_cast<uint32_t>(1u * sizeof(elements[0])))); | |
| 361 | 331 |
| 362 // Add a waiter. | 332 // Add a waiter. |
| 363 waiter.Init(); | 333 waiter.Init(); |
| 364 ASSERT_EQ( | 334 ASSERT_EQ( |
| 365 MOJO_RESULT_OK, | 335 MOJO_RESULT_OK, |
| 366 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 90, nullptr)); | 336 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 90, nullptr)); |
| 367 | 337 |
| 368 // Read one element, using a two-phase read. | 338 // Read one element, using a two-phase read. |
| 369 const void* read_buffer = nullptr; | 339 const void* read_buffer = nullptr; |
| 370 num_bytes = 0u; | 340 num_bytes = 0u; |
| 371 EXPECT_EQ( | 341 EXPECT_EQ(MOJO_RESULT_OK, |
| 372 MOJO_RESULT_OK, | 342 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer), |
| 373 dp->ConsumerBeginReadData( | 343 MakeUserPointer(&num_bytes), false)); |
| 374 MakeUserPointer(&read_buffer), MakeUserPointer(&num_bytes), false)); | |
| 375 EXPECT_TRUE(read_buffer); | 344 EXPECT_TRUE(read_buffer); |
| 376 // Since we only read one element (after having written three in all), the | 345 // Since we only read one element (after having written three in all), the |
| 377 // two-phase read should only allow us to read one. This checks an | 346 // two-phase read should only allow us to read one. This checks an |
| 378 // implementation detail! | 347 // implementation detail! |
| 379 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 348 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 380 EXPECT_EQ(456, static_cast<const int32_t*>(read_buffer)[0]); | 349 EXPECT_EQ(456, static_cast<const int32_t*>(read_buffer)[0]); |
| 381 EXPECT_EQ( | 350 EXPECT_EQ( |
| 382 MOJO_RESULT_OK, | 351 MOJO_RESULT_OK, |
| 383 dp->ConsumerEndReadData(static_cast<uint32_t>(1u * sizeof(elements[0])))); | 352 dp->ConsumerEndReadData(static_cast<uint32_t>(1u * sizeof(elements[0])))); |
| 384 | 353 |
| 385 // Waiting should succeed. | 354 // Waiting should succeed. |
| 386 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context)); | 355 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context)); |
| 387 EXPECT_EQ(90u, context); | 356 EXPECT_EQ(90u, context); |
| 388 hss = HandleSignalsState(); | 357 hss = HandleSignalsState(); |
| 389 dp->ProducerRemoveWaiter(&waiter, &hss); | 358 dp->ProducerRemoveWaiter(&waiter, &hss); |
| 390 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 359 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 391 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); | 360 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); |
| 392 | 361 |
| 393 // Write one element. | 362 // Write one element. |
| 394 elements[0] = 123; | 363 elements[0] = 123; |
| 395 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 364 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 396 EXPECT_EQ(MOJO_RESULT_OK, | 365 EXPECT_EQ(MOJO_RESULT_OK, |
| 397 dp->ProducerWriteData(UserPointer<const void>(elements), | 366 dp->ProducerWriteData(UserPointer<const void>(elements), |
| 398 MakeUserPointer(&num_bytes), | 367 MakeUserPointer(&num_bytes), false)); |
| 399 false)); | |
| 400 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 368 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 401 | 369 |
| 402 // Add a waiter. | 370 // Add a waiter. |
| 403 waiter.Init(); | 371 waiter.Init(); |
| 404 ASSERT_EQ( | 372 ASSERT_EQ( |
| 405 MOJO_RESULT_OK, | 373 MOJO_RESULT_OK, |
| 406 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 12, nullptr)); | 374 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 12, nullptr)); |
| 407 | 375 |
| 408 // Close the consumer. | 376 // Close the consumer. |
| 409 dp->ConsumerClose(); | 377 dp->ConsumerClose(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 420 } | 388 } |
| 421 | 389 |
| 422 TEST(LocalDataPipeTest, BasicConsumerWaiting) { | 390 TEST(LocalDataPipeTest, BasicConsumerWaiting) { |
| 423 const MojoCreateDataPipeOptions options = { | 391 const MojoCreateDataPipeOptions options = { |
| 424 kSizeOfOptions, // |struct_size|. | 392 kSizeOfOptions, // |struct_size|. |
| 425 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 393 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| 426 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 394 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
| 427 1000 * sizeof(int32_t) // |capacity_num_bytes|. | 395 1000 * sizeof(int32_t) // |capacity_num_bytes|. |
| 428 }; | 396 }; |
| 429 MojoCreateDataPipeOptions validated_options = {0}; | 397 MojoCreateDataPipeOptions validated_options = {0}; |
| 430 EXPECT_EQ(MOJO_RESULT_OK, | 398 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( |
| 431 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), | 399 MakeUserPointer(&options), &validated_options)); |
| 432 &validated_options)); | |
| 433 | 400 |
| 434 { | 401 { |
| 435 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 402 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 436 Waiter waiter; | 403 Waiter waiter; |
| 437 uint32_t context = 0; | 404 uint32_t context = 0; |
| 438 HandleSignalsState hss; | 405 HandleSignalsState hss; |
| 439 | 406 |
| 440 // Never writable. | 407 // Never writable. |
| 441 waiter.Init(); | 408 waiter.Init(); |
| 442 hss = HandleSignalsState(); | 409 hss = HandleSignalsState(); |
| 443 EXPECT_EQ( | 410 EXPECT_EQ( |
| 444 MOJO_RESULT_FAILED_PRECONDITION, | 411 MOJO_RESULT_FAILED_PRECONDITION, |
| 445 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 12, &hss)); | 412 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 12, &hss)); |
| 446 EXPECT_EQ(0u, hss.satisfied_signals); | 413 EXPECT_EQ(0u, hss.satisfied_signals); |
| 447 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 414 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
| 448 | 415 |
| 449 // Not yet readable. | 416 // Not yet readable. |
| 450 waiter.Init(); | 417 waiter.Init(); |
| 451 ASSERT_EQ(MOJO_RESULT_OK, | 418 ASSERT_EQ(MOJO_RESULT_OK, |
| 452 dp->ConsumerAddWaiter( | 419 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, |
| 453 &waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, nullptr)); | 420 nullptr)); |
| 454 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); | 421 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); |
| 455 hss = HandleSignalsState(); | 422 hss = HandleSignalsState(); |
| 456 dp->ConsumerRemoveWaiter(&waiter, &hss); | 423 dp->ConsumerRemoveWaiter(&waiter, &hss); |
| 457 EXPECT_EQ(0u, hss.satisfied_signals); | 424 EXPECT_EQ(0u, hss.satisfied_signals); |
| 458 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 425 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
| 459 | 426 |
| 460 // Write two elements. | 427 // Write two elements. |
| 461 int32_t elements[2] = {123, 456}; | 428 int32_t elements[2] = {123, 456}; |
| 462 uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); | 429 uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); |
| 463 EXPECT_EQ(MOJO_RESULT_OK, | 430 EXPECT_EQ(MOJO_RESULT_OK, |
| 464 dp->ProducerWriteData(UserPointer<const void>(elements), | 431 dp->ProducerWriteData(UserPointer<const void>(elements), |
| 465 MakeUserPointer(&num_bytes), | 432 MakeUserPointer(&num_bytes), true)); |
| 466 true)); | |
| 467 | 433 |
| 468 // Should already be readable. | 434 // Should already be readable. |
| 469 waiter.Init(); | 435 waiter.Init(); |
| 470 hss = HandleSignalsState(); | 436 hss = HandleSignalsState(); |
| 471 EXPECT_EQ( | 437 EXPECT_EQ( |
| 472 MOJO_RESULT_ALREADY_EXISTS, | 438 MOJO_RESULT_ALREADY_EXISTS, |
| 473 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 56, &hss)); | 439 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 56, &hss)); |
| 474 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 440 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 475 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 441 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
| 476 | 442 |
| 477 // Discard one element. | 443 // Discard one element. |
| 478 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 444 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 479 EXPECT_EQ(MOJO_RESULT_OK, | 445 EXPECT_EQ(MOJO_RESULT_OK, |
| 480 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); | 446 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); |
| 481 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 447 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 482 | 448 |
| 483 // Should still be readable. | 449 // Should still be readable. |
| 484 waiter.Init(); | 450 waiter.Init(); |
| 485 hss = HandleSignalsState(); | 451 hss = HandleSignalsState(); |
| 486 EXPECT_EQ( | 452 EXPECT_EQ( |
| 487 MOJO_RESULT_ALREADY_EXISTS, | 453 MOJO_RESULT_ALREADY_EXISTS, |
| 488 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 78, &hss)); | 454 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 78, &hss)); |
| 489 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 455 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 490 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 456 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
| 491 | 457 |
| 492 // Peek one element. | 458 // Peek one element. |
| 493 elements[0] = -1; | 459 elements[0] = -1; |
| 494 elements[1] = -1; | 460 elements[1] = -1; |
| 495 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 461 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 496 EXPECT_EQ( | 462 EXPECT_EQ(MOJO_RESULT_OK, |
| 497 MOJO_RESULT_OK, | 463 dp->ConsumerReadData(UserPointer<void>(elements), |
| 498 dp->ConsumerReadData(UserPointer<void>(elements), | 464 MakeUserPointer(&num_bytes), true, true)); |
| 499 MakeUserPointer(&num_bytes), | |
| 500 true, | |
| 501 true)); | |
| 502 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 465 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 503 EXPECT_EQ(456, elements[0]); | 466 EXPECT_EQ(456, elements[0]); |
| 504 EXPECT_EQ(-1, elements[1]); | 467 EXPECT_EQ(-1, elements[1]); |
| 505 | 468 |
| 506 // Should still be readable. | 469 // Should still be readable. |
| 507 waiter.Init(); | 470 waiter.Init(); |
| 508 hss = HandleSignalsState(); | 471 hss = HandleSignalsState(); |
| 509 EXPECT_EQ( | 472 EXPECT_EQ( |
| 510 MOJO_RESULT_ALREADY_EXISTS, | 473 MOJO_RESULT_ALREADY_EXISTS, |
| 511 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 78, &hss)); | 474 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 78, &hss)); |
| 512 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 475 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 513 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 476 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
| 514 | 477 |
| 515 // Read one element. | 478 // Read one element. |
| 516 elements[0] = -1; | 479 elements[0] = -1; |
| 517 elements[1] = -1; | 480 elements[1] = -1; |
| 518 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 481 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 519 EXPECT_EQ( | 482 EXPECT_EQ(MOJO_RESULT_OK, |
| 520 MOJO_RESULT_OK, | 483 dp->ConsumerReadData(UserPointer<void>(elements), |
| 521 dp->ConsumerReadData(UserPointer<void>(elements), | 484 MakeUserPointer(&num_bytes), true, false)); |
| 522 MakeUserPointer(&num_bytes), | |
| 523 true, | |
| 524 false)); | |
| 525 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 485 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 526 EXPECT_EQ(456, elements[0]); | 486 EXPECT_EQ(456, elements[0]); |
| 527 EXPECT_EQ(-1, elements[1]); | 487 EXPECT_EQ(-1, elements[1]); |
| 528 | 488 |
| 529 // Adding a waiter should now succeed. | 489 // Adding a waiter should now succeed. |
| 530 waiter.Init(); | 490 waiter.Init(); |
| 531 ASSERT_EQ(MOJO_RESULT_OK, | 491 ASSERT_EQ(MOJO_RESULT_OK, |
| 532 dp->ConsumerAddWaiter( | 492 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 90, |
| 533 &waiter, MOJO_HANDLE_SIGNAL_READABLE, 90, nullptr)); | 493 nullptr)); |
| 534 | 494 |
| 535 // Write one element. | 495 // Write one element. |
| 536 elements[0] = 789; | 496 elements[0] = 789; |
| 537 elements[1] = -1; | 497 elements[1] = -1; |
| 538 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 498 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 539 EXPECT_EQ(MOJO_RESULT_OK, | 499 EXPECT_EQ(MOJO_RESULT_OK, |
| 540 dp->ProducerWriteData(UserPointer<const void>(elements), | 500 dp->ProducerWriteData(UserPointer<const void>(elements), |
| 541 MakeUserPointer(&num_bytes), | 501 MakeUserPointer(&num_bytes), true)); |
| 542 true)); | |
| 543 | 502 |
| 544 // Waiting should now succeed. | 503 // Waiting should now succeed. |
| 545 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context)); | 504 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context)); |
| 546 EXPECT_EQ(90u, context); | 505 EXPECT_EQ(90u, context); |
| 547 hss = HandleSignalsState(); | 506 hss = HandleSignalsState(); |
| 548 dp->ConsumerRemoveWaiter(&waiter, &hss); | 507 dp->ConsumerRemoveWaiter(&waiter, &hss); |
| 549 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 508 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 550 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 509 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
| 551 | 510 |
| 552 // Close the producer. | 511 // Close the producer. |
| 553 dp->ProducerClose(); | 512 dp->ProducerClose(); |
| 554 | 513 |
| 555 // Should still be readable. | 514 // Should still be readable. |
| 556 waiter.Init(); | 515 waiter.Init(); |
| 557 hss = HandleSignalsState(); | 516 hss = HandleSignalsState(); |
| 558 EXPECT_EQ( | 517 EXPECT_EQ( |
| 559 MOJO_RESULT_ALREADY_EXISTS, | 518 MOJO_RESULT_ALREADY_EXISTS, |
| 560 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss)); | 519 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss)); |
| 561 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 520 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 562 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 521 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
| 563 | 522 |
| 564 // Read one element. | 523 // Read one element. |
| 565 elements[0] = -1; | 524 elements[0] = -1; |
| 566 elements[1] = -1; | 525 elements[1] = -1; |
| 567 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 526 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 568 EXPECT_EQ( | 527 EXPECT_EQ(MOJO_RESULT_OK, |
| 569 MOJO_RESULT_OK, | 528 dp->ConsumerReadData(UserPointer<void>(elements), |
| 570 dp->ConsumerReadData(UserPointer<void>(elements), | 529 MakeUserPointer(&num_bytes), true, false)); |
| 571 MakeUserPointer(&num_bytes), | |
| 572 true, | |
| 573 false)); | |
| 574 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 530 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 575 EXPECT_EQ(789, elements[0]); | 531 EXPECT_EQ(789, elements[0]); |
| 576 EXPECT_EQ(-1, elements[1]); | 532 EXPECT_EQ(-1, elements[1]); |
| 577 | 533 |
| 578 // Should be never-readable. | 534 // Should be never-readable. |
| 579 waiter.Init(); | 535 waiter.Init(); |
| 580 hss = HandleSignalsState(); | 536 hss = HandleSignalsState(); |
| 581 EXPECT_EQ( | 537 EXPECT_EQ( |
| 582 MOJO_RESULT_FAILED_PRECONDITION, | 538 MOJO_RESULT_FAILED_PRECONDITION, |
| 583 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, &hss)); | 539 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, &hss)); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 594 Waiter waiter; | 550 Waiter waiter; |
| 595 uint32_t context = 0; | 551 uint32_t context = 0; |
| 596 HandleSignalsState hss; | 552 HandleSignalsState hss; |
| 597 | 553 |
| 598 // Write two elements. | 554 // Write two elements. |
| 599 int32_t* elements = nullptr; | 555 int32_t* elements = nullptr; |
| 600 void* buffer = nullptr; | 556 void* buffer = nullptr; |
| 601 // Request room for three (but we'll only write two). | 557 // Request room for three (but we'll only write two). |
| 602 uint32_t num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0])); | 558 uint32_t num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0])); |
| 603 EXPECT_EQ(MOJO_RESULT_OK, | 559 EXPECT_EQ(MOJO_RESULT_OK, |
| 604 dp->ProducerBeginWriteData( | 560 dp->ProducerBeginWriteData(MakeUserPointer(&buffer), |
| 605 MakeUserPointer(&buffer), MakeUserPointer(&num_bytes), true)); | 561 MakeUserPointer(&num_bytes), true)); |
| 606 EXPECT_TRUE(buffer); | 562 EXPECT_TRUE(buffer); |
| 607 EXPECT_GE(num_bytes, static_cast<uint32_t>(3u * sizeof(elements[0]))); | 563 EXPECT_GE(num_bytes, static_cast<uint32_t>(3u * sizeof(elements[0]))); |
| 608 elements = static_cast<int32_t*>(buffer); | 564 elements = static_cast<int32_t*>(buffer); |
| 609 elements[0] = 123; | 565 elements[0] = 123; |
| 610 elements[1] = 456; | 566 elements[1] = 456; |
| 611 EXPECT_EQ(MOJO_RESULT_OK, | 567 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(static_cast<uint32_t>( |
| 612 dp->ProducerEndWriteData( | 568 2u * sizeof(elements[0])))); |
| 613 static_cast<uint32_t>(2u * sizeof(elements[0])))); | |
| 614 | 569 |
| 615 // Should already be readable. | 570 // Should already be readable. |
| 616 waiter.Init(); | 571 waiter.Init(); |
| 617 hss = HandleSignalsState(); | 572 hss = HandleSignalsState(); |
| 618 EXPECT_EQ( | 573 EXPECT_EQ( |
| 619 MOJO_RESULT_ALREADY_EXISTS, | 574 MOJO_RESULT_ALREADY_EXISTS, |
| 620 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss)); | 575 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss)); |
| 621 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 576 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 622 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 577 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
| 623 | 578 |
| 624 // Read one element. | 579 // Read one element. |
| 625 // Request two in all-or-none mode, but only read one. | 580 // Request two in all-or-none mode, but only read one. |
| 626 const void* read_buffer = nullptr; | 581 const void* read_buffer = nullptr; |
| 627 num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); | 582 num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); |
| 628 EXPECT_EQ( | 583 EXPECT_EQ(MOJO_RESULT_OK, |
| 629 MOJO_RESULT_OK, | 584 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer), |
| 630 dp->ConsumerBeginReadData( | 585 MakeUserPointer(&num_bytes), true)); |
| 631 MakeUserPointer(&read_buffer), MakeUserPointer(&num_bytes), true)); | |
| 632 EXPECT_TRUE(read_buffer); | 586 EXPECT_TRUE(read_buffer); |
| 633 EXPECT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes); | 587 EXPECT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes); |
| 634 const int32_t* read_elements = static_cast<const int32_t*>(read_buffer); | 588 const int32_t* read_elements = static_cast<const int32_t*>(read_buffer); |
| 635 EXPECT_EQ(123, read_elements[0]); | 589 EXPECT_EQ(123, read_elements[0]); |
| 636 EXPECT_EQ(MOJO_RESULT_OK, | 590 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(static_cast<uint32_t>( |
| 637 dp->ConsumerEndReadData( | 591 1u * sizeof(elements[0])))); |
| 638 static_cast<uint32_t>(1u * sizeof(elements[0])))); | |
| 639 | 592 |
| 640 // Should still be readable. | 593 // Should still be readable. |
| 641 waiter.Init(); | 594 waiter.Init(); |
| 642 hss = HandleSignalsState(); | 595 hss = HandleSignalsState(); |
| 643 EXPECT_EQ( | 596 EXPECT_EQ( |
| 644 MOJO_RESULT_ALREADY_EXISTS, | 597 MOJO_RESULT_ALREADY_EXISTS, |
| 645 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, &hss)); | 598 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, &hss)); |
| 646 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 599 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 647 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 600 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
| 648 | 601 |
| 649 // Read one element. | 602 // Read one element. |
| 650 // Request three, but not in all-or-none mode. | 603 // Request three, but not in all-or-none mode. |
| 651 read_buffer = nullptr; | 604 read_buffer = nullptr; |
| 652 num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0])); | 605 num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0])); |
| 653 EXPECT_EQ( | 606 EXPECT_EQ(MOJO_RESULT_OK, |
| 654 MOJO_RESULT_OK, | 607 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer), |
| 655 dp->ConsumerBeginReadData( | 608 MakeUserPointer(&num_bytes), false)); |
| 656 MakeUserPointer(&read_buffer), MakeUserPointer(&num_bytes), false)); | |
| 657 EXPECT_TRUE(read_buffer); | 609 EXPECT_TRUE(read_buffer); |
| 658 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 610 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 659 read_elements = static_cast<const int32_t*>(read_buffer); | 611 read_elements = static_cast<const int32_t*>(read_buffer); |
| 660 EXPECT_EQ(456, read_elements[0]); | 612 EXPECT_EQ(456, read_elements[0]); |
| 661 EXPECT_EQ(MOJO_RESULT_OK, | 613 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(static_cast<uint32_t>( |
| 662 dp->ConsumerEndReadData( | 614 1u * sizeof(elements[0])))); |
| 663 static_cast<uint32_t>(1u * sizeof(elements[0])))); | |
| 664 | 615 |
| 665 // Adding a waiter should now succeed. | 616 // Adding a waiter should now succeed. |
| 666 waiter.Init(); | 617 waiter.Init(); |
| 667 ASSERT_EQ(MOJO_RESULT_OK, | 618 ASSERT_EQ(MOJO_RESULT_OK, |
| 668 dp->ConsumerAddWaiter( | 619 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 56, |
| 669 &waiter, MOJO_HANDLE_SIGNAL_READABLE, 56, nullptr)); | 620 nullptr)); |
| 670 | 621 |
| 671 // Close the producer. | 622 // Close the producer. |
| 672 dp->ProducerClose(); | 623 dp->ProducerClose(); |
| 673 | 624 |
| 674 // Should be never-readable. | 625 // Should be never-readable. |
| 675 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, waiter.Wait(1000, &context)); | 626 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, waiter.Wait(1000, &context)); |
| 676 EXPECT_EQ(56u, context); | 627 EXPECT_EQ(56u, context); |
| 677 hss = HandleSignalsState(); | 628 hss = HandleSignalsState(); |
| 678 dp->ConsumerRemoveWaiter(&waiter, &hss); | 629 dp->ConsumerRemoveWaiter(&waiter, &hss); |
| 679 EXPECT_EQ(0u, hss.satisfied_signals); | 630 EXPECT_EQ(0u, hss.satisfied_signals); |
| 680 EXPECT_EQ(0u, hss.satisfiable_signals); | 631 EXPECT_EQ(0u, hss.satisfiable_signals); |
| 681 | 632 |
| 682 dp->ConsumerClose(); | 633 dp->ConsumerClose(); |
| 683 } | 634 } |
| 684 } | 635 } |
| 685 | 636 |
| 686 // Tests that data pipes aren't writable/readable during two-phase writes/reads. | 637 // Tests that data pipes aren't writable/readable during two-phase writes/reads. |
| 687 TEST(LocalDataPipeTest, BasicTwoPhaseWaiting) { | 638 TEST(LocalDataPipeTest, BasicTwoPhaseWaiting) { |
| 688 const MojoCreateDataPipeOptions options = { | 639 const MojoCreateDataPipeOptions options = { |
| 689 kSizeOfOptions, // |struct_size|. | 640 kSizeOfOptions, // |struct_size|. |
| 690 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 641 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| 691 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 642 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
| 692 1000 * sizeof(int32_t) // |capacity_num_bytes|. | 643 1000 * sizeof(int32_t) // |capacity_num_bytes|. |
| 693 }; | 644 }; |
| 694 MojoCreateDataPipeOptions validated_options = {0}; | 645 MojoCreateDataPipeOptions validated_options = {0}; |
| 695 EXPECT_EQ(MOJO_RESULT_OK, | 646 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( |
| 696 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), | 647 MakeUserPointer(&options), &validated_options)); |
| 697 &validated_options)); | |
| 698 | 648 |
| 699 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 649 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 700 Waiter waiter; | 650 Waiter waiter; |
| 701 HandleSignalsState hss; | 651 HandleSignalsState hss; |
| 702 | 652 |
| 703 // It should be writable. | 653 // It should be writable. |
| 704 waiter.Init(); | 654 waiter.Init(); |
| 705 hss = HandleSignalsState(); | 655 hss = HandleSignalsState(); |
| 706 EXPECT_EQ( | 656 EXPECT_EQ( |
| 707 MOJO_RESULT_ALREADY_EXISTS, | 657 MOJO_RESULT_ALREADY_EXISTS, |
| 708 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); | 658 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); |
| 709 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 659 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 710 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); | 660 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); |
| 711 | 661 |
| 712 uint32_t num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); | 662 uint32_t num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); |
| 713 void* write_ptr = nullptr; | 663 void* write_ptr = nullptr; |
| 714 EXPECT_EQ( | 664 EXPECT_EQ(MOJO_RESULT_OK, |
| 715 MOJO_RESULT_OK, | 665 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
| 716 dp->ProducerBeginWriteData( | 666 MakeUserPointer(&num_bytes), false)); |
| 717 MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), false)); | |
| 718 EXPECT_TRUE(write_ptr); | 667 EXPECT_TRUE(write_ptr); |
| 719 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t))); | 668 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t))); |
| 720 | 669 |
| 721 // At this point, it shouldn't be writable. | 670 // At this point, it shouldn't be writable. |
| 722 waiter.Init(); | 671 waiter.Init(); |
| 723 ASSERT_EQ( | 672 ASSERT_EQ( |
| 724 MOJO_RESULT_OK, | 673 MOJO_RESULT_OK, |
| 725 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 1, nullptr)); | 674 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 1, nullptr)); |
| 726 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); | 675 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); |
| 727 hss = HandleSignalsState(); | 676 hss = HandleSignalsState(); |
| 728 dp->ProducerRemoveWaiter(&waiter, &hss); | 677 dp->ProducerRemoveWaiter(&waiter, &hss); |
| 729 EXPECT_EQ(0u, hss.satisfied_signals); | 678 EXPECT_EQ(0u, hss.satisfied_signals); |
| 730 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); | 679 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); |
| 731 | 680 |
| 732 // It shouldn't be readable yet either. | 681 // It shouldn't be readable yet either. |
| 733 waiter.Init(); | 682 waiter.Init(); |
| 734 ASSERT_EQ( | 683 ASSERT_EQ( |
| 735 MOJO_RESULT_OK, | 684 MOJO_RESULT_OK, |
| 736 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 2, nullptr)); | 685 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 2, nullptr)); |
| 737 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); | 686 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); |
| 738 hss = HandleSignalsState(); | 687 hss = HandleSignalsState(); |
| 739 dp->ConsumerRemoveWaiter(&waiter, &hss); | 688 dp->ConsumerRemoveWaiter(&waiter, &hss); |
| 740 EXPECT_EQ(0u, hss.satisfied_signals); | 689 EXPECT_EQ(0u, hss.satisfied_signals); |
| 741 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 690 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
| 742 | 691 |
| 743 static_cast<int32_t*>(write_ptr)[0] = 123; | 692 static_cast<int32_t*>(write_ptr)[0] = 123; |
| 744 EXPECT_EQ( | 693 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData( |
| 745 MOJO_RESULT_OK, | 694 static_cast<uint32_t>(1u * sizeof(int32_t)))); |
| 746 dp->ProducerEndWriteData(static_cast<uint32_t>(1u * sizeof(int32_t)))); | |
| 747 | 695 |
| 748 // It should be writable again. | 696 // It should be writable again. |
| 749 waiter.Init(); | 697 waiter.Init(); |
| 750 hss = HandleSignalsState(); | 698 hss = HandleSignalsState(); |
| 751 EXPECT_EQ( | 699 EXPECT_EQ( |
| 752 MOJO_RESULT_ALREADY_EXISTS, | 700 MOJO_RESULT_ALREADY_EXISTS, |
| 753 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 3, &hss)); | 701 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 3, &hss)); |
| 754 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 702 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 755 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); | 703 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); |
| 756 | 704 |
| 757 // And readable. | 705 // And readable. |
| 758 waiter.Init(); | 706 waiter.Init(); |
| 759 hss = HandleSignalsState(); | 707 hss = HandleSignalsState(); |
| 760 EXPECT_EQ( | 708 EXPECT_EQ( |
| 761 MOJO_RESULT_ALREADY_EXISTS, | 709 MOJO_RESULT_ALREADY_EXISTS, |
| 762 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 4, &hss)); | 710 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 4, &hss)); |
| 763 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 711 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 764 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 712 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
| 765 | 713 |
| 766 // Start another two-phase write and check that it's readable even in the | 714 // Start another two-phase write and check that it's readable even in the |
| 767 // middle of it. | 715 // middle of it. |
| 768 num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); | 716 num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); |
| 769 write_ptr = nullptr; | 717 write_ptr = nullptr; |
| 770 EXPECT_EQ( | 718 EXPECT_EQ(MOJO_RESULT_OK, |
| 771 MOJO_RESULT_OK, | 719 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
| 772 dp->ProducerBeginWriteData( | 720 MakeUserPointer(&num_bytes), false)); |
| 773 MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), false)); | |
| 774 EXPECT_TRUE(write_ptr); | 721 EXPECT_TRUE(write_ptr); |
| 775 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t))); | 722 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t))); |
| 776 | 723 |
| 777 // It should be readable. | 724 // It should be readable. |
| 778 waiter.Init(); | 725 waiter.Init(); |
| 779 hss = HandleSignalsState(); | 726 hss = HandleSignalsState(); |
| 780 EXPECT_EQ( | 727 EXPECT_EQ( |
| 781 MOJO_RESULT_ALREADY_EXISTS, | 728 MOJO_RESULT_ALREADY_EXISTS, |
| 782 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 5, &hss)); | 729 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 5, &hss)); |
| 783 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 730 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 784 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 731 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
| 785 | 732 |
| 786 // End the two-phase write without writing anything. | 733 // End the two-phase write without writing anything. |
| 787 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(0u)); | 734 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(0u)); |
| 788 | 735 |
| 789 // Start a two-phase read. | 736 // Start a two-phase read. |
| 790 num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); | 737 num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); |
| 791 const void* read_ptr = nullptr; | 738 const void* read_ptr = nullptr; |
| 792 EXPECT_EQ( | 739 EXPECT_EQ(MOJO_RESULT_OK, |
| 793 MOJO_RESULT_OK, | 740 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr), |
| 794 dp->ConsumerBeginReadData( | 741 MakeUserPointer(&num_bytes), false)); |
| 795 MakeUserPointer(&read_ptr), MakeUserPointer(&num_bytes), false)); | |
| 796 EXPECT_TRUE(read_ptr); | 742 EXPECT_TRUE(read_ptr); |
| 797 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(int32_t)), num_bytes); | 743 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(int32_t)), num_bytes); |
| 798 | 744 |
| 799 // At this point, it should still be writable. | 745 // At this point, it should still be writable. |
| 800 waiter.Init(); | 746 waiter.Init(); |
| 801 hss = HandleSignalsState(); | 747 hss = HandleSignalsState(); |
| 802 EXPECT_EQ( | 748 EXPECT_EQ( |
| 803 MOJO_RESULT_ALREADY_EXISTS, | 749 MOJO_RESULT_ALREADY_EXISTS, |
| 804 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6, &hss)); | 750 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6, &hss)); |
| 805 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 751 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 834 | 780 |
| 835 // Test that a "may discard" data pipe is writable even when it's full. | 781 // Test that a "may discard" data pipe is writable even when it's full. |
| 836 TEST(LocalDataPipeTest, BasicMayDiscardWaiting) { | 782 TEST(LocalDataPipeTest, BasicMayDiscardWaiting) { |
| 837 const MojoCreateDataPipeOptions options = { | 783 const MojoCreateDataPipeOptions options = { |
| 838 kSizeOfOptions, // |struct_size|. | 784 kSizeOfOptions, // |struct_size|. |
| 839 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. | 785 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. |
| 840 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 786 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
| 841 1 * sizeof(int32_t) // |capacity_num_bytes|. | 787 1 * sizeof(int32_t) // |capacity_num_bytes|. |
| 842 }; | 788 }; |
| 843 MojoCreateDataPipeOptions validated_options = {0}; | 789 MojoCreateDataPipeOptions validated_options = {0}; |
| 844 EXPECT_EQ(MOJO_RESULT_OK, | 790 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( |
| 845 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), | 791 MakeUserPointer(&options), &validated_options)); |
| 846 &validated_options)); | |
| 847 | 792 |
| 848 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 793 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 849 Waiter waiter; | 794 Waiter waiter; |
| 850 HandleSignalsState hss; | 795 HandleSignalsState hss; |
| 851 | 796 |
| 852 // Writable. | 797 // Writable. |
| 853 waiter.Init(); | 798 waiter.Init(); |
| 854 hss = HandleSignalsState(); | 799 hss = HandleSignalsState(); |
| 855 EXPECT_EQ( | 800 EXPECT_EQ( |
| 856 MOJO_RESULT_ALREADY_EXISTS, | 801 MOJO_RESULT_ALREADY_EXISTS, |
| 857 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); | 802 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); |
| 858 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 803 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 859 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); | 804 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); |
| 860 | 805 |
| 861 // Not readable. | 806 // Not readable. |
| 862 waiter.Init(); | 807 waiter.Init(); |
| 863 ASSERT_EQ( | 808 ASSERT_EQ( |
| 864 MOJO_RESULT_OK, | 809 MOJO_RESULT_OK, |
| 865 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 1, nullptr)); | 810 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 1, nullptr)); |
| 866 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); | 811 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); |
| 867 hss = HandleSignalsState(); | 812 hss = HandleSignalsState(); |
| 868 dp->ConsumerRemoveWaiter(&waiter, &hss); | 813 dp->ConsumerRemoveWaiter(&waiter, &hss); |
| 869 EXPECT_EQ(0u, hss.satisfied_signals); | 814 EXPECT_EQ(0u, hss.satisfied_signals); |
| 870 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 815 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
| 871 | 816 |
| 872 uint32_t num_bytes = static_cast<uint32_t>(sizeof(int32_t)); | 817 uint32_t num_bytes = static_cast<uint32_t>(sizeof(int32_t)); |
| 873 int32_t element = 123; | 818 int32_t element = 123; |
| 874 EXPECT_EQ(MOJO_RESULT_OK, | 819 EXPECT_EQ(MOJO_RESULT_OK, |
| 875 dp->ProducerWriteData(UserPointer<const void>(&element), | 820 dp->ProducerWriteData(UserPointer<const void>(&element), |
| 876 MakeUserPointer(&num_bytes), | 821 MakeUserPointer(&num_bytes), false)); |
| 877 false)); | |
| 878 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); | 822 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); |
| 879 | 823 |
| 880 // Still writable (even though it's full). | 824 // Still writable (even though it's full). |
| 881 waiter.Init(); | 825 waiter.Init(); |
| 882 hss = HandleSignalsState(); | 826 hss = HandleSignalsState(); |
| 883 EXPECT_EQ( | 827 EXPECT_EQ( |
| 884 MOJO_RESULT_ALREADY_EXISTS, | 828 MOJO_RESULT_ALREADY_EXISTS, |
| 885 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 2, &hss)); | 829 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 2, &hss)); |
| 886 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 830 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 887 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); | 831 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); |
| 888 | 832 |
| 889 // Now readable. | 833 // Now readable. |
| 890 waiter.Init(); | 834 waiter.Init(); |
| 891 hss = HandleSignalsState(); | 835 hss = HandleSignalsState(); |
| 892 EXPECT_EQ( | 836 EXPECT_EQ( |
| 893 MOJO_RESULT_ALREADY_EXISTS, | 837 MOJO_RESULT_ALREADY_EXISTS, |
| 894 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 3, &hss)); | 838 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 3, &hss)); |
| 895 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 839 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 896 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 840 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
| 897 | 841 |
| 898 // Overwrite that element. | 842 // Overwrite that element. |
| 899 num_bytes = static_cast<uint32_t>(sizeof(int32_t)); | 843 num_bytes = static_cast<uint32_t>(sizeof(int32_t)); |
| 900 element = 456; | 844 element = 456; |
| 901 EXPECT_EQ(MOJO_RESULT_OK, | 845 EXPECT_EQ(MOJO_RESULT_OK, |
| 902 dp->ProducerWriteData(UserPointer<const void>(&element), | 846 dp->ProducerWriteData(UserPointer<const void>(&element), |
| 903 MakeUserPointer(&num_bytes), | 847 MakeUserPointer(&num_bytes), false)); |
| 904 false)); | |
| 905 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); | 848 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); |
| 906 | 849 |
| 907 // Still writable. | 850 // Still writable. |
| 908 waiter.Init(); | 851 waiter.Init(); |
| 909 hss = HandleSignalsState(); | 852 hss = HandleSignalsState(); |
| 910 EXPECT_EQ( | 853 EXPECT_EQ( |
| 911 MOJO_RESULT_ALREADY_EXISTS, | 854 MOJO_RESULT_ALREADY_EXISTS, |
| 912 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 4, &hss)); | 855 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 4, &hss)); |
| 913 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 856 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 914 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); | 857 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); |
| 915 | 858 |
| 916 // And still readable. | 859 // And still readable. |
| 917 waiter.Init(); | 860 waiter.Init(); |
| 918 hss = HandleSignalsState(); | 861 hss = HandleSignalsState(); |
| 919 EXPECT_EQ( | 862 EXPECT_EQ( |
| 920 MOJO_RESULT_ALREADY_EXISTS, | 863 MOJO_RESULT_ALREADY_EXISTS, |
| 921 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 5, &hss)); | 864 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 5, &hss)); |
| 922 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 865 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 923 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 866 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
| 924 | 867 |
| 925 // Read that element. | 868 // Read that element. |
| 926 num_bytes = static_cast<uint32_t>(sizeof(int32_t)); | 869 num_bytes = static_cast<uint32_t>(sizeof(int32_t)); |
| 927 element = 0; | 870 element = 0; |
| 928 EXPECT_EQ( | 871 EXPECT_EQ(MOJO_RESULT_OK, |
| 929 MOJO_RESULT_OK, | 872 dp->ConsumerReadData(UserPointer<void>(&element), |
| 930 dp->ConsumerReadData(UserPointer<void>(&element), | 873 MakeUserPointer(&num_bytes), false, false)); |
| 931 MakeUserPointer(&num_bytes), | |
| 932 false, | |
| 933 false)); | |
| 934 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); | 874 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); |
| 935 EXPECT_EQ(456, element); | 875 EXPECT_EQ(456, element); |
| 936 | 876 |
| 937 // Still writable. | 877 // Still writable. |
| 938 waiter.Init(); | 878 waiter.Init(); |
| 939 hss = HandleSignalsState(); | 879 hss = HandleSignalsState(); |
| 940 EXPECT_EQ( | 880 EXPECT_EQ( |
| 941 MOJO_RESULT_ALREADY_EXISTS, | 881 MOJO_RESULT_ALREADY_EXISTS, |
| 942 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6, &hss)); | 882 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6, &hss)); |
| 943 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 883 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 964 } | 904 } |
| 965 | 905 |
| 966 TEST(LocalDataPipeTest, MayDiscard) { | 906 TEST(LocalDataPipeTest, MayDiscard) { |
| 967 const MojoCreateDataPipeOptions options = { | 907 const MojoCreateDataPipeOptions options = { |
| 968 kSizeOfOptions, // |struct_size|. | 908 kSizeOfOptions, // |struct_size|. |
| 969 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. | 909 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. |
| 970 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 910 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
| 971 10 * sizeof(int32_t) // |capacity_num_bytes|. | 911 10 * sizeof(int32_t) // |capacity_num_bytes|. |
| 972 }; | 912 }; |
| 973 MojoCreateDataPipeOptions validated_options = {0}; | 913 MojoCreateDataPipeOptions validated_options = {0}; |
| 974 EXPECT_EQ(MOJO_RESULT_OK, | 914 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( |
| 975 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), | 915 MakeUserPointer(&options), &validated_options)); |
| 976 &validated_options)); | |
| 977 | 916 |
| 978 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 917 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 979 | 918 |
| 980 int32_t buffer[100] = {0}; | 919 int32_t buffer[100] = {0}; |
| 981 uint32_t num_bytes = 0; | 920 uint32_t num_bytes = 0; |
| 982 | 921 |
| 983 num_bytes = 20u * sizeof(int32_t); | 922 num_bytes = 20u * sizeof(int32_t); |
| 984 Seq(0, arraysize(buffer), buffer); | 923 Seq(0, arraysize(buffer), buffer); |
| 985 // Try writing more than capacity. (This test relies on the implementation | 924 // Try writing more than capacity. (This test relies on the implementation |
| 986 // enforcing the capacity strictly.) | 925 // enforcing the capacity strictly.) |
| 987 EXPECT_EQ( | 926 EXPECT_EQ(MOJO_RESULT_OK, |
| 988 MOJO_RESULT_OK, | 927 dp->ProducerWriteData(UserPointer<const void>(buffer), |
| 989 dp->ProducerWriteData( | 928 MakeUserPointer(&num_bytes), false)); |
| 990 UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), false)); | |
| 991 EXPECT_EQ(10u * sizeof(int32_t), num_bytes); | 929 EXPECT_EQ(10u * sizeof(int32_t), num_bytes); |
| 992 | 930 |
| 993 // Read half of what we wrote. | 931 // Read half of what we wrote. |
| 994 num_bytes = 5u * sizeof(int32_t); | 932 num_bytes = 5u * sizeof(int32_t); |
| 995 memset(buffer, 0xab, sizeof(buffer)); | 933 memset(buffer, 0xab, sizeof(buffer)); |
| 996 EXPECT_EQ(MOJO_RESULT_OK, | 934 EXPECT_EQ(MOJO_RESULT_OK, |
| 997 dp->ConsumerReadData(UserPointer<void>(buffer), | 935 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 998 MakeUserPointer(&num_bytes), | 936 MakeUserPointer(&num_bytes), false, false)); |
| 999 false, | |
| 1000 false)); | |
| 1001 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); | 937 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); |
| 1002 int32_t expected_buffer[100]; | 938 int32_t expected_buffer[100]; |
| 1003 memset(expected_buffer, 0xab, sizeof(expected_buffer)); | 939 memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
| 1004 Seq(0, 5u, expected_buffer); | 940 Seq(0, 5u, expected_buffer); |
| 1005 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); | 941 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
| 1006 // Internally, a circular buffer would now look like: | 942 // Internally, a circular buffer would now look like: |
| 1007 // -, -, -, -, -, 5, 6, 7, 8, 9 | 943 // -, -, -, -, -, 5, 6, 7, 8, 9 |
| 1008 | 944 |
| 1009 // Write a bit more than the space that's available. | 945 // Write a bit more than the space that's available. |
| 1010 num_bytes = 8u * sizeof(int32_t); | 946 num_bytes = 8u * sizeof(int32_t); |
| 1011 Seq(100, arraysize(buffer), buffer); | 947 Seq(100, arraysize(buffer), buffer); |
| 1012 EXPECT_EQ( | 948 EXPECT_EQ(MOJO_RESULT_OK, |
| 1013 MOJO_RESULT_OK, | 949 dp->ProducerWriteData(UserPointer<const void>(buffer), |
| 1014 dp->ProducerWriteData( | 950 MakeUserPointer(&num_bytes), false)); |
| 1015 UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), false)); | |
| 1016 EXPECT_EQ(8u * sizeof(int32_t), num_bytes); | 951 EXPECT_EQ(8u * sizeof(int32_t), num_bytes); |
| 1017 // Internally, a circular buffer would now look like: | 952 // Internally, a circular buffer would now look like: |
| 1018 // 100, 101, 102, 103, 104, 105, 106, 107, 8, 9 | 953 // 100, 101, 102, 103, 104, 105, 106, 107, 8, 9 |
| 1019 | 954 |
| 1020 // Read half of what's available. | 955 // Read half of what's available. |
| 1021 num_bytes = 5u * sizeof(int32_t); | 956 num_bytes = 5u * sizeof(int32_t); |
| 1022 memset(buffer, 0xab, sizeof(buffer)); | 957 memset(buffer, 0xab, sizeof(buffer)); |
| 1023 EXPECT_EQ(MOJO_RESULT_OK, | 958 EXPECT_EQ(MOJO_RESULT_OK, |
| 1024 dp->ConsumerReadData(UserPointer<void>(buffer), | 959 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 1025 MakeUserPointer(&num_bytes), | 960 MakeUserPointer(&num_bytes), false, false)); |
| 1026 false, | |
| 1027 false)); | |
| 1028 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); | 961 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); |
| 1029 memset(expected_buffer, 0xab, sizeof(expected_buffer)); | 962 memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
| 1030 expected_buffer[0] = 8; | 963 expected_buffer[0] = 8; |
| 1031 expected_buffer[1] = 9; | 964 expected_buffer[1] = 9; |
| 1032 expected_buffer[2] = 100; | 965 expected_buffer[2] = 100; |
| 1033 expected_buffer[3] = 101; | 966 expected_buffer[3] = 101; |
| 1034 expected_buffer[4] = 102; | 967 expected_buffer[4] = 102; |
| 1035 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); | 968 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
| 1036 // Internally, a circular buffer would now look like: | 969 // Internally, a circular buffer would now look like: |
| 1037 // -, -, -, 103, 104, 105, 106, 107, -, - | 970 // -, -, -, 103, 104, 105, 106, 107, -, - |
| 1038 | 971 |
| 1039 // Write one integer. | 972 // Write one integer. |
| 1040 num_bytes = 1u * sizeof(int32_t); | 973 num_bytes = 1u * sizeof(int32_t); |
| 1041 Seq(200, arraysize(buffer), buffer); | 974 Seq(200, arraysize(buffer), buffer); |
| 1042 EXPECT_EQ( | 975 EXPECT_EQ(MOJO_RESULT_OK, |
| 1043 MOJO_RESULT_OK, | 976 dp->ProducerWriteData(UserPointer<const void>(buffer), |
| 1044 dp->ProducerWriteData( | 977 MakeUserPointer(&num_bytes), false)); |
| 1045 UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), false)); | |
| 1046 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); | 978 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); |
| 1047 // Internally, a circular buffer would now look like: | 979 // Internally, a circular buffer would now look like: |
| 1048 // -, -, -, 103, 104, 105, 106, 107, 200, - | 980 // -, -, -, 103, 104, 105, 106, 107, 200, - |
| 1049 | 981 |
| 1050 // Write five more. | 982 // Write five more. |
| 1051 num_bytes = 5u * sizeof(int32_t); | 983 num_bytes = 5u * sizeof(int32_t); |
| 1052 Seq(300, arraysize(buffer), buffer); | 984 Seq(300, arraysize(buffer), buffer); |
| 1053 EXPECT_EQ( | 985 EXPECT_EQ(MOJO_RESULT_OK, |
| 1054 MOJO_RESULT_OK, | 986 dp->ProducerWriteData(UserPointer<const void>(buffer), |
| 1055 dp->ProducerWriteData( | 987 MakeUserPointer(&num_bytes), false)); |
| 1056 UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), false)); | |
| 1057 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); | 988 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); |
| 1058 // Internally, a circular buffer would now look like: | 989 // Internally, a circular buffer would now look like: |
| 1059 // 301, 302, 303, 304, 104, 105, 106, 107, 200, 300 | 990 // 301, 302, 303, 304, 104, 105, 106, 107, 200, 300 |
| 1060 | 991 |
| 1061 // Read it all. | 992 // Read it all. |
| 1062 num_bytes = sizeof(buffer); | 993 num_bytes = sizeof(buffer); |
| 1063 memset(buffer, 0xab, sizeof(buffer)); | 994 memset(buffer, 0xab, sizeof(buffer)); |
| 1064 EXPECT_EQ(MOJO_RESULT_OK, | 995 EXPECT_EQ(MOJO_RESULT_OK, |
| 1065 dp->ConsumerReadData(UserPointer<void>(buffer), | 996 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 1066 MakeUserPointer(&num_bytes), | 997 MakeUserPointer(&num_bytes), false, false)); |
| 1067 false, | |
| 1068 false)); | |
| 1069 EXPECT_EQ(10u * sizeof(int32_t), num_bytes); | 998 EXPECT_EQ(10u * sizeof(int32_t), num_bytes); |
| 1070 memset(expected_buffer, 0xab, sizeof(expected_buffer)); | 999 memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
| 1071 expected_buffer[0] = 104; | 1000 expected_buffer[0] = 104; |
| 1072 expected_buffer[1] = 105; | 1001 expected_buffer[1] = 105; |
| 1073 expected_buffer[2] = 106; | 1002 expected_buffer[2] = 106; |
| 1074 expected_buffer[3] = 107; | 1003 expected_buffer[3] = 107; |
| 1075 expected_buffer[4] = 200; | 1004 expected_buffer[4] = 200; |
| 1076 expected_buffer[5] = 300; | 1005 expected_buffer[5] = 300; |
| 1077 expected_buffer[6] = 301; | 1006 expected_buffer[6] = 301; |
| 1078 expected_buffer[7] = 302; | 1007 expected_buffer[7] = 302; |
| 1079 expected_buffer[8] = 303; | 1008 expected_buffer[8] = 303; |
| 1080 expected_buffer[9] = 304; | 1009 expected_buffer[9] = 304; |
| 1081 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); | 1010 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
| 1082 | 1011 |
| 1083 // Test two-phase writes, including in all-or-none mode. | 1012 // Test two-phase writes, including in all-or-none mode. |
| 1084 // Note: Again, the following depends on an implementation detail -- namely | 1013 // Note: Again, the following depends on an implementation detail -- namely |
| 1085 // that the write pointer will point at the 5th element of the buffer (and the | 1014 // that the write pointer will point at the 5th element of the buffer (and the |
| 1086 // buffer has exactly the capacity requested). | 1015 // buffer has exactly the capacity requested). |
| 1087 | 1016 |
| 1088 num_bytes = 0u; | 1017 num_bytes = 0u; |
| 1089 void* write_ptr = nullptr; | 1018 void* write_ptr = nullptr; |
| 1090 EXPECT_EQ( | 1019 EXPECT_EQ(MOJO_RESULT_OK, |
| 1091 MOJO_RESULT_OK, | 1020 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
| 1092 dp->ProducerBeginWriteData( | 1021 MakeUserPointer(&num_bytes), false)); |
| 1093 MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), false)); | |
| 1094 EXPECT_TRUE(write_ptr); | 1022 EXPECT_TRUE(write_ptr); |
| 1095 EXPECT_EQ(6u * sizeof(int32_t), num_bytes); | 1023 EXPECT_EQ(6u * sizeof(int32_t), num_bytes); |
| 1096 Seq(400, 6, static_cast<int32_t*>(write_ptr)); | 1024 Seq(400, 6, static_cast<int32_t*>(write_ptr)); |
| 1097 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(6u * sizeof(int32_t))); | 1025 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(6u * sizeof(int32_t))); |
| 1098 // Internally, a circular buffer would now look like: | 1026 // Internally, a circular buffer would now look like: |
| 1099 // -, -, -, -, 400, 401, 402, 403, 404, 405 | 1027 // -, -, -, -, 400, 401, 402, 403, 404, 405 |
| 1100 | 1028 |
| 1101 // |ProducerBeginWriteData()| ignores |*num_bytes| except in "all-or-none" | 1029 // |ProducerBeginWriteData()| ignores |*num_bytes| except in "all-or-none" |
| 1102 // mode. | 1030 // mode. |
| 1103 num_bytes = 6u * sizeof(int32_t); | 1031 num_bytes = 6u * sizeof(int32_t); |
| 1104 write_ptr = nullptr; | 1032 write_ptr = nullptr; |
| 1105 EXPECT_EQ( | 1033 EXPECT_EQ(MOJO_RESULT_OK, |
| 1106 MOJO_RESULT_OK, | 1034 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
| 1107 dp->ProducerBeginWriteData( | 1035 MakeUserPointer(&num_bytes), false)); |
| 1108 MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), false)); | |
| 1109 EXPECT_EQ(4u * sizeof(int32_t), num_bytes); | 1036 EXPECT_EQ(4u * sizeof(int32_t), num_bytes); |
| 1110 static_cast<int32_t*>(write_ptr)[0] = 500; | 1037 static_cast<int32_t*>(write_ptr)[0] = 500; |
| 1111 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(1u * sizeof(int32_t))); | 1038 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(1u * sizeof(int32_t))); |
| 1112 // Internally, a circular buffer would now look like: | 1039 // Internally, a circular buffer would now look like: |
| 1113 // 500, -, -, -, 400, 401, 402, 403, 404, 405 | 1040 // 500, -, -, -, 400, 401, 402, 403, 404, 405 |
| 1114 | 1041 |
| 1115 // Requesting a 10-element buffer in all-or-none mode fails at this point. | 1042 // Requesting a 10-element buffer in all-or-none mode fails at this point. |
| 1116 num_bytes = 10u * sizeof(int32_t); | 1043 num_bytes = 10u * sizeof(int32_t); |
| 1117 write_ptr = nullptr; | 1044 write_ptr = nullptr; |
| 1118 EXPECT_EQ( | 1045 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
| 1119 MOJO_RESULT_OUT_OF_RANGE, | 1046 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
| 1120 dp->ProducerBeginWriteData( | 1047 MakeUserPointer(&num_bytes), true)); |
| 1121 MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), true)); | |
| 1122 | 1048 |
| 1123 // But requesting, say, a 5-element (up to 9, really) buffer should be okay. | 1049 // But requesting, say, a 5-element (up to 9, really) buffer should be okay. |
| 1124 // It will discard two elements. | 1050 // It will discard two elements. |
| 1125 num_bytes = 5u * sizeof(int32_t); | 1051 num_bytes = 5u * sizeof(int32_t); |
| 1126 write_ptr = nullptr; | 1052 write_ptr = nullptr; |
| 1127 EXPECT_EQ( | 1053 EXPECT_EQ(MOJO_RESULT_OK, |
| 1128 MOJO_RESULT_OK, | 1054 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
| 1129 dp->ProducerBeginWriteData( | 1055 MakeUserPointer(&num_bytes), true)); |
| 1130 MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), true)); | |
| 1131 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); | 1056 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); |
| 1132 // Only write 4 elements though. | 1057 // Only write 4 elements though. |
| 1133 Seq(600, 4, static_cast<int32_t*>(write_ptr)); | 1058 Seq(600, 4, static_cast<int32_t*>(write_ptr)); |
| 1134 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(4u * sizeof(int32_t))); | 1059 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(4u * sizeof(int32_t))); |
| 1135 // Internally, a circular buffer would now look like: | 1060 // Internally, a circular buffer would now look like: |
| 1136 // 500, 600, 601, 602, 603, -, 402, 403, 404, 405 | 1061 // 500, 600, 601, 602, 603, -, 402, 403, 404, 405 |
| 1137 | 1062 |
| 1138 // Do this again. Make sure we can get a buffer all the way out to the end of | 1063 // Do this again. Make sure we can get a buffer all the way out to the end of |
| 1139 // the internal buffer. | 1064 // the internal buffer. |
| 1140 num_bytes = 5u * sizeof(int32_t); | 1065 num_bytes = 5u * sizeof(int32_t); |
| 1141 write_ptr = nullptr; | 1066 write_ptr = nullptr; |
| 1142 EXPECT_EQ( | 1067 EXPECT_EQ(MOJO_RESULT_OK, |
| 1143 MOJO_RESULT_OK, | 1068 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
| 1144 dp->ProducerBeginWriteData( | 1069 MakeUserPointer(&num_bytes), true)); |
| 1145 MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), true)); | |
| 1146 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); | 1070 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); |
| 1147 // Only write 3 elements though. | 1071 // Only write 3 elements though. |
| 1148 Seq(700, 3, static_cast<int32_t*>(write_ptr)); | 1072 Seq(700, 3, static_cast<int32_t*>(write_ptr)); |
| 1149 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(3u * sizeof(int32_t))); | 1073 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(3u * sizeof(int32_t))); |
| 1150 // Internally, a circular buffer would now look like: | 1074 // Internally, a circular buffer would now look like: |
| 1151 // 500, 600, 601, 602, 603, 700, 701, 702, -, - | 1075 // 500, 600, 601, 602, 603, 700, 701, 702, -, - |
| 1152 | 1076 |
| 1153 // Read everything. | 1077 // Read everything. |
| 1154 num_bytes = sizeof(buffer); | 1078 num_bytes = sizeof(buffer); |
| 1155 memset(buffer, 0xab, sizeof(buffer)); | 1079 memset(buffer, 0xab, sizeof(buffer)); |
| 1156 EXPECT_EQ(MOJO_RESULT_OK, | 1080 EXPECT_EQ(MOJO_RESULT_OK, |
| 1157 dp->ConsumerReadData(UserPointer<void>(buffer), | 1081 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 1158 MakeUserPointer(&num_bytes), | 1082 MakeUserPointer(&num_bytes), false, false)); |
| 1159 false, | |
| 1160 false)); | |
| 1161 EXPECT_EQ(8u * sizeof(int32_t), num_bytes); | 1083 EXPECT_EQ(8u * sizeof(int32_t), num_bytes); |
| 1162 memset(expected_buffer, 0xab, sizeof(expected_buffer)); | 1084 memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
| 1163 expected_buffer[0] = 500; | 1085 expected_buffer[0] = 500; |
| 1164 expected_buffer[1] = 600; | 1086 expected_buffer[1] = 600; |
| 1165 expected_buffer[2] = 601; | 1087 expected_buffer[2] = 601; |
| 1166 expected_buffer[3] = 602; | 1088 expected_buffer[3] = 602; |
| 1167 expected_buffer[4] = 603; | 1089 expected_buffer[4] = 603; |
| 1168 expected_buffer[5] = 700; | 1090 expected_buffer[5] = 700; |
| 1169 expected_buffer[6] = 701; | 1091 expected_buffer[6] = 701; |
| 1170 expected_buffer[7] = 702; | 1092 expected_buffer[7] = 702; |
| 1171 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); | 1093 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
| 1172 | 1094 |
| 1173 dp->ProducerClose(); | 1095 dp->ProducerClose(); |
| 1174 dp->ConsumerClose(); | 1096 dp->ConsumerClose(); |
| 1175 } | 1097 } |
| 1176 | 1098 |
| 1177 TEST(LocalDataPipeTest, AllOrNone) { | 1099 TEST(LocalDataPipeTest, AllOrNone) { |
| 1178 const MojoCreateDataPipeOptions options = { | 1100 const MojoCreateDataPipeOptions options = { |
| 1179 kSizeOfOptions, // |struct_size|. | 1101 kSizeOfOptions, // |struct_size|. |
| 1180 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 1102 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| 1181 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 1103 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
| 1182 10 * sizeof(int32_t) // |capacity_num_bytes|. | 1104 10 * sizeof(int32_t) // |capacity_num_bytes|. |
| 1183 }; | 1105 }; |
| 1184 MojoCreateDataPipeOptions validated_options = {0}; | 1106 MojoCreateDataPipeOptions validated_options = {0}; |
| 1185 EXPECT_EQ(MOJO_RESULT_OK, | 1107 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( |
| 1186 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), | 1108 MakeUserPointer(&options), &validated_options)); |
| 1187 &validated_options)); | |
| 1188 | 1109 |
| 1189 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 1110 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 1190 | 1111 |
| 1191 // Try writing way too much. | 1112 // Try writing way too much. |
| 1192 uint32_t num_bytes = 20u * sizeof(int32_t); | 1113 uint32_t num_bytes = 20u * sizeof(int32_t); |
| 1193 int32_t buffer[100]; | 1114 int32_t buffer[100]; |
| 1194 Seq(0, arraysize(buffer), buffer); | 1115 Seq(0, arraysize(buffer), buffer); |
| 1195 EXPECT_EQ( | 1116 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
| 1196 MOJO_RESULT_OUT_OF_RANGE, | 1117 dp->ProducerWriteData(UserPointer<const void>(buffer), |
| 1197 dp->ProducerWriteData( | 1118 MakeUserPointer(&num_bytes), true)); |
| 1198 UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), true)); | |
| 1199 | 1119 |
| 1200 // Should still be empty. | 1120 // Should still be empty. |
| 1201 num_bytes = ~0u; | 1121 num_bytes = ~0u; |
| 1202 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); | 1122 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
| 1203 EXPECT_EQ(0u, num_bytes); | 1123 EXPECT_EQ(0u, num_bytes); |
| 1204 | 1124 |
| 1205 // Write some data. | 1125 // Write some data. |
| 1206 num_bytes = 5u * sizeof(int32_t); | 1126 num_bytes = 5u * sizeof(int32_t); |
| 1207 Seq(100, arraysize(buffer), buffer); | 1127 Seq(100, arraysize(buffer), buffer); |
| 1208 EXPECT_EQ( | 1128 EXPECT_EQ(MOJO_RESULT_OK, |
| 1209 MOJO_RESULT_OK, | 1129 dp->ProducerWriteData(UserPointer<const void>(buffer), |
| 1210 dp->ProducerWriteData( | 1130 MakeUserPointer(&num_bytes), true)); |
| 1211 UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), true)); | |
| 1212 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); | 1131 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); |
| 1213 | 1132 |
| 1214 // Half full. | 1133 // Half full. |
| 1215 num_bytes = 0u; | 1134 num_bytes = 0u; |
| 1216 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); | 1135 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
| 1217 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); | 1136 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); |
| 1218 | 1137 |
| 1219 // Too much. | 1138 // Too much. |
| 1220 num_bytes = 6u * sizeof(int32_t); | 1139 num_bytes = 6u * sizeof(int32_t); |
| 1221 Seq(200, arraysize(buffer), buffer); | 1140 Seq(200, arraysize(buffer), buffer); |
| 1222 EXPECT_EQ( | 1141 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
| 1223 MOJO_RESULT_OUT_OF_RANGE, | 1142 dp->ProducerWriteData(UserPointer<const void>(buffer), |
| 1224 dp->ProducerWriteData( | 1143 MakeUserPointer(&num_bytes), true)); |
| 1225 UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), true)); | |
| 1226 | 1144 |
| 1227 // Try reading too much. | 1145 // Try reading too much. |
| 1228 num_bytes = 11u * sizeof(int32_t); | 1146 num_bytes = 11u * sizeof(int32_t); |
| 1229 memset(buffer, 0xab, sizeof(buffer)); | 1147 memset(buffer, 0xab, sizeof(buffer)); |
| 1230 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, | 1148 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
| 1231 dp->ConsumerReadData(UserPointer<void>(buffer), | 1149 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 1232 MakeUserPointer(&num_bytes), | 1150 MakeUserPointer(&num_bytes), true, false)); |
| 1233 true, | |
| 1234 false)); | |
| 1235 int32_t expected_buffer[100]; | 1151 int32_t expected_buffer[100]; |
| 1236 memset(expected_buffer, 0xab, sizeof(expected_buffer)); | 1152 memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
| 1237 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); | 1153 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
| 1238 | 1154 |
| 1239 // Try discarding too much. | 1155 // Try discarding too much. |
| 1240 num_bytes = 11u * sizeof(int32_t); | 1156 num_bytes = 11u * sizeof(int32_t); |
| 1241 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, | 1157 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
| 1242 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); | 1158 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); |
| 1243 | 1159 |
| 1244 // Just a little. | 1160 // Just a little. |
| 1245 num_bytes = 2u * sizeof(int32_t); | 1161 num_bytes = 2u * sizeof(int32_t); |
| 1246 Seq(300, arraysize(buffer), buffer); | 1162 Seq(300, arraysize(buffer), buffer); |
| 1247 EXPECT_EQ( | 1163 EXPECT_EQ(MOJO_RESULT_OK, |
| 1248 MOJO_RESULT_OK, | 1164 dp->ProducerWriteData(UserPointer<const void>(buffer), |
| 1249 dp->ProducerWriteData( | 1165 MakeUserPointer(&num_bytes), true)); |
| 1250 UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), true)); | |
| 1251 EXPECT_EQ(2u * sizeof(int32_t), num_bytes); | 1166 EXPECT_EQ(2u * sizeof(int32_t), num_bytes); |
| 1252 | 1167 |
| 1253 // Just right. | 1168 // Just right. |
| 1254 num_bytes = 3u * sizeof(int32_t); | 1169 num_bytes = 3u * sizeof(int32_t); |
| 1255 Seq(400, arraysize(buffer), buffer); | 1170 Seq(400, arraysize(buffer), buffer); |
| 1256 EXPECT_EQ( | 1171 EXPECT_EQ(MOJO_RESULT_OK, |
| 1257 MOJO_RESULT_OK, | 1172 dp->ProducerWriteData(UserPointer<const void>(buffer), |
| 1258 dp->ProducerWriteData( | 1173 MakeUserPointer(&num_bytes), true)); |
| 1259 UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), true)); | |
| 1260 EXPECT_EQ(3u * sizeof(int32_t), num_bytes); | 1174 EXPECT_EQ(3u * sizeof(int32_t), num_bytes); |
| 1261 | 1175 |
| 1262 // Exactly full. | 1176 // Exactly full. |
| 1263 num_bytes = 0u; | 1177 num_bytes = 0u; |
| 1264 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); | 1178 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
| 1265 EXPECT_EQ(10u * sizeof(int32_t), num_bytes); | 1179 EXPECT_EQ(10u * sizeof(int32_t), num_bytes); |
| 1266 | 1180 |
| 1267 // Read half. | 1181 // Read half. |
| 1268 num_bytes = 5u * sizeof(int32_t); | 1182 num_bytes = 5u * sizeof(int32_t); |
| 1269 memset(buffer, 0xab, sizeof(buffer)); | 1183 memset(buffer, 0xab, sizeof(buffer)); |
| 1270 EXPECT_EQ(MOJO_RESULT_OK, | 1184 EXPECT_EQ(MOJO_RESULT_OK, |
| 1271 dp->ConsumerReadData(UserPointer<void>(buffer), | 1185 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 1272 MakeUserPointer(&num_bytes), | 1186 MakeUserPointer(&num_bytes), true, false)); |
| 1273 true, | |
| 1274 false)); | |
| 1275 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); | 1187 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); |
| 1276 memset(expected_buffer, 0xab, sizeof(expected_buffer)); | 1188 memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
| 1277 Seq(100, 5, expected_buffer); | 1189 Seq(100, 5, expected_buffer); |
| 1278 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); | 1190 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
| 1279 | 1191 |
| 1280 // Try reading too much again. | 1192 // Try reading too much again. |
| 1281 num_bytes = 6u * sizeof(int32_t); | 1193 num_bytes = 6u * sizeof(int32_t); |
| 1282 memset(buffer, 0xab, sizeof(buffer)); | 1194 memset(buffer, 0xab, sizeof(buffer)); |
| 1283 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, | 1195 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
| 1284 dp->ConsumerReadData(UserPointer<void>(buffer), | 1196 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 1285 MakeUserPointer(&num_bytes), | 1197 MakeUserPointer(&num_bytes), true, false)); |
| 1286 true, | |
| 1287 false)); | |
| 1288 memset(expected_buffer, 0xab, sizeof(expected_buffer)); | 1198 memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
| 1289 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); | 1199 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
| 1290 | 1200 |
| 1291 // Try discarding too much again. | 1201 // Try discarding too much again. |
| 1292 num_bytes = 6u * sizeof(int32_t); | 1202 num_bytes = 6u * sizeof(int32_t); |
| 1293 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, | 1203 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
| 1294 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); | 1204 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); |
| 1295 | 1205 |
| 1296 // Discard a little. | 1206 // Discard a little. |
| 1297 num_bytes = 2u * sizeof(int32_t); | 1207 num_bytes = 2u * sizeof(int32_t); |
| 1298 EXPECT_EQ(MOJO_RESULT_OK, | 1208 EXPECT_EQ(MOJO_RESULT_OK, |
| 1299 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); | 1209 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); |
| 1300 EXPECT_EQ(2u * sizeof(int32_t), num_bytes); | 1210 EXPECT_EQ(2u * sizeof(int32_t), num_bytes); |
| 1301 | 1211 |
| 1302 // Three left. | 1212 // Three left. |
| 1303 num_bytes = 0u; | 1213 num_bytes = 0u; |
| 1304 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); | 1214 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
| 1305 EXPECT_EQ(3u * sizeof(int32_t), num_bytes); | 1215 EXPECT_EQ(3u * sizeof(int32_t), num_bytes); |
| 1306 | 1216 |
| 1307 // Close the producer, then test producer-closed cases. | 1217 // Close the producer, then test producer-closed cases. |
| 1308 dp->ProducerClose(); | 1218 dp->ProducerClose(); |
| 1309 | 1219 |
| 1310 // Try reading too much; "failed precondition" since the producer is closed. | 1220 // Try reading too much; "failed precondition" since the producer is closed. |
| 1311 num_bytes = 4u * sizeof(int32_t); | 1221 num_bytes = 4u * sizeof(int32_t); |
| 1312 memset(buffer, 0xab, sizeof(buffer)); | 1222 memset(buffer, 0xab, sizeof(buffer)); |
| 1313 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 1223 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 1314 dp->ConsumerReadData(UserPointer<void>(buffer), | 1224 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 1315 MakeUserPointer(&num_bytes), | 1225 MakeUserPointer(&num_bytes), true, false)); |
| 1316 true, | |
| 1317 false)); | |
| 1318 memset(expected_buffer, 0xab, sizeof(expected_buffer)); | 1226 memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
| 1319 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); | 1227 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
| 1320 | 1228 |
| 1321 // Try discarding too much; "failed precondition" again. | 1229 // Try discarding too much; "failed precondition" again. |
| 1322 num_bytes = 4u * sizeof(int32_t); | 1230 num_bytes = 4u * sizeof(int32_t); |
| 1323 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 1231 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 1324 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); | 1232 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); |
| 1325 | 1233 |
| 1326 // Read a little. | 1234 // Read a little. |
| 1327 num_bytes = 2u * sizeof(int32_t); | 1235 num_bytes = 2u * sizeof(int32_t); |
| 1328 memset(buffer, 0xab, sizeof(buffer)); | 1236 memset(buffer, 0xab, sizeof(buffer)); |
| 1329 EXPECT_EQ(MOJO_RESULT_OK, | 1237 EXPECT_EQ(MOJO_RESULT_OK, |
| 1330 dp->ConsumerReadData(UserPointer<void>(buffer), | 1238 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 1331 MakeUserPointer(&num_bytes), | 1239 MakeUserPointer(&num_bytes), true, false)); |
| 1332 true, | |
| 1333 false)); | |
| 1334 EXPECT_EQ(2u * sizeof(int32_t), num_bytes); | 1240 EXPECT_EQ(2u * sizeof(int32_t), num_bytes); |
| 1335 memset(expected_buffer, 0xab, sizeof(expected_buffer)); | 1241 memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
| 1336 Seq(400, 2, expected_buffer); | 1242 Seq(400, 2, expected_buffer); |
| 1337 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); | 1243 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
| 1338 | 1244 |
| 1339 // Discard the remaining element. | 1245 // Discard the remaining element. |
| 1340 num_bytes = 1u * sizeof(int32_t); | 1246 num_bytes = 1u * sizeof(int32_t); |
| 1341 EXPECT_EQ(MOJO_RESULT_OK, | 1247 EXPECT_EQ(MOJO_RESULT_OK, |
| 1342 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); | 1248 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); |
| 1343 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); | 1249 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); |
| 1344 | 1250 |
| 1345 // Empty again. | 1251 // Empty again. |
| 1346 num_bytes = ~0u; | 1252 num_bytes = ~0u; |
| 1347 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); | 1253 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
| 1348 EXPECT_EQ(0u, num_bytes); | 1254 EXPECT_EQ(0u, num_bytes); |
| 1349 | 1255 |
| 1350 dp->ConsumerClose(); | 1256 dp->ConsumerClose(); |
| 1351 } | 1257 } |
| 1352 | 1258 |
| 1353 TEST(LocalDataPipeTest, AllOrNoneMayDiscard) { | 1259 TEST(LocalDataPipeTest, AllOrNoneMayDiscard) { |
| 1354 const MojoCreateDataPipeOptions options = { | 1260 const MojoCreateDataPipeOptions options = { |
| 1355 kSizeOfOptions, // |struct_size|. | 1261 kSizeOfOptions, // |struct_size|. |
| 1356 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. | 1262 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. |
| 1357 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 1263 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
| 1358 10 * sizeof(int32_t) // |capacity_num_bytes|. | 1264 10 * sizeof(int32_t) // |capacity_num_bytes|. |
| 1359 }; | 1265 }; |
| 1360 MojoCreateDataPipeOptions validated_options = {0}; | 1266 MojoCreateDataPipeOptions validated_options = {0}; |
| 1361 EXPECT_EQ(MOJO_RESULT_OK, | 1267 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( |
| 1362 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), | 1268 MakeUserPointer(&options), &validated_options)); |
| 1363 &validated_options)); | |
| 1364 | 1269 |
| 1365 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 1270 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 1366 | 1271 |
| 1367 // Try writing way too much. | 1272 // Try writing way too much. |
| 1368 uint32_t num_bytes = 20u * sizeof(int32_t); | 1273 uint32_t num_bytes = 20u * sizeof(int32_t); |
| 1369 int32_t buffer[100]; | 1274 int32_t buffer[100]; |
| 1370 Seq(0, arraysize(buffer), buffer); | 1275 Seq(0, arraysize(buffer), buffer); |
| 1371 EXPECT_EQ( | 1276 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
| 1372 MOJO_RESULT_OUT_OF_RANGE, | 1277 dp->ProducerWriteData(UserPointer<const void>(buffer), |
| 1373 dp->ProducerWriteData( | 1278 MakeUserPointer(&num_bytes), true)); |
| 1374 UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), true)); | |
| 1375 | 1279 |
| 1376 // Write some stuff. | 1280 // Write some stuff. |
| 1377 num_bytes = 5u * sizeof(int32_t); | 1281 num_bytes = 5u * sizeof(int32_t); |
| 1378 Seq(100, arraysize(buffer), buffer); | 1282 Seq(100, arraysize(buffer), buffer); |
| 1379 EXPECT_EQ( | 1283 EXPECT_EQ(MOJO_RESULT_OK, |
| 1380 MOJO_RESULT_OK, | 1284 dp->ProducerWriteData(UserPointer<const void>(buffer), |
| 1381 dp->ProducerWriteData( | 1285 MakeUserPointer(&num_bytes), true)); |
| 1382 UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), true)); | |
| 1383 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); | 1286 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); |
| 1384 | 1287 |
| 1385 // Write lots of stuff (discarding all but "104"). | 1288 // Write lots of stuff (discarding all but "104"). |
| 1386 num_bytes = 9u * sizeof(int32_t); | 1289 num_bytes = 9u * sizeof(int32_t); |
| 1387 Seq(200, arraysize(buffer), buffer); | 1290 Seq(200, arraysize(buffer), buffer); |
| 1388 EXPECT_EQ( | 1291 EXPECT_EQ(MOJO_RESULT_OK, |
| 1389 MOJO_RESULT_OK, | 1292 dp->ProducerWriteData(UserPointer<const void>(buffer), |
| 1390 dp->ProducerWriteData( | 1293 MakeUserPointer(&num_bytes), true)); |
| 1391 UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), true)); | |
| 1392 EXPECT_EQ(9u * sizeof(int32_t), num_bytes); | 1294 EXPECT_EQ(9u * sizeof(int32_t), num_bytes); |
| 1393 | 1295 |
| 1394 // Read one. | 1296 // Read one. |
| 1395 num_bytes = 1u * sizeof(int32_t); | 1297 num_bytes = 1u * sizeof(int32_t); |
| 1396 memset(buffer, 0xab, sizeof(buffer)); | 1298 memset(buffer, 0xab, sizeof(buffer)); |
| 1397 EXPECT_EQ(MOJO_RESULT_OK, | 1299 EXPECT_EQ(MOJO_RESULT_OK, |
| 1398 dp->ConsumerReadData(UserPointer<void>(buffer), | 1300 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 1399 MakeUserPointer(&num_bytes), | 1301 MakeUserPointer(&num_bytes), true, false)); |
| 1400 true, | |
| 1401 false)); | |
| 1402 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); | 1302 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); |
| 1403 int32_t expected_buffer[100]; | 1303 int32_t expected_buffer[100]; |
| 1404 memset(expected_buffer, 0xab, sizeof(expected_buffer)); | 1304 memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
| 1405 expected_buffer[0] = 104; | 1305 expected_buffer[0] = 104; |
| 1406 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); | 1306 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
| 1407 | 1307 |
| 1408 // Try reading too many. | 1308 // Try reading too many. |
| 1409 num_bytes = 10u * sizeof(int32_t); | 1309 num_bytes = 10u * sizeof(int32_t); |
| 1410 memset(buffer, 0xab, sizeof(buffer)); | 1310 memset(buffer, 0xab, sizeof(buffer)); |
| 1411 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, | 1311 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
| 1412 dp->ConsumerReadData(UserPointer<void>(buffer), | 1312 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 1413 MakeUserPointer(&num_bytes), | 1313 MakeUserPointer(&num_bytes), true, false)); |
| 1414 true, | |
| 1415 false)); | |
| 1416 memset(expected_buffer, 0xab, sizeof(expected_buffer)); | 1314 memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
| 1417 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); | 1315 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
| 1418 | 1316 |
| 1419 // Try discarding too many. | 1317 // Try discarding too many. |
| 1420 num_bytes = 10u * sizeof(int32_t); | 1318 num_bytes = 10u * sizeof(int32_t); |
| 1421 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, | 1319 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
| 1422 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); | 1320 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); |
| 1423 | 1321 |
| 1424 // Discard a bunch. | 1322 // Discard a bunch. |
| 1425 num_bytes = 4u * sizeof(int32_t); | 1323 num_bytes = 4u * sizeof(int32_t); |
| 1426 EXPECT_EQ(MOJO_RESULT_OK, | 1324 EXPECT_EQ(MOJO_RESULT_OK, |
| 1427 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); | 1325 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); |
| 1428 | 1326 |
| 1429 // Half full. | 1327 // Half full. |
| 1430 num_bytes = 0u; | 1328 num_bytes = 0u; |
| 1431 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); | 1329 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
| 1432 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); | 1330 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); |
| 1433 | 1331 |
| 1434 // Write as much as possible. | 1332 // Write as much as possible. |
| 1435 num_bytes = 10u * sizeof(int32_t); | 1333 num_bytes = 10u * sizeof(int32_t); |
| 1436 Seq(300, arraysize(buffer), buffer); | 1334 Seq(300, arraysize(buffer), buffer); |
| 1437 EXPECT_EQ( | 1335 EXPECT_EQ(MOJO_RESULT_OK, |
| 1438 MOJO_RESULT_OK, | 1336 dp->ProducerWriteData(UserPointer<const void>(buffer), |
| 1439 dp->ProducerWriteData( | 1337 MakeUserPointer(&num_bytes), true)); |
| 1440 UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), true)); | |
| 1441 EXPECT_EQ(10u * sizeof(int32_t), num_bytes); | 1338 EXPECT_EQ(10u * sizeof(int32_t), num_bytes); |
| 1442 | 1339 |
| 1443 // Read everything. | 1340 // Read everything. |
| 1444 num_bytes = 10u * sizeof(int32_t); | 1341 num_bytes = 10u * sizeof(int32_t); |
| 1445 memset(buffer, 0xab, sizeof(buffer)); | 1342 memset(buffer, 0xab, sizeof(buffer)); |
| 1446 EXPECT_EQ(MOJO_RESULT_OK, | 1343 EXPECT_EQ(MOJO_RESULT_OK, |
| 1447 dp->ConsumerReadData(UserPointer<void>(buffer), | 1344 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 1448 MakeUserPointer(&num_bytes), | 1345 MakeUserPointer(&num_bytes), true, false)); |
| 1449 true, | |
| 1450 false)); | |
| 1451 memset(expected_buffer, 0xab, sizeof(expected_buffer)); | 1346 memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
| 1452 EXPECT_EQ(10u * sizeof(int32_t), num_bytes); | 1347 EXPECT_EQ(10u * sizeof(int32_t), num_bytes); |
| 1453 Seq(300, 10, expected_buffer); | 1348 Seq(300, 10, expected_buffer); |
| 1454 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); | 1349 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
| 1455 | 1350 |
| 1456 // Note: All-or-none two-phase writes on a "may discard" data pipe are tested | 1351 // Note: All-or-none two-phase writes on a "may discard" data pipe are tested |
| 1457 // in LocalDataPipeTest.MayDiscard. | 1352 // in LocalDataPipeTest.MayDiscard. |
| 1458 | 1353 |
| 1459 dp->ProducerClose(); | 1354 dp->ProducerClose(); |
| 1460 dp->ConsumerClose(); | 1355 dp->ConsumerClose(); |
| 1461 } | 1356 } |
| 1462 | 1357 |
| 1463 TEST(LocalDataPipeTest, TwoPhaseAllOrNone) { | 1358 TEST(LocalDataPipeTest, TwoPhaseAllOrNone) { |
| 1464 const MojoCreateDataPipeOptions options = { | 1359 const MojoCreateDataPipeOptions options = { |
| 1465 kSizeOfOptions, // |struct_size|. | 1360 kSizeOfOptions, // |struct_size|. |
| 1466 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 1361 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| 1467 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 1362 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
| 1468 10 * sizeof(int32_t) // |capacity_num_bytes|. | 1363 10 * sizeof(int32_t) // |capacity_num_bytes|. |
| 1469 }; | 1364 }; |
| 1470 MojoCreateDataPipeOptions validated_options = {0}; | 1365 MojoCreateDataPipeOptions validated_options = {0}; |
| 1471 EXPECT_EQ(MOJO_RESULT_OK, | 1366 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( |
| 1472 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), | 1367 MakeUserPointer(&options), &validated_options)); |
| 1473 &validated_options)); | |
| 1474 | 1368 |
| 1475 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 1369 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 1476 | 1370 |
| 1477 // Try writing way too much (two-phase). | 1371 // Try writing way too much (two-phase). |
| 1478 uint32_t num_bytes = 20u * sizeof(int32_t); | 1372 uint32_t num_bytes = 20u * sizeof(int32_t); |
| 1479 void* write_ptr = nullptr; | 1373 void* write_ptr = nullptr; |
| 1480 EXPECT_EQ( | 1374 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
| 1481 MOJO_RESULT_OUT_OF_RANGE, | 1375 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
| 1482 dp->ProducerBeginWriteData( | 1376 MakeUserPointer(&num_bytes), true)); |
| 1483 MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), true)); | |
| 1484 | 1377 |
| 1485 // Try writing an amount which isn't a multiple of the element size | 1378 // Try writing an amount which isn't a multiple of the element size |
| 1486 // (two-phase). | 1379 // (two-phase). |
| 1487 static_assert(sizeof(int32_t) > 1u, "Wow! int32_t's have size 1"); | 1380 static_assert(sizeof(int32_t) > 1u, "Wow! int32_t's have size 1"); |
| 1488 num_bytes = 1u; | 1381 num_bytes = 1u; |
| 1489 write_ptr = nullptr; | 1382 write_ptr = nullptr; |
| 1490 EXPECT_EQ( | 1383 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 1491 MOJO_RESULT_INVALID_ARGUMENT, | 1384 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
| 1492 dp->ProducerBeginWriteData( | 1385 MakeUserPointer(&num_bytes), true)); |
| 1493 MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), true)); | |
| 1494 | 1386 |
| 1495 // Try reading way too much (two-phase). | 1387 // Try reading way too much (two-phase). |
| 1496 num_bytes = 20u * sizeof(int32_t); | 1388 num_bytes = 20u * sizeof(int32_t); |
| 1497 const void* read_ptr = nullptr; | 1389 const void* read_ptr = nullptr; |
| 1498 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, | 1390 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
| 1499 dp->ConsumerBeginReadData( | 1391 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr), |
| 1500 MakeUserPointer(&read_ptr), MakeUserPointer(&num_bytes), true)); | 1392 MakeUserPointer(&num_bytes), true)); |
| 1501 | 1393 |
| 1502 // Write half (two-phase). | 1394 // Write half (two-phase). |
| 1503 num_bytes = 5u * sizeof(int32_t); | 1395 num_bytes = 5u * sizeof(int32_t); |
| 1504 write_ptr = nullptr; | 1396 write_ptr = nullptr; |
| 1505 EXPECT_EQ( | 1397 EXPECT_EQ(MOJO_RESULT_OK, |
| 1506 MOJO_RESULT_OK, | 1398 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
| 1507 dp->ProducerBeginWriteData( | 1399 MakeUserPointer(&num_bytes), true)); |
| 1508 MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), true)); | |
| 1509 // May provide more space than requested. | 1400 // May provide more space than requested. |
| 1510 EXPECT_GE(num_bytes, 5u * sizeof(int32_t)); | 1401 EXPECT_GE(num_bytes, 5u * sizeof(int32_t)); |
| 1511 EXPECT_TRUE(write_ptr); | 1402 EXPECT_TRUE(write_ptr); |
| 1512 Seq(0, 5, static_cast<int32_t*>(write_ptr)); | 1403 Seq(0, 5, static_cast<int32_t*>(write_ptr)); |
| 1513 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(5u * sizeof(int32_t))); | 1404 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(5u * sizeof(int32_t))); |
| 1514 | 1405 |
| 1515 // Try reading an amount which isn't a multiple of the element size | 1406 // Try reading an amount which isn't a multiple of the element size |
| 1516 // (two-phase). | 1407 // (two-phase). |
| 1517 num_bytes = 1u; | 1408 num_bytes = 1u; |
| 1518 read_ptr = nullptr; | 1409 read_ptr = nullptr; |
| 1519 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 1410 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 1520 dp->ConsumerBeginReadData( | 1411 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr), |
| 1521 MakeUserPointer(&read_ptr), MakeUserPointer(&num_bytes), true)); | 1412 MakeUserPointer(&num_bytes), true)); |
| 1522 | 1413 |
| 1523 // Read one (two-phase). | 1414 // Read one (two-phase). |
| 1524 num_bytes = 1u * sizeof(int32_t); | 1415 num_bytes = 1u * sizeof(int32_t); |
| 1525 read_ptr = nullptr; | 1416 read_ptr = nullptr; |
| 1526 EXPECT_EQ(MOJO_RESULT_OK, | 1417 EXPECT_EQ(MOJO_RESULT_OK, |
| 1527 dp->ConsumerBeginReadData( | 1418 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr), |
| 1528 MakeUserPointer(&read_ptr), MakeUserPointer(&num_bytes), true)); | 1419 MakeUserPointer(&num_bytes), true)); |
| 1529 EXPECT_GE(num_bytes, 1u * sizeof(int32_t)); | 1420 EXPECT_GE(num_bytes, 1u * sizeof(int32_t)); |
| 1530 EXPECT_EQ(0, static_cast<const int32_t*>(read_ptr)[0]); | 1421 EXPECT_EQ(0, static_cast<const int32_t*>(read_ptr)[0]); |
| 1531 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(1u * sizeof(int32_t))); | 1422 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(1u * sizeof(int32_t))); |
| 1532 | 1423 |
| 1533 // We should have four left, leaving room for six. | 1424 // We should have four left, leaving room for six. |
| 1534 num_bytes = 0u; | 1425 num_bytes = 0u; |
| 1535 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); | 1426 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
| 1536 EXPECT_EQ(4u * sizeof(int32_t), num_bytes); | 1427 EXPECT_EQ(4u * sizeof(int32_t), num_bytes); |
| 1537 | 1428 |
| 1538 // Assuming a tight circular buffer of the specified capacity, we can't do a | 1429 // Assuming a tight circular buffer of the specified capacity, we can't do a |
| 1539 // two-phase write of six now. | 1430 // two-phase write of six now. |
| 1540 num_bytes = 6u * sizeof(int32_t); | 1431 num_bytes = 6u * sizeof(int32_t); |
| 1541 write_ptr = nullptr; | 1432 write_ptr = nullptr; |
| 1542 EXPECT_EQ( | 1433 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
| 1543 MOJO_RESULT_OUT_OF_RANGE, | 1434 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
| 1544 dp->ProducerBeginWriteData( | 1435 MakeUserPointer(&num_bytes), true)); |
| 1545 MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), true)); | |
| 1546 | 1436 |
| 1547 // Write six elements (simple), filling the buffer. | 1437 // Write six elements (simple), filling the buffer. |
| 1548 num_bytes = 6u * sizeof(int32_t); | 1438 num_bytes = 6u * sizeof(int32_t); |
| 1549 int32_t buffer[100]; | 1439 int32_t buffer[100]; |
| 1550 Seq(100, 6, buffer); | 1440 Seq(100, 6, buffer); |
| 1551 EXPECT_EQ( | 1441 EXPECT_EQ(MOJO_RESULT_OK, |
| 1552 MOJO_RESULT_OK, | 1442 dp->ProducerWriteData(UserPointer<const void>(buffer), |
| 1553 dp->ProducerWriteData( | 1443 MakeUserPointer(&num_bytes), true)); |
| 1554 UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), true)); | |
| 1555 EXPECT_EQ(6u * sizeof(int32_t), num_bytes); | 1444 EXPECT_EQ(6u * sizeof(int32_t), num_bytes); |
| 1556 | 1445 |
| 1557 // We have ten. | 1446 // We have ten. |
| 1558 num_bytes = 0u; | 1447 num_bytes = 0u; |
| 1559 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); | 1448 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
| 1560 EXPECT_EQ(10u * sizeof(int32_t), num_bytes); | 1449 EXPECT_EQ(10u * sizeof(int32_t), num_bytes); |
| 1561 | 1450 |
| 1562 // But a two-phase read of ten should fail. | 1451 // But a two-phase read of ten should fail. |
| 1563 num_bytes = 10u * sizeof(int32_t); | 1452 num_bytes = 10u * sizeof(int32_t); |
| 1564 read_ptr = nullptr; | 1453 read_ptr = nullptr; |
| 1565 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, | 1454 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
| 1566 dp->ConsumerBeginReadData( | 1455 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr), |
| 1567 MakeUserPointer(&read_ptr), MakeUserPointer(&num_bytes), true)); | 1456 MakeUserPointer(&num_bytes), true)); |
| 1568 | 1457 |
| 1569 // Close the producer. | 1458 // Close the producer. |
| 1570 dp->ProducerClose(); | 1459 dp->ProducerClose(); |
| 1571 | 1460 |
| 1572 // A two-phase read of nine should work. | 1461 // A two-phase read of nine should work. |
| 1573 num_bytes = 9u * sizeof(int32_t); | 1462 num_bytes = 9u * sizeof(int32_t); |
| 1574 read_ptr = nullptr; | 1463 read_ptr = nullptr; |
| 1575 EXPECT_EQ(MOJO_RESULT_OK, | 1464 EXPECT_EQ(MOJO_RESULT_OK, |
| 1576 dp->ConsumerBeginReadData( | 1465 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr), |
| 1577 MakeUserPointer(&read_ptr), MakeUserPointer(&num_bytes), true)); | 1466 MakeUserPointer(&num_bytes), true)); |
| 1578 EXPECT_GE(num_bytes, 9u * sizeof(int32_t)); | 1467 EXPECT_GE(num_bytes, 9u * sizeof(int32_t)); |
| 1579 EXPECT_EQ(1, static_cast<const int32_t*>(read_ptr)[0]); | 1468 EXPECT_EQ(1, static_cast<const int32_t*>(read_ptr)[0]); |
| 1580 EXPECT_EQ(2, static_cast<const int32_t*>(read_ptr)[1]); | 1469 EXPECT_EQ(2, static_cast<const int32_t*>(read_ptr)[1]); |
| 1581 EXPECT_EQ(3, static_cast<const int32_t*>(read_ptr)[2]); | 1470 EXPECT_EQ(3, static_cast<const int32_t*>(read_ptr)[2]); |
| 1582 EXPECT_EQ(4, static_cast<const int32_t*>(read_ptr)[3]); | 1471 EXPECT_EQ(4, static_cast<const int32_t*>(read_ptr)[3]); |
| 1583 EXPECT_EQ(100, static_cast<const int32_t*>(read_ptr)[4]); | 1472 EXPECT_EQ(100, static_cast<const int32_t*>(read_ptr)[4]); |
| 1584 EXPECT_EQ(101, static_cast<const int32_t*>(read_ptr)[5]); | 1473 EXPECT_EQ(101, static_cast<const int32_t*>(read_ptr)[5]); |
| 1585 EXPECT_EQ(102, static_cast<const int32_t*>(read_ptr)[6]); | 1474 EXPECT_EQ(102, static_cast<const int32_t*>(read_ptr)[6]); |
| 1586 EXPECT_EQ(103, static_cast<const int32_t*>(read_ptr)[7]); | 1475 EXPECT_EQ(103, static_cast<const int32_t*>(read_ptr)[7]); |
| 1587 EXPECT_EQ(104, static_cast<const int32_t*>(read_ptr)[8]); | 1476 EXPECT_EQ(104, static_cast<const int32_t*>(read_ptr)[8]); |
| 1588 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(9u * sizeof(int32_t))); | 1477 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(9u * sizeof(int32_t))); |
| 1589 | 1478 |
| 1590 // A two-phase read of two should fail, with "failed precondition". | 1479 // A two-phase read of two should fail, with "failed precondition". |
| 1591 num_bytes = 2u * sizeof(int32_t); | 1480 num_bytes = 2u * sizeof(int32_t); |
| 1592 read_ptr = nullptr; | 1481 read_ptr = nullptr; |
| 1593 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 1482 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 1594 dp->ConsumerBeginReadData( | 1483 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr), |
| 1595 MakeUserPointer(&read_ptr), MakeUserPointer(&num_bytes), true)); | 1484 MakeUserPointer(&num_bytes), true)); |
| 1596 | 1485 |
| 1597 dp->ConsumerClose(); | 1486 dp->ConsumerClose(); |
| 1598 } | 1487 } |
| 1599 | 1488 |
| 1600 // Tests that |ProducerWriteData()| and |ConsumerReadData()| writes and reads, | 1489 // Tests that |ProducerWriteData()| and |ConsumerReadData()| writes and reads, |
| 1601 // respectively, as much as possible, even if it has to "wrap around" the | 1490 // respectively, as much as possible, even if it has to "wrap around" the |
| 1602 // internal circular buffer. (Note that the two-phase write and read do not do | 1491 // internal circular buffer. (Note that the two-phase write and read do not do |
| 1603 // this.) | 1492 // this.) |
| 1604 TEST(LocalDataPipeTest, WrapAround) { | 1493 TEST(LocalDataPipeTest, WrapAround) { |
| 1605 unsigned char test_data[1000]; | 1494 unsigned char test_data[1000]; |
| 1606 for (size_t i = 0; i < arraysize(test_data); i++) | 1495 for (size_t i = 0; i < arraysize(test_data); i++) |
| 1607 test_data[i] = static_cast<unsigned char>(i); | 1496 test_data[i] = static_cast<unsigned char>(i); |
| 1608 | 1497 |
| 1609 const MojoCreateDataPipeOptions options = { | 1498 const MojoCreateDataPipeOptions options = { |
| 1610 kSizeOfOptions, // |struct_size|. | 1499 kSizeOfOptions, // |struct_size|. |
| 1611 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 1500 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| 1612 1u, // |element_num_bytes|. | 1501 1u, // |element_num_bytes|. |
| 1613 100u // |capacity_num_bytes|. | 1502 100u // |capacity_num_bytes|. |
| 1614 }; | 1503 }; |
| 1615 MojoCreateDataPipeOptions validated_options = {0}; | 1504 MojoCreateDataPipeOptions validated_options = {0}; |
| 1616 EXPECT_EQ(MOJO_RESULT_OK, | 1505 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( |
| 1617 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), | 1506 MakeUserPointer(&options), &validated_options)); |
| 1618 &validated_options)); | |
| 1619 // This test won't be valid if |ValidateCreateOptions()| decides to give the | 1507 // This test won't be valid if |ValidateCreateOptions()| decides to give the |
| 1620 // pipe more space. | 1508 // pipe more space. |
| 1621 ASSERT_EQ(100u, validated_options.capacity_num_bytes); | 1509 ASSERT_EQ(100u, validated_options.capacity_num_bytes); |
| 1622 | 1510 |
| 1623 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 1511 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 1624 | 1512 |
| 1625 // Write 20 bytes. | 1513 // Write 20 bytes. |
| 1626 uint32_t num_bytes = 20u; | 1514 uint32_t num_bytes = 20u; |
| 1627 EXPECT_EQ(MOJO_RESULT_OK, | 1515 EXPECT_EQ(MOJO_RESULT_OK, |
| 1628 dp->ProducerWriteData(UserPointer<const void>(&test_data[0]), | 1516 dp->ProducerWriteData(UserPointer<const void>(&test_data[0]), |
| 1629 MakeUserPointer(&num_bytes), | 1517 MakeUserPointer(&num_bytes), false)); |
| 1630 false)); | |
| 1631 EXPECT_EQ(20u, num_bytes); | 1518 EXPECT_EQ(20u, num_bytes); |
| 1632 | 1519 |
| 1633 // Read 10 bytes. | 1520 // Read 10 bytes. |
| 1634 unsigned char read_buffer[1000] = {0}; | 1521 unsigned char read_buffer[1000] = {0}; |
| 1635 num_bytes = 10u; | 1522 num_bytes = 10u; |
| 1636 EXPECT_EQ( | 1523 EXPECT_EQ(MOJO_RESULT_OK, |
| 1637 MOJO_RESULT_OK, | 1524 dp->ConsumerReadData(UserPointer<void>(read_buffer), |
| 1638 dp->ConsumerReadData(UserPointer<void>(read_buffer), | 1525 MakeUserPointer(&num_bytes), false, false)); |
| 1639 MakeUserPointer(&num_bytes), | |
| 1640 false, | |
| 1641 false)); | |
| 1642 EXPECT_EQ(10u, num_bytes); | 1526 EXPECT_EQ(10u, num_bytes); |
| 1643 EXPECT_EQ(0, memcmp(read_buffer, &test_data[0], 10u)); | 1527 EXPECT_EQ(0, memcmp(read_buffer, &test_data[0], 10u)); |
| 1644 | 1528 |
| 1645 // Check that a two-phase write can now only write (at most) 80 bytes. (This | 1529 // Check that a two-phase write can now only write (at most) 80 bytes. (This |
| 1646 // checks an implementation detail; this behavior is not guaranteed, but we | 1530 // checks an implementation detail; this behavior is not guaranteed, but we |
| 1647 // need it for this test.) | 1531 // need it for this test.) |
| 1648 void* write_buffer_ptr = nullptr; | 1532 void* write_buffer_ptr = nullptr; |
| 1649 num_bytes = 0u; | 1533 num_bytes = 0u; |
| 1650 EXPECT_EQ(MOJO_RESULT_OK, | 1534 EXPECT_EQ(MOJO_RESULT_OK, |
| 1651 dp->ProducerBeginWriteData(MakeUserPointer(&write_buffer_ptr), | 1535 dp->ProducerBeginWriteData(MakeUserPointer(&write_buffer_ptr), |
| 1652 MakeUserPointer(&num_bytes), | 1536 MakeUserPointer(&num_bytes), false)); |
| 1653 false)); | |
| 1654 EXPECT_TRUE(write_buffer_ptr); | 1537 EXPECT_TRUE(write_buffer_ptr); |
| 1655 EXPECT_EQ(80u, num_bytes); | 1538 EXPECT_EQ(80u, num_bytes); |
| 1656 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(0u)); | 1539 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(0u)); |
| 1657 | 1540 |
| 1658 // Write as much data as we can (using |ProducerWriteData()|). We should write | 1541 // Write as much data as we can (using |ProducerWriteData()|). We should write |
| 1659 // 90 bytes. | 1542 // 90 bytes. |
| 1660 num_bytes = 200u; | 1543 num_bytes = 200u; |
| 1661 EXPECT_EQ(MOJO_RESULT_OK, | 1544 EXPECT_EQ(MOJO_RESULT_OK, |
| 1662 dp->ProducerWriteData(UserPointer<const void>(&test_data[20]), | 1545 dp->ProducerWriteData(UserPointer<const void>(&test_data[20]), |
| 1663 MakeUserPointer(&num_bytes), | 1546 MakeUserPointer(&num_bytes), false)); |
| 1664 false)); | |
| 1665 EXPECT_EQ(90u, num_bytes); | 1547 EXPECT_EQ(90u, num_bytes); |
| 1666 | 1548 |
| 1667 // Check that a two-phase read can now only read (at most) 90 bytes. (This | 1549 // Check that a two-phase read can now only read (at most) 90 bytes. (This |
| 1668 // checks an implementation detail; this behavior is not guaranteed, but we | 1550 // checks an implementation detail; this behavior is not guaranteed, but we |
| 1669 // need it for this test.) | 1551 // need it for this test.) |
| 1670 const void* read_buffer_ptr = nullptr; | 1552 const void* read_buffer_ptr = nullptr; |
| 1671 num_bytes = 0u; | 1553 num_bytes = 0u; |
| 1672 EXPECT_EQ(MOJO_RESULT_OK, | 1554 EXPECT_EQ(MOJO_RESULT_OK, |
| 1673 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr), | 1555 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr), |
| 1674 MakeUserPointer(&num_bytes), | 1556 MakeUserPointer(&num_bytes), false)); |
| 1675 false)); | |
| 1676 EXPECT_TRUE(read_buffer_ptr); | 1557 EXPECT_TRUE(read_buffer_ptr); |
| 1677 EXPECT_EQ(90u, num_bytes); | 1558 EXPECT_EQ(90u, num_bytes); |
| 1678 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(0u)); | 1559 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(0u)); |
| 1679 | 1560 |
| 1680 // Read as much as possible (using |ConsumerReadData()|). We should read 100 | 1561 // Read as much as possible (using |ConsumerReadData()|). We should read 100 |
| 1681 // bytes. | 1562 // bytes. |
| 1682 num_bytes = | 1563 num_bytes = |
| 1683 static_cast<uint32_t>(arraysize(read_buffer) * sizeof(read_buffer[0])); | 1564 static_cast<uint32_t>(arraysize(read_buffer) * sizeof(read_buffer[0])); |
| 1684 memset(read_buffer, 0, num_bytes); | 1565 memset(read_buffer, 0, num_bytes); |
| 1685 EXPECT_EQ( | 1566 EXPECT_EQ(MOJO_RESULT_OK, |
| 1686 MOJO_RESULT_OK, | 1567 dp->ConsumerReadData(UserPointer<void>(read_buffer), |
| 1687 dp->ConsumerReadData(UserPointer<void>(read_buffer), | 1568 MakeUserPointer(&num_bytes), false, false)); |
| 1688 MakeUserPointer(&num_bytes), | |
| 1689 false, | |
| 1690 false)); | |
| 1691 EXPECT_EQ(100u, num_bytes); | 1569 EXPECT_EQ(100u, num_bytes); |
| 1692 EXPECT_EQ(0, memcmp(read_buffer, &test_data[10], 100u)); | 1570 EXPECT_EQ(0, memcmp(read_buffer, &test_data[10], 100u)); |
| 1693 | 1571 |
| 1694 dp->ProducerClose(); | 1572 dp->ProducerClose(); |
| 1695 dp->ConsumerClose(); | 1573 dp->ConsumerClose(); |
| 1696 } | 1574 } |
| 1697 | 1575 |
| 1698 // Tests the behavior of closing the producer or consumer with respect to | 1576 // Tests the behavior of closing the producer or consumer with respect to |
| 1699 // writes and reads (simple and two-phase). | 1577 // writes and reads (simple and two-phase). |
| 1700 TEST(LocalDataPipeTest, CloseWriteRead) { | 1578 TEST(LocalDataPipeTest, CloseWriteRead) { |
| 1701 const char kTestData[] = "hello world"; | 1579 const char kTestData[] = "hello world"; |
| 1702 const uint32_t kTestDataSize = static_cast<uint32_t>(sizeof(kTestData)); | 1580 const uint32_t kTestDataSize = static_cast<uint32_t>(sizeof(kTestData)); |
| 1703 | 1581 |
| 1704 const MojoCreateDataPipeOptions options = { | 1582 const MojoCreateDataPipeOptions options = { |
| 1705 kSizeOfOptions, // |struct_size|. | 1583 kSizeOfOptions, // |struct_size|. |
| 1706 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 1584 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| 1707 1u, // |element_num_bytes|. | 1585 1u, // |element_num_bytes|. |
| 1708 1000u // |capacity_num_bytes|. | 1586 1000u // |capacity_num_bytes|. |
| 1709 }; | 1587 }; |
| 1710 MojoCreateDataPipeOptions validated_options = {0}; | 1588 MojoCreateDataPipeOptions validated_options = {0}; |
| 1711 EXPECT_EQ(MOJO_RESULT_OK, | 1589 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( |
| 1712 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), | 1590 MakeUserPointer(&options), &validated_options)); |
| 1713 &validated_options)); | |
| 1714 | 1591 |
| 1715 // Close producer first, then consumer. | 1592 // Close producer first, then consumer. |
| 1716 { | 1593 { |
| 1717 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 1594 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 1718 | 1595 |
| 1719 // Write some data, so we'll have something to read. | 1596 // Write some data, so we'll have something to read. |
| 1720 uint32_t num_bytes = kTestDataSize; | 1597 uint32_t num_bytes = kTestDataSize; |
| 1721 EXPECT_EQ(MOJO_RESULT_OK, | 1598 EXPECT_EQ(MOJO_RESULT_OK, |
| 1722 dp->ProducerWriteData(UserPointer<const void>(kTestData), | 1599 dp->ProducerWriteData(UserPointer<const void>(kTestData), |
| 1723 MakeUserPointer(&num_bytes), | 1600 MakeUserPointer(&num_bytes), false)); |
| 1724 false)); | |
| 1725 EXPECT_EQ(kTestDataSize, num_bytes); | 1601 EXPECT_EQ(kTestDataSize, num_bytes); |
| 1726 | 1602 |
| 1727 // Write it again, so we'll have something left over. | 1603 // Write it again, so we'll have something left over. |
| 1728 num_bytes = kTestDataSize; | 1604 num_bytes = kTestDataSize; |
| 1729 EXPECT_EQ(MOJO_RESULT_OK, | 1605 EXPECT_EQ(MOJO_RESULT_OK, |
| 1730 dp->ProducerWriteData(UserPointer<const void>(kTestData), | 1606 dp->ProducerWriteData(UserPointer<const void>(kTestData), |
| 1731 MakeUserPointer(&num_bytes), | 1607 MakeUserPointer(&num_bytes), false)); |
| 1732 false)); | |
| 1733 EXPECT_EQ(kTestDataSize, num_bytes); | 1608 EXPECT_EQ(kTestDataSize, num_bytes); |
| 1734 | 1609 |
| 1735 // Start two-phase write. | 1610 // Start two-phase write. |
| 1736 void* write_buffer_ptr = nullptr; | 1611 void* write_buffer_ptr = nullptr; |
| 1737 num_bytes = 0u; | 1612 num_bytes = 0u; |
| 1738 EXPECT_EQ(MOJO_RESULT_OK, | 1613 EXPECT_EQ(MOJO_RESULT_OK, |
| 1739 dp->ProducerBeginWriteData(MakeUserPointer(&write_buffer_ptr), | 1614 dp->ProducerBeginWriteData(MakeUserPointer(&write_buffer_ptr), |
| 1740 MakeUserPointer(&num_bytes), | 1615 MakeUserPointer(&num_bytes), false)); |
| 1741 false)); | |
| 1742 EXPECT_TRUE(write_buffer_ptr); | 1616 EXPECT_TRUE(write_buffer_ptr); |
| 1743 EXPECT_GT(num_bytes, 0u); | 1617 EXPECT_GT(num_bytes, 0u); |
| 1744 | 1618 |
| 1745 // Start two-phase read. | 1619 // Start two-phase read. |
| 1746 const void* read_buffer_ptr = nullptr; | 1620 const void* read_buffer_ptr = nullptr; |
| 1747 num_bytes = 0u; | 1621 num_bytes = 0u; |
| 1748 EXPECT_EQ(MOJO_RESULT_OK, | 1622 EXPECT_EQ(MOJO_RESULT_OK, |
| 1749 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr), | 1623 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr), |
| 1750 MakeUserPointer(&num_bytes), | 1624 MakeUserPointer(&num_bytes), false)); |
| 1751 false)); | |
| 1752 EXPECT_TRUE(read_buffer_ptr); | 1625 EXPECT_TRUE(read_buffer_ptr); |
| 1753 EXPECT_EQ(2u * kTestDataSize, num_bytes); | 1626 EXPECT_EQ(2u * kTestDataSize, num_bytes); |
| 1754 | 1627 |
| 1755 // Close the producer. | 1628 // Close the producer. |
| 1756 dp->ProducerClose(); | 1629 dp->ProducerClose(); |
| 1757 | 1630 |
| 1758 // The consumer can finish its two-phase read. | 1631 // The consumer can finish its two-phase read. |
| 1759 EXPECT_EQ(0, memcmp(read_buffer_ptr, kTestData, kTestDataSize)); | 1632 EXPECT_EQ(0, memcmp(read_buffer_ptr, kTestData, kTestDataSize)); |
| 1760 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(kTestDataSize)); | 1633 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(kTestDataSize)); |
| 1761 | 1634 |
| 1762 // And start another. | 1635 // And start another. |
| 1763 read_buffer_ptr = nullptr; | 1636 read_buffer_ptr = nullptr; |
| 1764 num_bytes = 0u; | 1637 num_bytes = 0u; |
| 1765 EXPECT_EQ(MOJO_RESULT_OK, | 1638 EXPECT_EQ(MOJO_RESULT_OK, |
| 1766 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr), | 1639 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr), |
| 1767 MakeUserPointer(&num_bytes), | 1640 MakeUserPointer(&num_bytes), false)); |
| 1768 false)); | |
| 1769 EXPECT_TRUE(read_buffer_ptr); | 1641 EXPECT_TRUE(read_buffer_ptr); |
| 1770 EXPECT_EQ(kTestDataSize, num_bytes); | 1642 EXPECT_EQ(kTestDataSize, num_bytes); |
| 1771 | 1643 |
| 1772 // Close the consumer, which cancels the two-phase read. | 1644 // Close the consumer, which cancels the two-phase read. |
| 1773 dp->ConsumerClose(); | 1645 dp->ConsumerClose(); |
| 1774 } | 1646 } |
| 1775 | 1647 |
| 1776 // Close consumer first, then producer. | 1648 // Close consumer first, then producer. |
| 1777 { | 1649 { |
| 1778 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 1650 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 1779 | 1651 |
| 1780 // Write some data, so we'll have something to read. | 1652 // Write some data, so we'll have something to read. |
| 1781 uint32_t num_bytes = kTestDataSize; | 1653 uint32_t num_bytes = kTestDataSize; |
| 1782 EXPECT_EQ(MOJO_RESULT_OK, | 1654 EXPECT_EQ(MOJO_RESULT_OK, |
| 1783 dp->ProducerWriteData(UserPointer<const void>(kTestData), | 1655 dp->ProducerWriteData(UserPointer<const void>(kTestData), |
| 1784 MakeUserPointer(&num_bytes), | 1656 MakeUserPointer(&num_bytes), false)); |
| 1785 false)); | |
| 1786 EXPECT_EQ(kTestDataSize, num_bytes); | 1657 EXPECT_EQ(kTestDataSize, num_bytes); |
| 1787 | 1658 |
| 1788 // Start two-phase write. | 1659 // Start two-phase write. |
| 1789 void* write_buffer_ptr = nullptr; | 1660 void* write_buffer_ptr = nullptr; |
| 1790 num_bytes = 0u; | 1661 num_bytes = 0u; |
| 1791 EXPECT_EQ(MOJO_RESULT_OK, | 1662 EXPECT_EQ(MOJO_RESULT_OK, |
| 1792 dp->ProducerBeginWriteData(MakeUserPointer(&write_buffer_ptr), | 1663 dp->ProducerBeginWriteData(MakeUserPointer(&write_buffer_ptr), |
| 1793 MakeUserPointer(&num_bytes), | 1664 MakeUserPointer(&num_bytes), false)); |
| 1794 false)); | |
| 1795 EXPECT_TRUE(write_buffer_ptr); | 1665 EXPECT_TRUE(write_buffer_ptr); |
| 1796 ASSERT_GT(num_bytes, kTestDataSize); | 1666 ASSERT_GT(num_bytes, kTestDataSize); |
| 1797 | 1667 |
| 1798 // Start two-phase read. | 1668 // Start two-phase read. |
| 1799 const void* read_buffer_ptr = nullptr; | 1669 const void* read_buffer_ptr = nullptr; |
| 1800 num_bytes = 0u; | 1670 num_bytes = 0u; |
| 1801 EXPECT_EQ(MOJO_RESULT_OK, | 1671 EXPECT_EQ(MOJO_RESULT_OK, |
| 1802 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr), | 1672 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr), |
| 1803 MakeUserPointer(&num_bytes), | 1673 MakeUserPointer(&num_bytes), false)); |
| 1804 false)); | |
| 1805 EXPECT_TRUE(read_buffer_ptr); | 1674 EXPECT_TRUE(read_buffer_ptr); |
| 1806 EXPECT_EQ(kTestDataSize, num_bytes); | 1675 EXPECT_EQ(kTestDataSize, num_bytes); |
| 1807 | 1676 |
| 1808 // Close the consumer. | 1677 // Close the consumer. |
| 1809 dp->ConsumerClose(); | 1678 dp->ConsumerClose(); |
| 1810 | 1679 |
| 1811 // Actually write some data. (Note: Premature freeing of the buffer would | 1680 // Actually write some data. (Note: Premature freeing of the buffer would |
| 1812 // probably only be detected under ASAN or similar.) | 1681 // probably only be detected under ASAN or similar.) |
| 1813 memcpy(write_buffer_ptr, kTestData, kTestDataSize); | 1682 memcpy(write_buffer_ptr, kTestData, kTestDataSize); |
| 1814 // Note: Even though the consumer has been closed, ending the two-phase | 1683 // Note: Even though the consumer has been closed, ending the two-phase |
| 1815 // write will report success. | 1684 // write will report success. |
| 1816 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(kTestDataSize)); | 1685 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(kTestDataSize)); |
| 1817 | 1686 |
| 1818 // But trying to write should result in failure. | 1687 // But trying to write should result in failure. |
| 1819 num_bytes = kTestDataSize; | 1688 num_bytes = kTestDataSize; |
| 1820 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 1689 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 1821 dp->ProducerWriteData(UserPointer<const void>(kTestData), | 1690 dp->ProducerWriteData(UserPointer<const void>(kTestData), |
| 1822 MakeUserPointer(&num_bytes), | 1691 MakeUserPointer(&num_bytes), false)); |
| 1823 false)); | |
| 1824 | 1692 |
| 1825 // As will trying to start another two-phase write. | 1693 // As will trying to start another two-phase write. |
| 1826 write_buffer_ptr = nullptr; | 1694 write_buffer_ptr = nullptr; |
| 1827 num_bytes = 0u; | 1695 num_bytes = 0u; |
| 1828 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 1696 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 1829 dp->ProducerBeginWriteData(MakeUserPointer(&write_buffer_ptr), | 1697 dp->ProducerBeginWriteData(MakeUserPointer(&write_buffer_ptr), |
| 1830 MakeUserPointer(&num_bytes), | 1698 MakeUserPointer(&num_bytes), false)); |
| 1831 false)); | |
| 1832 | 1699 |
| 1833 dp->ProducerClose(); | 1700 dp->ProducerClose(); |
| 1834 } | 1701 } |
| 1835 | 1702 |
| 1836 // Test closing the consumer first, then the producer, with an active | 1703 // Test closing the consumer first, then the producer, with an active |
| 1837 // two-phase write. | 1704 // two-phase write. |
| 1838 { | 1705 { |
| 1839 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 1706 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 1840 | 1707 |
| 1841 // Start two-phase write. | 1708 // Start two-phase write. |
| 1842 void* write_buffer_ptr = nullptr; | 1709 void* write_buffer_ptr = nullptr; |
| 1843 uint32_t num_bytes = 0u; | 1710 uint32_t num_bytes = 0u; |
| 1844 EXPECT_EQ(MOJO_RESULT_OK, | 1711 EXPECT_EQ(MOJO_RESULT_OK, |
| 1845 dp->ProducerBeginWriteData(MakeUserPointer(&write_buffer_ptr), | 1712 dp->ProducerBeginWriteData(MakeUserPointer(&write_buffer_ptr), |
| 1846 MakeUserPointer(&num_bytes), | 1713 MakeUserPointer(&num_bytes), false)); |
| 1847 false)); | |
| 1848 EXPECT_TRUE(write_buffer_ptr); | 1714 EXPECT_TRUE(write_buffer_ptr); |
| 1849 ASSERT_GT(num_bytes, kTestDataSize); | 1715 ASSERT_GT(num_bytes, kTestDataSize); |
| 1850 | 1716 |
| 1851 dp->ConsumerClose(); | 1717 dp->ConsumerClose(); |
| 1852 dp->ProducerClose(); | 1718 dp->ProducerClose(); |
| 1853 } | 1719 } |
| 1854 | 1720 |
| 1855 // Test closing the producer and then trying to read (with no data). | 1721 // Test closing the producer and then trying to read (with no data). |
| 1856 { | 1722 { |
| 1857 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 1723 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 1858 | 1724 |
| 1859 // Write some data, so we'll have something to read. | 1725 // Write some data, so we'll have something to read. |
| 1860 uint32_t num_bytes = kTestDataSize; | 1726 uint32_t num_bytes = kTestDataSize; |
| 1861 EXPECT_EQ(MOJO_RESULT_OK, | 1727 EXPECT_EQ(MOJO_RESULT_OK, |
| 1862 dp->ProducerWriteData(UserPointer<const void>(kTestData), | 1728 dp->ProducerWriteData(UserPointer<const void>(kTestData), |
| 1863 MakeUserPointer(&num_bytes), | 1729 MakeUserPointer(&num_bytes), false)); |
| 1864 false)); | |
| 1865 EXPECT_EQ(kTestDataSize, num_bytes); | 1730 EXPECT_EQ(kTestDataSize, num_bytes); |
| 1866 | 1731 |
| 1867 // Close the producer. | 1732 // Close the producer. |
| 1868 dp->ProducerClose(); | 1733 dp->ProducerClose(); |
| 1869 | 1734 |
| 1870 // Peek that data. | 1735 // Peek that data. |
| 1871 char buffer[1000]; | 1736 char buffer[1000]; |
| 1872 num_bytes = static_cast<uint32_t>(sizeof(buffer)); | 1737 num_bytes = static_cast<uint32_t>(sizeof(buffer)); |
| 1873 EXPECT_EQ( | 1738 EXPECT_EQ(MOJO_RESULT_OK, |
| 1874 MOJO_RESULT_OK, | 1739 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 1875 dp->ConsumerReadData(UserPointer<void>(buffer), | 1740 MakeUserPointer(&num_bytes), false, true)); |
| 1876 MakeUserPointer(&num_bytes), | |
| 1877 false, | |
| 1878 true)); | |
| 1879 EXPECT_EQ(kTestDataSize, num_bytes); | 1741 EXPECT_EQ(kTestDataSize, num_bytes); |
| 1880 EXPECT_EQ(0, memcmp(buffer, kTestData, kTestDataSize)); | 1742 EXPECT_EQ(0, memcmp(buffer, kTestData, kTestDataSize)); |
| 1881 | 1743 |
| 1882 // Read that data. | 1744 // Read that data. |
| 1883 memset(buffer, 0, 1000); | 1745 memset(buffer, 0, 1000); |
| 1884 num_bytes = static_cast<uint32_t>(sizeof(buffer)); | 1746 num_bytes = static_cast<uint32_t>(sizeof(buffer)); |
| 1885 EXPECT_EQ( | 1747 EXPECT_EQ(MOJO_RESULT_OK, |
| 1886 MOJO_RESULT_OK, | 1748 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 1887 dp->ConsumerReadData(UserPointer<void>(buffer), | 1749 MakeUserPointer(&num_bytes), false, false)); |
| 1888 MakeUserPointer(&num_bytes), | |
| 1889 false, | |
| 1890 false)); | |
| 1891 EXPECT_EQ(kTestDataSize, num_bytes); | 1750 EXPECT_EQ(kTestDataSize, num_bytes); |
| 1892 EXPECT_EQ(0, memcmp(buffer, kTestData, kTestDataSize)); | 1751 EXPECT_EQ(0, memcmp(buffer, kTestData, kTestDataSize)); |
| 1893 | 1752 |
| 1894 // A second read should fail. | 1753 // A second read should fail. |
| 1895 num_bytes = static_cast<uint32_t>(sizeof(buffer)); | 1754 num_bytes = static_cast<uint32_t>(sizeof(buffer)); |
| 1896 EXPECT_EQ( | 1755 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 1897 MOJO_RESULT_FAILED_PRECONDITION, | 1756 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 1898 dp->ConsumerReadData(UserPointer<void>(buffer), | 1757 MakeUserPointer(&num_bytes), false, false)); |
| 1899 MakeUserPointer(&num_bytes), | |
| 1900 false, | |
| 1901 false)); | |
| 1902 | 1758 |
| 1903 // A two-phase read should also fail. | 1759 // A two-phase read should also fail. |
| 1904 const void* read_buffer_ptr = nullptr; | 1760 const void* read_buffer_ptr = nullptr; |
| 1905 num_bytes = 0u; | 1761 num_bytes = 0u; |
| 1906 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 1762 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 1907 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr), | 1763 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr), |
| 1908 MakeUserPointer(&num_bytes), | 1764 MakeUserPointer(&num_bytes), false)); |
| 1909 false)); | |
| 1910 | 1765 |
| 1911 // Ditto for discard. | 1766 // Ditto for discard. |
| 1912 num_bytes = 10u; | 1767 num_bytes = 10u; |
| 1913 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 1768 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 1914 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), false)); | 1769 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), false)); |
| 1915 | 1770 |
| 1916 dp->ConsumerClose(); | 1771 dp->ConsumerClose(); |
| 1917 } | 1772 } |
| 1918 } | 1773 } |
| 1919 | 1774 |
| 1920 TEST(LocalDataPipeTest, TwoPhaseMoreInvalidArguments) { | 1775 TEST(LocalDataPipeTest, TwoPhaseMoreInvalidArguments) { |
| 1921 const MojoCreateDataPipeOptions options = { | 1776 const MojoCreateDataPipeOptions options = { |
| 1922 kSizeOfOptions, // |struct_size|. | 1777 kSizeOfOptions, // |struct_size|. |
| 1923 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 1778 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| 1924 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 1779 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
| 1925 10 * sizeof(int32_t) // |capacity_num_bytes|. | 1780 10 * sizeof(int32_t) // |capacity_num_bytes|. |
| 1926 }; | 1781 }; |
| 1927 MojoCreateDataPipeOptions validated_options = {0}; | 1782 MojoCreateDataPipeOptions validated_options = {0}; |
| 1928 EXPECT_EQ(MOJO_RESULT_OK, | 1783 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( |
| 1929 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), | 1784 MakeUserPointer(&options), &validated_options)); |
| 1930 &validated_options)); | |
| 1931 | 1785 |
| 1932 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 1786 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 1933 | 1787 |
| 1934 // No data. | 1788 // No data. |
| 1935 uint32_t num_bytes = 1000u; | 1789 uint32_t num_bytes = 1000u; |
| 1936 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); | 1790 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
| 1937 EXPECT_EQ(0u, num_bytes); | 1791 EXPECT_EQ(0u, num_bytes); |
| 1938 | 1792 |
| 1939 // Try "ending" a two-phase write when one isn't active. | 1793 // Try "ending" a two-phase write when one isn't active. |
| 1940 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 1794 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 1941 dp->ProducerEndWriteData(1u * sizeof(int32_t))); | 1795 dp->ProducerEndWriteData(1u * sizeof(int32_t))); |
| 1942 | 1796 |
| 1943 // Still no data. | 1797 // Still no data. |
| 1944 num_bytes = 1000u; | 1798 num_bytes = 1000u; |
| 1945 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); | 1799 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
| 1946 EXPECT_EQ(0u, num_bytes); | 1800 EXPECT_EQ(0u, num_bytes); |
| 1947 | 1801 |
| 1948 // Try ending a two-phase write with an invalid amount (too much). | 1802 // Try ending a two-phase write with an invalid amount (too much). |
| 1949 num_bytes = 0u; | 1803 num_bytes = 0u; |
| 1950 void* write_ptr = nullptr; | 1804 void* write_ptr = nullptr; |
| 1951 EXPECT_EQ( | 1805 EXPECT_EQ(MOJO_RESULT_OK, |
| 1952 MOJO_RESULT_OK, | 1806 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
| 1953 dp->ProducerBeginWriteData( | 1807 MakeUserPointer(&num_bytes), false)); |
| 1954 MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), false)); | |
| 1955 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 1808 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 1956 dp->ProducerEndWriteData(num_bytes + | 1809 dp->ProducerEndWriteData(num_bytes + |
| 1957 static_cast<uint32_t>(sizeof(int32_t)))); | 1810 static_cast<uint32_t>(sizeof(int32_t)))); |
| 1958 | 1811 |
| 1959 // But the two-phase write still ended. | 1812 // But the two-phase write still ended. |
| 1960 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, dp->ProducerEndWriteData(0u)); | 1813 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, dp->ProducerEndWriteData(0u)); |
| 1961 | 1814 |
| 1962 // Still no data. | 1815 // Still no data. |
| 1963 num_bytes = 1000u; | 1816 num_bytes = 1000u; |
| 1964 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); | 1817 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
| 1965 EXPECT_EQ(0u, num_bytes); | 1818 EXPECT_EQ(0u, num_bytes); |
| 1966 | 1819 |
| 1967 // Try ending a two-phase write with an invalid amount (not a multiple of the | 1820 // Try ending a two-phase write with an invalid amount (not a multiple of the |
| 1968 // element size). | 1821 // element size). |
| 1969 num_bytes = 0u; | 1822 num_bytes = 0u; |
| 1970 write_ptr = nullptr; | 1823 write_ptr = nullptr; |
| 1971 EXPECT_EQ( | 1824 EXPECT_EQ(MOJO_RESULT_OK, |
| 1972 MOJO_RESULT_OK, | 1825 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
| 1973 dp->ProducerBeginWriteData( | 1826 MakeUserPointer(&num_bytes), false)); |
| 1974 MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), false)); | |
| 1975 EXPECT_GE(num_bytes, 1u); | 1827 EXPECT_GE(num_bytes, 1u); |
| 1976 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, dp->ProducerEndWriteData(1u)); | 1828 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, dp->ProducerEndWriteData(1u)); |
| 1977 | 1829 |
| 1978 // But the two-phase write still ended. | 1830 // But the two-phase write still ended. |
| 1979 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, dp->ProducerEndWriteData(0u)); | 1831 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, dp->ProducerEndWriteData(0u)); |
| 1980 | 1832 |
| 1981 // Still no data. | 1833 // Still no data. |
| 1982 num_bytes = 1000u; | 1834 num_bytes = 1000u; |
| 1983 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); | 1835 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
| 1984 EXPECT_EQ(0u, num_bytes); | 1836 EXPECT_EQ(0u, num_bytes); |
| 1985 | 1837 |
| 1986 // Now write some data, so we'll be able to try reading. | 1838 // Now write some data, so we'll be able to try reading. |
| 1987 int32_t element = 123; | 1839 int32_t element = 123; |
| 1988 num_bytes = 1u * sizeof(int32_t); | 1840 num_bytes = 1u * sizeof(int32_t); |
| 1989 EXPECT_EQ(MOJO_RESULT_OK, | 1841 EXPECT_EQ(MOJO_RESULT_OK, |
| 1990 dp->ProducerWriteData(UserPointer<const void>(&element), | 1842 dp->ProducerWriteData(UserPointer<const void>(&element), |
| 1991 MakeUserPointer(&num_bytes), | 1843 MakeUserPointer(&num_bytes), false)); |
| 1992 false)); | |
| 1993 | 1844 |
| 1994 // One element available. | 1845 // One element available. |
| 1995 num_bytes = 0u; | 1846 num_bytes = 0u; |
| 1996 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); | 1847 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
| 1997 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); | 1848 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); |
| 1998 | 1849 |
| 1999 // Try "ending" a two-phase read when one isn't active. | 1850 // Try "ending" a two-phase read when one isn't active. |
| 2000 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 1851 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 2001 dp->ConsumerEndReadData(1u * sizeof(int32_t))); | 1852 dp->ConsumerEndReadData(1u * sizeof(int32_t))); |
| 2002 | 1853 |
| 2003 // Still one element available. | 1854 // Still one element available. |
| 2004 num_bytes = 0u; | 1855 num_bytes = 0u; |
| 2005 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); | 1856 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
| 2006 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); | 1857 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); |
| 2007 | 1858 |
| 2008 // Try ending a two-phase read with an invalid amount (too much). | 1859 // Try ending a two-phase read with an invalid amount (too much). |
| 2009 num_bytes = 0u; | 1860 num_bytes = 0u; |
| 2010 const void* read_ptr = nullptr; | 1861 const void* read_ptr = nullptr; |
| 2011 EXPECT_EQ( | 1862 EXPECT_EQ(MOJO_RESULT_OK, |
| 2012 MOJO_RESULT_OK, | 1863 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr), |
| 2013 dp->ConsumerBeginReadData( | 1864 MakeUserPointer(&num_bytes), false)); |
| 2014 MakeUserPointer(&read_ptr), MakeUserPointer(&num_bytes), false)); | |
| 2015 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 1865 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 2016 dp->ConsumerEndReadData(num_bytes + | 1866 dp->ConsumerEndReadData(num_bytes + |
| 2017 static_cast<uint32_t>(sizeof(int32_t)))); | 1867 static_cast<uint32_t>(sizeof(int32_t)))); |
| 2018 | 1868 |
| 2019 // Still one element available. | 1869 // Still one element available. |
| 2020 num_bytes = 0u; | 1870 num_bytes = 0u; |
| 2021 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); | 1871 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
| 2022 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); | 1872 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); |
| 2023 | 1873 |
| 2024 // Try ending a two-phase read with an invalid amount (not a multiple of the | 1874 // Try ending a two-phase read with an invalid amount (not a multiple of the |
| 2025 // element size). | 1875 // element size). |
| 2026 num_bytes = 0u; | 1876 num_bytes = 0u; |
| 2027 read_ptr = nullptr; | 1877 read_ptr = nullptr; |
| 2028 EXPECT_EQ( | 1878 EXPECT_EQ(MOJO_RESULT_OK, |
| 2029 MOJO_RESULT_OK, | 1879 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr), |
| 2030 dp->ConsumerBeginReadData( | 1880 MakeUserPointer(&num_bytes), false)); |
| 2031 MakeUserPointer(&read_ptr), MakeUserPointer(&num_bytes), false)); | |
| 2032 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); | 1881 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); |
| 2033 EXPECT_EQ(123, static_cast<const int32_t*>(read_ptr)[0]); | 1882 EXPECT_EQ(123, static_cast<const int32_t*>(read_ptr)[0]); |
| 2034 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, dp->ConsumerEndReadData(1u)); | 1883 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, dp->ConsumerEndReadData(1u)); |
| 2035 | 1884 |
| 2036 // Still one element available. | 1885 // Still one element available. |
| 2037 num_bytes = 0u; | 1886 num_bytes = 0u; |
| 2038 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); | 1887 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
| 2039 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); | 1888 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); |
| 2040 | 1889 |
| 2041 dp->ProducerClose(); | 1890 dp->ProducerClose(); |
| 2042 dp->ConsumerClose(); | 1891 dp->ConsumerClose(); |
| 2043 } | 1892 } |
| 2044 | 1893 |
| 2045 // Tests that even with "may discard", the data won't change under a two-phase | 1894 // Tests that even with "may discard", the data won't change under a two-phase |
| 2046 // read. | 1895 // read. |
| 2047 // TODO(vtl): crbug.com/348644: We currently don't pass this. (There are two | 1896 // TODO(vtl): crbug.com/348644: We currently don't pass this. (There are two |
| 2048 // related issues: First, we don't recognize that the data given to | 1897 // related issues: First, we don't recognize that the data given to |
| 2049 // |ConsumerBeginReadData()| isn't discardable until |ConsumerEndReadData()|, | 1898 // |ConsumerBeginReadData()| isn't discardable until |ConsumerEndReadData()|, |
| 2050 // and thus we erroneously allow |ProducerWriteData()| to succeed. Second, the | 1899 // and thus we erroneously allow |ProducerWriteData()| to succeed. Second, the |
| 2051 // |ProducerWriteData()| then changes the data underneath the two-phase read.) | 1900 // |ProducerWriteData()| then changes the data underneath the two-phase read.) |
| 2052 TEST(LocalDataPipeTest, DISABLED_MayDiscardTwoPhaseConsistent) { | 1901 TEST(LocalDataPipeTest, DISABLED_MayDiscardTwoPhaseConsistent) { |
| 2053 const MojoCreateDataPipeOptions options = { | 1902 const MojoCreateDataPipeOptions options = { |
| 2054 kSizeOfOptions, // |struct_size|. | 1903 kSizeOfOptions, // |struct_size|. |
| 2055 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. | 1904 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. |
| 2056 1, // |element_num_bytes|. | 1905 1, // |element_num_bytes|. |
| 2057 2 // |capacity_num_bytes|. | 1906 2 // |capacity_num_bytes|. |
| 2058 }; | 1907 }; |
| 2059 MojoCreateDataPipeOptions validated_options = {0}; | 1908 MojoCreateDataPipeOptions validated_options = {0}; |
| 2060 EXPECT_EQ(MOJO_RESULT_OK, | 1909 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( |
| 2061 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), | 1910 MakeUserPointer(&options), &validated_options)); |
| 2062 &validated_options)); | |
| 2063 | 1911 |
| 2064 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 1912 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 2065 | 1913 |
| 2066 // Write some elements. | 1914 // Write some elements. |
| 2067 char elements[2] = {'a', 'b'}; | 1915 char elements[2] = {'a', 'b'}; |
| 2068 uint32_t num_bytes = 2u; | 1916 uint32_t num_bytes = 2u; |
| 2069 EXPECT_EQ(MOJO_RESULT_OK, | 1917 EXPECT_EQ(MOJO_RESULT_OK, |
| 2070 dp->ProducerWriteData(UserPointer<const void>(elements), | 1918 dp->ProducerWriteData(UserPointer<const void>(elements), |
| 2071 MakeUserPointer(&num_bytes), | 1919 MakeUserPointer(&num_bytes), false)); |
| 2072 false)); | |
| 2073 EXPECT_EQ(2u, num_bytes); | 1920 EXPECT_EQ(2u, num_bytes); |
| 2074 | 1921 |
| 2075 // Begin reading. | 1922 // Begin reading. |
| 2076 const void* read_ptr = nullptr; | 1923 const void* read_ptr = nullptr; |
| 2077 num_bytes = 2u; | 1924 num_bytes = 2u; |
| 2078 EXPECT_EQ( | 1925 EXPECT_EQ(MOJO_RESULT_OK, |
| 2079 MOJO_RESULT_OK, | 1926 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr), |
| 2080 dp->ConsumerBeginReadData( | 1927 MakeUserPointer(&num_bytes), false)); |
| 2081 MakeUserPointer(&read_ptr), MakeUserPointer(&num_bytes), false)); | |
| 2082 EXPECT_EQ(2u, num_bytes); | 1928 EXPECT_EQ(2u, num_bytes); |
| 2083 EXPECT_EQ('a', static_cast<const char*>(read_ptr)[0]); | 1929 EXPECT_EQ('a', static_cast<const char*>(read_ptr)[0]); |
| 2084 EXPECT_EQ('b', static_cast<const char*>(read_ptr)[1]); | 1930 EXPECT_EQ('b', static_cast<const char*>(read_ptr)[1]); |
| 2085 | 1931 |
| 2086 // Try to write some more. But nothing should be discardable right now. | 1932 // Try to write some more. But nothing should be discardable right now. |
| 2087 elements[0] = 'x'; | 1933 elements[0] = 'x'; |
| 2088 elements[1] = 'y'; | 1934 elements[1] = 'y'; |
| 2089 num_bytes = 2u; | 1935 num_bytes = 2u; |
| 2090 // TODO(vtl): This should be: | 1936 // TODO(vtl): This should be: |
| 2091 // EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 1937 // EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
| 2092 // dp->ProducerWriteData(elements, &num_bytes, false)); | 1938 // dp->ProducerWriteData(elements, &num_bytes, false)); |
| 2093 // but we incorrectly think that the bytes being read are discardable. Letting | 1939 // but we incorrectly think that the bytes being read are discardable. Letting |
| 2094 // this through reveals the significant consequence. | 1940 // this through reveals the significant consequence. |
| 2095 EXPECT_EQ(MOJO_RESULT_OK, | 1941 EXPECT_EQ(MOJO_RESULT_OK, |
| 2096 dp->ProducerWriteData(UserPointer<const void>(elements), | 1942 dp->ProducerWriteData(UserPointer<const void>(elements), |
| 2097 MakeUserPointer(&num_bytes), | 1943 MakeUserPointer(&num_bytes), false)); |
| 2098 false)); | |
| 2099 | 1944 |
| 2100 // Check that our read buffer hasn't changed underneath us. | 1945 // Check that our read buffer hasn't changed underneath us. |
| 2101 EXPECT_EQ('a', static_cast<const char*>(read_ptr)[0]); | 1946 EXPECT_EQ('a', static_cast<const char*>(read_ptr)[0]); |
| 2102 EXPECT_EQ('b', static_cast<const char*>(read_ptr)[1]); | 1947 EXPECT_EQ('b', static_cast<const char*>(read_ptr)[1]); |
| 2103 | 1948 |
| 2104 // End reading. | 1949 // End reading. |
| 2105 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(2u)); | 1950 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(2u)); |
| 2106 | 1951 |
| 2107 // Now writing should succeed. | 1952 // Now writing should succeed. |
| 2108 EXPECT_EQ(MOJO_RESULT_OK, | 1953 EXPECT_EQ(MOJO_RESULT_OK, |
| 2109 dp->ProducerWriteData(UserPointer<const void>(elements), | 1954 dp->ProducerWriteData(UserPointer<const void>(elements), |
| 2110 MakeUserPointer(&num_bytes), | 1955 MakeUserPointer(&num_bytes), false)); |
| 2111 false)); | |
| 2112 | 1956 |
| 2113 // And if we read, we should get the new values. | 1957 // And if we read, we should get the new values. |
| 2114 read_ptr = nullptr; | 1958 read_ptr = nullptr; |
| 2115 num_bytes = 2u; | 1959 num_bytes = 2u; |
| 2116 EXPECT_EQ( | 1960 EXPECT_EQ(MOJO_RESULT_OK, |
| 2117 MOJO_RESULT_OK, | 1961 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr), |
| 2118 dp->ConsumerBeginReadData( | 1962 MakeUserPointer(&num_bytes), false)); |
| 2119 MakeUserPointer(&read_ptr), MakeUserPointer(&num_bytes), false)); | |
| 2120 EXPECT_EQ(2u, num_bytes); | 1963 EXPECT_EQ(2u, num_bytes); |
| 2121 EXPECT_EQ('x', static_cast<const char*>(read_ptr)[0]); | 1964 EXPECT_EQ('x', static_cast<const char*>(read_ptr)[0]); |
| 2122 EXPECT_EQ('y', static_cast<const char*>(read_ptr)[1]); | 1965 EXPECT_EQ('y', static_cast<const char*>(read_ptr)[1]); |
| 2123 | 1966 |
| 2124 // End reading. | 1967 // End reading. |
| 2125 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(2u)); | 1968 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(2u)); |
| 2126 | 1969 |
| 2127 dp->ProducerClose(); | 1970 dp->ProducerClose(); |
| 2128 dp->ConsumerClose(); | 1971 dp->ConsumerClose(); |
| 2129 } | 1972 } |
| 2130 | 1973 |
| 2131 } // namespace | 1974 } // namespace |
| 2132 } // namespace system | 1975 } // namespace system |
| 2133 } // namespace mojo | 1976 } // namespace mojo |
| OLD | NEW |