| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "content/child/shared_memory_data_consumer_handle.h" | 5 #include "content/child/shared_memory_data_consumer_handle.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/callback.h" | 12 #include "base/callback.h" |
| 13 #include "base/location.h" |
| 13 #include "base/message_loop/message_loop.h" | 14 #include "base/message_loop/message_loop.h" |
| 14 #include "base/run_loop.h" | 15 #include "base/run_loop.h" |
| 16 #include "base/task_runner.h" |
| 15 #include "base/threading/thread.h" | 17 #include "base/threading/thread.h" |
| 16 #include "content/public/child/fixed_received_data.h" | 18 #include "content/public/child/fixed_received_data.h" |
| 17 #include "testing/gmock/include/gmock/gmock.h" | 19 #include "testing/gmock/include/gmock/gmock.h" |
| 18 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
| 19 | 21 |
| 20 namespace content { | 22 namespace content { |
| 21 | 23 |
| 22 namespace { | 24 namespace { |
| 23 using blink::WebDataConsumerHandle; | 25 using blink::WebDataConsumerHandle; |
| 24 using Result = WebDataConsumerHandle::Result; | 26 using Result = WebDataConsumerHandle::Result; |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 | 102 |
| 101 void didGetReadable() override { operation_->ReadData(); } | 103 void didGetReadable() override { operation_->ReadData(); } |
| 102 | 104 |
| 103 private: | 105 private: |
| 104 ReadDataOperation* operation_; | 106 ReadDataOperation* operation_; |
| 105 }; | 107 }; |
| 106 | 108 |
| 107 class ReadDataOperation final { | 109 class ReadDataOperation final { |
| 108 public: | 110 public: |
| 109 typedef WebDataConsumerHandle::Result Result; | 111 typedef WebDataConsumerHandle::Result Result; |
| 110 ReadDataOperation(scoped_ptr<WebDataConsumerHandle> handle, | 112 ReadDataOperation(scoped_ptr<SharedMemoryDataConsumerHandle> handle, |
| 111 base::MessageLoop* main_message_loop, | 113 base::MessageLoop* main_message_loop, |
| 112 const base::Closure& on_done) | 114 const base::Closure& on_done) |
| 113 : handle_(handle.Pass()), | 115 : handle_(handle.Pass()), |
| 114 main_message_loop_(main_message_loop), | 116 main_message_loop_(main_message_loop), |
| 115 on_done_(on_done) {} | 117 on_done_(on_done) {} |
| 116 | 118 |
| 117 const std::string& result() const { return result_; } | 119 const std::string& result() const { return result_; } |
| 118 | 120 |
| 119 void ReadData() { | 121 void ReadData() { |
| 120 if (!client_) { | 122 if (!client_) { |
| 121 client_.reset(new ClientImpl(this)); | 123 client_.reset(new ClientImpl(this)); |
| 122 handle_->registerClient(client_.get()); | 124 reader_ = handle_->ObtainReader(client_.get()); |
| 123 } | 125 } |
| 124 | 126 |
| 125 Result rv = kOk; | 127 Result rv = kOk; |
| 126 size_t read_size = 0; | 128 size_t read_size = 0; |
| 127 | 129 |
| 128 while (true) { | 130 while (true) { |
| 129 char buffer[16]; | 131 char buffer[16]; |
| 130 rv = handle_->read(&buffer, sizeof(buffer), kNone, &read_size); | 132 rv = reader_->read(&buffer, sizeof(buffer), kNone, &read_size); |
| 131 if (rv != kOk) | 133 if (rv != kOk) |
| 132 break; | 134 break; |
| 133 result_.insert(result_.size(), &buffer[0], read_size); | 135 result_.insert(result_.size(), &buffer[0], read_size); |
| 134 } | 136 } |
| 135 | 137 |
| 136 if (rv == kShouldWait) { | 138 if (rv == kShouldWait) { |
| 137 // Wait a while... | 139 // Wait a while... |
| 138 return; | 140 return; |
| 139 } | 141 } |
| 140 | 142 |
| 141 if (rv != kDone) { | 143 if (rv != kDone) { |
| 142 // Something is wrong. | 144 // Something is wrong. |
| 143 result_ = "error"; | 145 result_ = "error"; |
| 144 } | 146 } |
| 145 | 147 |
| 146 // The operation is done. | 148 // The operation is done. |
| 149 reader_.reset(); |
| 147 main_message_loop_->PostTask(FROM_HERE, on_done_); | 150 main_message_loop_->PostTask(FROM_HERE, on_done_); |
| 148 } | 151 } |
| 149 | 152 |
| 150 private: | 153 private: |
| 151 scoped_ptr<WebDataConsumerHandle> handle_; | 154 scoped_ptr<SharedMemoryDataConsumerHandle> handle_; |
| 155 scoped_ptr<WebDataConsumerHandle::Reader> reader_; |
| 152 scoped_ptr<WebDataConsumerHandle::Client> client_; | 156 scoped_ptr<WebDataConsumerHandle::Client> client_; |
| 153 base::MessageLoop* main_message_loop_; | 157 base::MessageLoop* main_message_loop_; |
| 154 base::Closure on_done_; | 158 base::Closure on_done_; |
| 155 std::string result_; | 159 std::string result_; |
| 156 }; | 160 }; |
| 157 | 161 |
| 158 void SetUp() override { | 162 void SetUp() override { |
| 159 handle_.reset( | 163 handle_.reset( |
| 160 new SharedMemoryDataConsumerHandle(kApplyBackpressure, &writer_)); | 164 new SharedMemoryDataConsumerHandle(kApplyBackpressure, &writer_)); |
| 161 } | 165 } |
| 162 | 166 |
| 163 StrictMock<MockClient> client_; | 167 StrictMock<MockClient> client_; |
| 164 scoped_ptr<WebDataConsumerHandle> handle_; | 168 scoped_ptr<SharedMemoryDataConsumerHandle> handle_; |
| 165 scoped_ptr<Writer> writer_; | 169 scoped_ptr<Writer> writer_; |
| 166 base::MessageLoop loop_; | 170 base::MessageLoop loop_; |
| 167 }; | 171 }; |
| 168 | 172 |
| 169 class SharedMemoryDataConsumerHandleTest | 173 class SharedMemoryDataConsumerHandleTest |
| 170 : public ::testing::TestWithParam<BackpressureMode> { | 174 : public ::testing::TestWithParam<BackpressureMode> { |
| 171 protected: | 175 protected: |
| 172 void SetUp() override { | 176 void SetUp() override { |
| 173 handle_.reset(new SharedMemoryDataConsumerHandle(GetParam(), &writer_)); | 177 handle_.reset(new SharedMemoryDataConsumerHandle(GetParam(), &writer_)); |
| 174 } | 178 } |
| 175 scoped_ptr<FixedReceivedData> NewFixedData(const char* s) { | 179 scoped_ptr<FixedReceivedData> NewFixedData(const char* s) { |
| 176 return make_scoped_ptr(new FixedReceivedData(s, strlen(s), strlen(s))); | 180 return make_scoped_ptr(new FixedReceivedData(s, strlen(s), strlen(s))); |
| 177 } | 181 } |
| 178 | 182 |
| 179 StrictMock<MockClient> client_; | 183 StrictMock<MockClient> client_; |
| 180 scoped_ptr<SharedMemoryDataConsumerHandle> handle_; | 184 scoped_ptr<SharedMemoryDataConsumerHandle> handle_; |
| 181 scoped_ptr<Writer> writer_; | 185 scoped_ptr<Writer> writer_; |
| 182 base::MessageLoop loop_; | 186 base::MessageLoop loop_; |
| 183 }; | 187 }; |
| 184 | 188 |
| 189 void RunPostedTasks() { |
| 190 base::RunLoop run_loop; |
| 191 base::MessageLoop::current()->task_runner()->PostTask(FROM_HERE, |
| 192 run_loop.QuitClosure()); |
| 193 run_loop.Run(); |
| 194 } |
| 195 |
| 185 TEST_P(SharedMemoryDataConsumerHandleTest, ReadFromEmpty) { | 196 TEST_P(SharedMemoryDataConsumerHandleTest, ReadFromEmpty) { |
| 186 char buffer[4]; | 197 char buffer[4]; |
| 187 size_t read = 88; | 198 size_t read = 88; |
| 188 Result result = handle_->read(buffer, 4, kNone, &read); | 199 auto reader = handle_->ObtainReader(nullptr); |
| 200 Result result = reader->read(buffer, 4, kNone, &read); |
| 189 | 201 |
| 190 EXPECT_EQ(kShouldWait, result); | 202 EXPECT_EQ(kShouldWait, result); |
| 191 EXPECT_EQ(0u, read); | 203 EXPECT_EQ(0u, read); |
| 192 } | 204 } |
| 193 | 205 |
| 194 TEST_P(SharedMemoryDataConsumerHandleTest, AutoClose) { | 206 TEST_P(SharedMemoryDataConsumerHandleTest, AutoClose) { |
| 195 char buffer[4]; | 207 char buffer[4]; |
| 196 size_t read = 88; | 208 size_t read = 88; |
| 197 | 209 |
| 198 writer_.reset(); | 210 writer_.reset(); |
| 199 Result result = handle_->read(buffer, 4, kNone, &read); | 211 auto reader = handle_->ObtainReader(nullptr); |
| 212 Result result = reader->read(buffer, 4, kNone, &read); |
| 200 | 213 |
| 201 EXPECT_EQ(kDone, result); | 214 EXPECT_EQ(kDone, result); |
| 202 EXPECT_EQ(0u, read); | 215 EXPECT_EQ(0u, read); |
| 203 } | 216 } |
| 204 | 217 |
| 205 TEST_P(SharedMemoryDataConsumerHandleTest, ReadSimple) { | 218 TEST_P(SharedMemoryDataConsumerHandleTest, ReadSimple) { |
| 206 writer_->AddData(NewFixedData("hello")); | 219 writer_->AddData(NewFixedData("hello")); |
| 207 | 220 |
| 208 char buffer[4] = {}; | 221 char buffer[4] = {}; |
| 209 size_t read = 88; | 222 size_t read = 88; |
| 210 Result result = handle_->read(buffer, 3, kNone, &read); | 223 auto reader = handle_->ObtainReader(nullptr); |
| 224 Result result = reader->read(buffer, 3, kNone, &read); |
| 211 | 225 |
| 212 EXPECT_EQ(kOk, result); | 226 EXPECT_EQ(kOk, result); |
| 213 EXPECT_EQ(3u, read); | 227 EXPECT_EQ(3u, read); |
| 214 EXPECT_STREQ("hel", buffer); | 228 EXPECT_STREQ("hel", buffer); |
| 215 | 229 |
| 216 result = handle_->read(buffer, 3, kNone, &read); | 230 result = reader->read(buffer, 3, kNone, &read); |
| 217 EXPECT_EQ(kOk, result); | 231 EXPECT_EQ(kOk, result); |
| 218 EXPECT_EQ(2u, read); | 232 EXPECT_EQ(2u, read); |
| 219 EXPECT_STREQ("lol", buffer); | 233 EXPECT_STREQ("lol", buffer); |
| 220 | 234 |
| 221 result = handle_->read(buffer, 3, kNone, &read); | 235 result = reader->read(buffer, 3, kNone, &read); |
| 222 EXPECT_EQ(kShouldWait, result); | 236 EXPECT_EQ(kShouldWait, result); |
| 223 EXPECT_EQ(0u, read); | 237 EXPECT_EQ(0u, read); |
| 224 | 238 |
| 225 writer_->Close(); | 239 writer_->Close(); |
| 226 | 240 |
| 227 result = handle_->read(buffer, 3, kNone, &read); | 241 result = reader->read(buffer, 3, kNone, &read); |
| 228 EXPECT_EQ(kDone, result); | 242 EXPECT_EQ(kDone, result); |
| 229 EXPECT_EQ(0u, read); | 243 EXPECT_EQ(0u, read); |
| 230 } | 244 } |
| 245 |
| 246 TEST_P(SharedMemoryDataConsumerHandleTest, ReadAfterHandleIsGone) { |
| 247 writer_->AddData(NewFixedData("hello")); |
| 248 |
| 249 char buffer[8] = {}; |
| 250 size_t read = 88; |
| 251 auto reader = handle_->ObtainReader(nullptr); |
| 252 |
| 253 handle_.reset(); |
| 254 |
| 255 Result result = reader->read(buffer, sizeof(buffer), kNone, &read); |
| 256 |
| 257 EXPECT_EQ(kOk, result); |
| 258 EXPECT_EQ(5u, read); |
| 259 EXPECT_STREQ("hello", buffer); |
| 260 |
| 261 result = reader->read(buffer, 3, kNone, &read); |
| 262 EXPECT_EQ(kShouldWait, result); |
| 263 EXPECT_EQ(0u, read); |
| 264 |
| 265 writer_->Close(); |
| 266 |
| 267 result = reader->read(buffer, 3, kNone, &read); |
| 268 EXPECT_EQ(kDone, result); |
| 269 EXPECT_EQ(0u, read); |
| 270 } |
| 271 |
| 272 TEST_P(SharedMemoryDataConsumerHandleTest, ReObtainReader) { |
| 273 writer_->AddData(NewFixedData("hello")); |
| 274 |
| 275 char buffer[4] = {}; |
| 276 size_t read = 88; |
| 277 auto reader = handle_->ObtainReader(nullptr); |
| 278 Result result = reader->read(buffer, 3, kNone, &read); |
| 279 |
| 280 EXPECT_EQ(kOk, result); |
| 281 EXPECT_EQ(3u, read); |
| 282 EXPECT_STREQ("hel", buffer); |
| 283 |
| 284 reader.reset(); |
| 285 reader = handle_->ObtainReader(nullptr); |
| 286 |
| 287 result = reader->read(buffer, 3, kNone, &read); |
| 288 EXPECT_EQ(kOk, result); |
| 289 EXPECT_EQ(2u, read); |
| 290 EXPECT_STREQ("lol", buffer); |
| 291 |
| 292 result = reader->read(buffer, 3, kNone, &read); |
| 293 EXPECT_EQ(kShouldWait, result); |
| 294 EXPECT_EQ(0u, read); |
| 295 |
| 296 writer_->Close(); |
| 297 |
| 298 result = reader->read(buffer, 3, kNone, &read); |
| 299 EXPECT_EQ(kDone, result); |
| 300 EXPECT_EQ(0u, read); |
| 301 } |
| 231 | 302 |
| 232 TEST_P(SharedMemoryDataConsumerHandleTest, CloseBeforeReading) { | 303 TEST_P(SharedMemoryDataConsumerHandleTest, CloseBeforeReading) { |
| 233 writer_->AddData(NewFixedData("hello")); | 304 writer_->AddData(NewFixedData("hello")); |
| 234 writer_->Close(); | 305 writer_->Close(); |
| 235 | 306 |
| 236 char buffer[20] = {}; | 307 char buffer[20] = {}; |
| 237 size_t read = 88; | 308 size_t read = 88; |
| 238 Result result = handle_->read(buffer, sizeof(buffer), kNone, &read); | 309 auto reader = handle_->ObtainReader(nullptr); |
| 310 Result result = reader->read(buffer, sizeof(buffer), kNone, &read); |
| 239 | 311 |
| 240 EXPECT_EQ(kOk, result); | 312 EXPECT_EQ(kOk, result); |
| 241 EXPECT_EQ(5u, read); | 313 EXPECT_EQ(5u, read); |
| 242 EXPECT_STREQ("hello", buffer); | 314 EXPECT_STREQ("hello", buffer); |
| 243 | 315 |
| 244 result = handle_->read(buffer, sizeof(buffer), kNone, &read); | 316 result = reader->read(buffer, sizeof(buffer), kNone, &read); |
| 245 EXPECT_EQ(kDone, result); | 317 EXPECT_EQ(kDone, result); |
| 246 EXPECT_EQ(0u, read); | 318 EXPECT_EQ(0u, read); |
| 247 } | 319 } |
| 248 | 320 |
| 249 TEST_P(SharedMemoryDataConsumerHandleTest, AddMultipleData) { | 321 TEST_P(SharedMemoryDataConsumerHandleTest, AddMultipleData) { |
| 250 writer_->AddData(NewFixedData("Once ")); | 322 writer_->AddData(NewFixedData("Once ")); |
| 251 writer_->AddData(NewFixedData("upon ")); | 323 writer_->AddData(NewFixedData("upon ")); |
| 252 writer_->AddData(NewFixedData("a ")); | 324 writer_->AddData(NewFixedData("a ")); |
| 253 writer_->AddData(NewFixedData("time ")); | 325 writer_->AddData(NewFixedData("time ")); |
| 254 writer_->AddData(NewFixedData("there ")); | 326 writer_->AddData(NewFixedData("there ")); |
| 255 writer_->AddData(NewFixedData("was ")); | 327 writer_->AddData(NewFixedData("was ")); |
| 256 writer_->AddData(NewFixedData("a ")); | 328 writer_->AddData(NewFixedData("a ")); |
| 257 writer_->Close(); | 329 writer_->Close(); |
| 258 | 330 |
| 259 char buffer[20]; | 331 char buffer[20]; |
| 260 size_t read; | 332 size_t read; |
| 261 Result result; | 333 Result result; |
| 262 | 334 |
| 335 auto reader = handle_->ObtainReader(nullptr); |
| 263 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); | 336 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); |
| 264 result = handle_->read(buffer, 6, kNone, &read); | 337 result = reader->read(buffer, 6, kNone, &read); |
| 265 EXPECT_EQ(kOk, result); | 338 EXPECT_EQ(kOk, result); |
| 266 EXPECT_EQ(6u, read); | 339 EXPECT_EQ(6u, read); |
| 267 EXPECT_STREQ("Once u", buffer); | 340 EXPECT_STREQ("Once u", buffer); |
| 268 | 341 |
| 269 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); | 342 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); |
| 270 result = handle_->read(buffer, 2, kNone, &read); | 343 result = reader->read(buffer, 2, kNone, &read); |
| 271 EXPECT_EQ(kOk, result); | 344 EXPECT_EQ(kOk, result); |
| 272 EXPECT_EQ(2u, read); | 345 EXPECT_EQ(2u, read); |
| 273 EXPECT_STREQ("po", buffer); | 346 EXPECT_STREQ("po", buffer); |
| 274 | 347 |
| 275 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); | 348 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); |
| 276 result = handle_->read(buffer, 9, kNone, &read); | 349 result = reader->read(buffer, 9, kNone, &read); |
| 277 EXPECT_EQ(kOk, result); | 350 EXPECT_EQ(kOk, result); |
| 278 EXPECT_EQ(9u, read); | 351 EXPECT_EQ(9u, read); |
| 279 EXPECT_STREQ("n a time ", buffer); | 352 EXPECT_STREQ("n a time ", buffer); |
| 280 | 353 |
| 281 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); | 354 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); |
| 282 result = handle_->read(buffer, 3, kNone, &read); | 355 result = reader->read(buffer, 3, kNone, &read); |
| 283 EXPECT_EQ(kOk, result); | 356 EXPECT_EQ(kOk, result); |
| 284 EXPECT_EQ(3u, read); | 357 EXPECT_EQ(3u, read); |
| 285 EXPECT_STREQ("the", buffer); | 358 EXPECT_STREQ("the", buffer); |
| 286 | 359 |
| 287 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); | 360 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); |
| 288 result = handle_->read(buffer, 20, kNone, &read); | 361 result = reader->read(buffer, 20, kNone, &read); |
| 289 EXPECT_EQ(kOk, result); | 362 EXPECT_EQ(kOk, result); |
| 290 EXPECT_EQ(9u, read); | 363 EXPECT_EQ(9u, read); |
| 291 EXPECT_STREQ("re was a ", buffer); | 364 EXPECT_STREQ("re was a ", buffer); |
| 292 | 365 |
| 293 result = handle_->read(buffer, sizeof(buffer), kNone, &read); | 366 result = reader->read(buffer, sizeof(buffer), kNone, &read); |
| 294 EXPECT_EQ(kDone, result); | 367 EXPECT_EQ(kDone, result); |
| 295 EXPECT_EQ(0u, read); | 368 EXPECT_EQ(0u, read); |
| 296 } | 369 } |
| 297 | 370 |
| 298 TEST_P(SharedMemoryDataConsumerHandleTest, AddMultipleDataInteractively) { | 371 TEST_P(SharedMemoryDataConsumerHandleTest, AddMultipleDataInteractively) { |
| 299 writer_->AddData(NewFixedData("Once ")); | 372 writer_->AddData(NewFixedData("Once ")); |
| 300 writer_->AddData(NewFixedData("upon ")); | 373 writer_->AddData(NewFixedData("upon ")); |
| 301 | 374 |
| 302 char buffer[20]; | 375 char buffer[20]; |
| 303 size_t read; | 376 size_t read; |
| 304 Result result; | 377 Result result; |
| 305 | 378 |
| 379 auto reader = handle_->ObtainReader(nullptr); |
| 306 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); | 380 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); |
| 307 result = handle_->read(buffer, 6, kNone, &read); | 381 result = reader->read(buffer, 6, kNone, &read); |
| 308 EXPECT_EQ(kOk, result); | 382 EXPECT_EQ(kOk, result); |
| 309 EXPECT_EQ(6u, read); | 383 EXPECT_EQ(6u, read); |
| 310 EXPECT_STREQ("Once u", buffer); | 384 EXPECT_STREQ("Once u", buffer); |
| 311 | 385 |
| 312 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); | 386 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); |
| 313 result = handle_->read(buffer, 2, kNone, &read); | 387 result = reader->read(buffer, 2, kNone, &read); |
| 314 EXPECT_EQ(kOk, result); | 388 EXPECT_EQ(kOk, result); |
| 315 EXPECT_EQ(2u, read); | 389 EXPECT_EQ(2u, read); |
| 316 EXPECT_STREQ("po", buffer); | 390 EXPECT_STREQ("po", buffer); |
| 317 | 391 |
| 318 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); | 392 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); |
| 319 result = handle_->read(buffer, 9, kNone, &read); | 393 result = reader->read(buffer, 9, kNone, &read); |
| 320 EXPECT_EQ(kOk, result); | 394 EXPECT_EQ(kOk, result); |
| 321 EXPECT_EQ(2u, read); | 395 EXPECT_EQ(2u, read); |
| 322 EXPECT_STREQ("n ", buffer); | 396 EXPECT_STREQ("n ", buffer); |
| 323 | 397 |
| 324 writer_->AddData(NewFixedData("a ")); | 398 writer_->AddData(NewFixedData("a ")); |
| 325 | 399 |
| 326 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); | 400 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); |
| 327 result = handle_->read(buffer, 1, kNone, &read); | 401 result = reader->read(buffer, 1, kNone, &read); |
| 328 EXPECT_EQ(kOk, result); | 402 EXPECT_EQ(kOk, result); |
| 329 EXPECT_EQ(1u, read); | 403 EXPECT_EQ(1u, read); |
| 330 EXPECT_STREQ("a", buffer); | 404 EXPECT_STREQ("a", buffer); |
| 331 | 405 |
| 332 writer_->AddData(NewFixedData("time ")); | 406 writer_->AddData(NewFixedData("time ")); |
| 333 writer_->AddData(NewFixedData("there ")); | 407 writer_->AddData(NewFixedData("there ")); |
| 334 writer_->AddData(NewFixedData("was ")); | 408 writer_->AddData(NewFixedData("was ")); |
| 335 writer_->AddData(NewFixedData("a ")); | 409 writer_->AddData(NewFixedData("a ")); |
| 336 writer_->Close(); | 410 writer_->Close(); |
| 337 | 411 |
| 338 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); | 412 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); |
| 339 result = handle_->read(buffer, 9, kNone, &read); | 413 result = reader->read(buffer, 9, kNone, &read); |
| 340 EXPECT_EQ(kOk, result); | 414 EXPECT_EQ(kOk, result); |
| 341 EXPECT_EQ(9u, read); | 415 EXPECT_EQ(9u, read); |
| 342 EXPECT_STREQ(" time the", buffer); | 416 EXPECT_STREQ(" time the", buffer); |
| 343 | 417 |
| 344 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); | 418 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); |
| 345 result = handle_->read(buffer, 20, kNone, &read); | 419 result = reader->read(buffer, 20, kNone, &read); |
| 346 EXPECT_EQ(kOk, result); | 420 EXPECT_EQ(kOk, result); |
| 347 EXPECT_EQ(9u, read); | 421 EXPECT_EQ(9u, read); |
| 348 EXPECT_STREQ("re was a ", buffer); | 422 EXPECT_STREQ("re was a ", buffer); |
| 349 | 423 |
| 350 result = handle_->read(buffer, sizeof(buffer), kNone, &read); | 424 result = reader->read(buffer, sizeof(buffer), kNone, &read); |
| 351 EXPECT_EQ(kDone, result); | 425 EXPECT_EQ(kDone, result); |
| 352 EXPECT_EQ(0u, read); | 426 EXPECT_EQ(0u, read); |
| 353 } | 427 } |
| 354 | 428 |
| 355 TEST_P(SharedMemoryDataConsumerHandleTest, RegisterClient) { | 429 TEST_P(SharedMemoryDataConsumerHandleTest, RegisterClient) { |
| 356 Checkpoint checkpoint; | 430 Checkpoint checkpoint; |
| 357 | 431 |
| 358 InSequence s; | 432 InSequence s; |
| 359 EXPECT_CALL(checkpoint, Call(0)); | 433 EXPECT_CALL(checkpoint, Call(0)); |
| 360 EXPECT_CALL(checkpoint, Call(1)); | 434 EXPECT_CALL(checkpoint, Call(1)); |
| 435 EXPECT_CALL(checkpoint, Call(2)); |
| 361 EXPECT_CALL(client_, didGetReadable()); | 436 EXPECT_CALL(client_, didGetReadable()); |
| 362 EXPECT_CALL(checkpoint, Call(2)); | 437 EXPECT_CALL(checkpoint, Call(3)); |
| 363 | 438 |
| 364 checkpoint.Call(0); | 439 checkpoint.Call(0); |
| 365 handle_->registerClient(&client_); | 440 auto reader = handle_->ObtainReader(&client_); |
| 366 checkpoint.Call(1); | 441 checkpoint.Call(1); |
| 442 RunPostedTasks(); |
| 443 checkpoint.Call(2); |
| 367 writer_->Close(); | 444 writer_->Close(); |
| 368 checkpoint.Call(2); | 445 checkpoint.Call(3); |
| 369 } | 446 } |
| 370 | 447 |
| 371 TEST_P(SharedMemoryDataConsumerHandleTest, RegisterClientWhenDataExists) { | 448 TEST_P(SharedMemoryDataConsumerHandleTest, RegisterClientWhenDataExists) { |
| 372 Checkpoint checkpoint; | 449 Checkpoint checkpoint; |
| 373 | 450 |
| 374 InSequence s; | 451 InSequence s; |
| 375 EXPECT_CALL(checkpoint, Call(0)); | 452 EXPECT_CALL(checkpoint, Call(0)); |
| 376 EXPECT_CALL(checkpoint, Call(1)); | 453 EXPECT_CALL(checkpoint, Call(1)); |
| 454 EXPECT_CALL(checkpoint, Call(2)); |
| 377 EXPECT_CALL(client_, didGetReadable()); | 455 EXPECT_CALL(client_, didGetReadable()); |
| 378 EXPECT_CALL(checkpoint, Call(2)); | 456 EXPECT_CALL(checkpoint, Call(3)); |
| 379 | 457 |
| 380 checkpoint.Call(0); | 458 checkpoint.Call(0); |
| 381 writer_->AddData(NewFixedData("Once ")); | 459 writer_->AddData(NewFixedData("Once ")); |
| 382 checkpoint.Call(1); | 460 checkpoint.Call(1); |
| 383 handle_->registerClient(&client_); | 461 auto reader = handle_->ObtainReader(&client_); |
| 384 checkpoint.Call(2); | 462 checkpoint.Call(2); |
| 463 RunPostedTasks(); |
| 464 checkpoint.Call(3); |
| 385 } | 465 } |
| 386 | 466 |
| 387 TEST_P(SharedMemoryDataConsumerHandleTest, AddDataWhenClientIsRegistered) { | 467 TEST_P(SharedMemoryDataConsumerHandleTest, AddDataWhenClientIsRegistered) { |
| 388 Checkpoint checkpoint; | 468 Checkpoint checkpoint; |
| 389 char buffer[20]; | 469 char buffer[20]; |
| 390 Result result; | 470 Result result; |
| 391 size_t size; | 471 size_t size; |
| 392 | 472 |
| 393 InSequence s; | 473 InSequence s; |
| 394 EXPECT_CALL(checkpoint, Call(0)); | 474 EXPECT_CALL(checkpoint, Call(0)); |
| 395 EXPECT_CALL(checkpoint, Call(1)); | 475 EXPECT_CALL(checkpoint, Call(1)); |
| 396 EXPECT_CALL(client_, didGetReadable()); | 476 EXPECT_CALL(client_, didGetReadable()); |
| 397 EXPECT_CALL(checkpoint, Call(2)); | 477 EXPECT_CALL(checkpoint, Call(2)); |
| 398 EXPECT_CALL(checkpoint, Call(3)); | 478 EXPECT_CALL(checkpoint, Call(3)); |
| 399 EXPECT_CALL(checkpoint, Call(4)); | 479 EXPECT_CALL(checkpoint, Call(4)); |
| 400 EXPECT_CALL(client_, didGetReadable()); | 480 EXPECT_CALL(client_, didGetReadable()); |
| 401 EXPECT_CALL(checkpoint, Call(5)); | 481 EXPECT_CALL(checkpoint, Call(5)); |
| 402 | 482 |
| 403 checkpoint.Call(0); | 483 checkpoint.Call(0); |
| 404 handle_->registerClient(&client_); | 484 auto reader = handle_->ObtainReader(&client_); |
| 405 checkpoint.Call(1); | 485 checkpoint.Call(1); |
| 406 writer_->AddData(NewFixedData("Once ")); | 486 writer_->AddData(NewFixedData("Once ")); |
| 407 checkpoint.Call(2); | 487 checkpoint.Call(2); |
| 408 writer_->AddData(NewFixedData("upon ")); | 488 writer_->AddData(NewFixedData("upon ")); |
| 409 checkpoint.Call(3); | 489 checkpoint.Call(3); |
| 410 result = handle_->read(buffer, sizeof(buffer), kNone, &size); | 490 result = reader->read(buffer, sizeof(buffer), kNone, &size); |
| 411 EXPECT_EQ(kOk, result); | 491 EXPECT_EQ(kOk, result); |
| 412 EXPECT_EQ(10u, size); | 492 EXPECT_EQ(10u, size); |
| 413 checkpoint.Call(4); | 493 checkpoint.Call(4); |
| 414 writer_->AddData(NewFixedData("a ")); | 494 writer_->AddData(NewFixedData("a ")); |
| 415 checkpoint.Call(5); | 495 checkpoint.Call(5); |
| 416 } | 496 } |
| 417 | 497 |
| 418 TEST_P(SharedMemoryDataConsumerHandleTest, CloseWithClientAndData) { | 498 TEST_P(SharedMemoryDataConsumerHandleTest, CloseWithClientAndData) { |
| 419 Checkpoint checkpoint; | 499 Checkpoint checkpoint; |
| 420 | 500 |
| 421 InSequence s; | 501 InSequence s; |
| 422 EXPECT_CALL(checkpoint, Call(0)); | 502 EXPECT_CALL(checkpoint, Call(0)); |
| 423 EXPECT_CALL(checkpoint, Call(1)); | 503 EXPECT_CALL(checkpoint, Call(1)); |
| 424 EXPECT_CALL(client_, didGetReadable()); | 504 EXPECT_CALL(client_, didGetReadable()); |
| 425 EXPECT_CALL(checkpoint, Call(2)); | 505 EXPECT_CALL(checkpoint, Call(2)); |
| 426 EXPECT_CALL(checkpoint, Call(3)); | 506 EXPECT_CALL(checkpoint, Call(3)); |
| 427 | 507 |
| 428 checkpoint.Call(0); | 508 checkpoint.Call(0); |
| 429 handle_->registerClient(&client_); | 509 auto reader = handle_->ObtainReader(&client_); |
| 430 checkpoint.Call(1); | 510 checkpoint.Call(1); |
| 431 writer_->AddData(NewFixedData("Once ")); | 511 writer_->AddData(NewFixedData("Once ")); |
| 432 checkpoint.Call(2); | 512 checkpoint.Call(2); |
| 433 writer_->Close(); | 513 writer_->Close(); |
| 434 checkpoint.Call(3); | 514 checkpoint.Call(3); |
| 435 } | 515 } |
| 436 | 516 |
| 437 TEST_P(SharedMemoryDataConsumerHandleTest, UnregisterClient) { | 517 TEST_P(SharedMemoryDataConsumerHandleTest, ReleaseReader) { |
| 438 Checkpoint checkpoint; | 518 Checkpoint checkpoint; |
| 439 | 519 |
| 440 InSequence s; | 520 InSequence s; |
| 441 EXPECT_CALL(checkpoint, Call(0)); | 521 EXPECT_CALL(checkpoint, Call(0)); |
| 442 EXPECT_CALL(checkpoint, Call(1)); | 522 EXPECT_CALL(checkpoint, Call(1)); |
| 443 EXPECT_CALL(checkpoint, Call(2)); | 523 EXPECT_CALL(checkpoint, Call(2)); |
| 444 | 524 |
| 445 checkpoint.Call(0); | 525 checkpoint.Call(0); |
| 446 handle_->registerClient(&client_); | 526 auto reader = handle_->ObtainReader(&client_); |
| 447 checkpoint.Call(1); | 527 checkpoint.Call(1); |
| 448 handle_->unregisterClient(); | 528 reader.reset(); |
| 449 writer_->AddData(NewFixedData("Once ")); | 529 writer_->AddData(NewFixedData("Once ")); |
| 450 checkpoint.Call(2); | 530 checkpoint.Call(2); |
| 451 } | 531 } |
| 452 | 532 |
| 453 TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadShouldWait) { | 533 TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadShouldWait) { |
| 454 Result result; | 534 Result result; |
| 455 const void* buffer = &result; | 535 const void* buffer = &result; |
| 456 size_t size = 99; | 536 size_t size = 99; |
| 457 | 537 |
| 458 result = handle_->beginRead(&buffer, kNone, &size); | 538 auto reader = handle_->ObtainReader(nullptr); |
| 539 result = reader->beginRead(&buffer, kNone, &size); |
| 459 EXPECT_EQ(kShouldWait, result); | 540 EXPECT_EQ(kShouldWait, result); |
| 460 EXPECT_EQ(nullptr, buffer); | 541 EXPECT_EQ(nullptr, buffer); |
| 461 EXPECT_EQ(0u, size); | 542 EXPECT_EQ(0u, size); |
| 462 } | 543 } |
| 463 | 544 |
| 464 TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadSimple) { | 545 TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadSimple) { |
| 465 writer_->AddData(NewFixedData("Once ")); | 546 writer_->AddData(NewFixedData("Once ")); |
| 466 | 547 |
| 467 Result result; | 548 Result result; |
| 468 const void* buffer = &result; | 549 const void* buffer = &result; |
| 469 size_t size = 99; | 550 size_t size = 99; |
| 470 | 551 |
| 471 result = handle_->beginRead(&buffer, kNone, &size); | 552 auto reader = handle_->ObtainReader(nullptr); |
| 553 result = reader->beginRead(&buffer, kNone, &size); |
| 472 EXPECT_EQ(kOk, result); | 554 EXPECT_EQ(kOk, result); |
| 473 EXPECT_EQ(5u, size); | 555 EXPECT_EQ(5u, size); |
| 474 EXPECT_EQ("Once ", ToString(buffer, 5)); | 556 EXPECT_EQ("Once ", ToString(buffer, 5)); |
| 475 | 557 |
| 476 handle_->endRead(1); | 558 reader->endRead(1); |
| 477 | 559 |
| 478 result = handle_->beginRead(&buffer, kNone, &size); | 560 result = reader->beginRead(&buffer, kNone, &size); |
| 479 EXPECT_EQ(kOk, result); | 561 EXPECT_EQ(kOk, result); |
| 480 EXPECT_EQ(4u, size); | 562 EXPECT_EQ(4u, size); |
| 481 EXPECT_EQ("nce ", ToString(buffer, 4)); | 563 EXPECT_EQ("nce ", ToString(buffer, 4)); |
| 482 | 564 |
| 483 handle_->endRead(4); | 565 reader->endRead(4); |
| 484 | 566 |
| 485 result = handle_->beginRead(&buffer, kNone, &size); | 567 result = reader->beginRead(&buffer, kNone, &size); |
| 486 EXPECT_EQ(kShouldWait, result); | 568 EXPECT_EQ(kShouldWait, result); |
| 487 EXPECT_EQ(0u, size); | 569 EXPECT_EQ(0u, size); |
| 488 EXPECT_EQ(nullptr, buffer); | 570 EXPECT_EQ(nullptr, buffer); |
| 489 | 571 |
| 490 writer_->Close(); | 572 writer_->Close(); |
| 491 | 573 |
| 492 result = handle_->beginRead(&buffer, kNone, &size); | 574 result = reader->beginRead(&buffer, kNone, &size); |
| 493 EXPECT_EQ(kDone, result); | 575 EXPECT_EQ(kDone, result); |
| 494 EXPECT_EQ(0u, size); | 576 EXPECT_EQ(0u, size); |
| 495 EXPECT_EQ(nullptr, buffer); | 577 EXPECT_EQ(nullptr, buffer); |
| 496 } | 578 } |
| 497 | 579 |
| 498 TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadWithMultipleData) { | 580 TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadWithMultipleData) { |
| 499 writer_->AddData(NewFixedData("Once ")); | 581 writer_->AddData(NewFixedData("Once ")); |
| 500 writer_->AddData(NewFixedData("upon ")); | 582 writer_->AddData(NewFixedData("upon ")); |
| 501 | 583 |
| 502 Result result; | 584 Result result; |
| 503 const void* buffer = &result; | 585 const void* buffer = &result; |
| 504 size_t size = 99; | 586 size_t size = 99; |
| 505 | 587 |
| 506 result = handle_->beginRead(&buffer, kNone, &size); | 588 auto reader = handle_->ObtainReader(nullptr); |
| 589 result = reader->beginRead(&buffer, kNone, &size); |
| 507 EXPECT_EQ(kOk, result); | 590 EXPECT_EQ(kOk, result); |
| 508 EXPECT_EQ(5u, size); | 591 EXPECT_EQ(5u, size); |
| 509 EXPECT_EQ("Once ", ToString(buffer, 5)); | 592 EXPECT_EQ("Once ", ToString(buffer, 5)); |
| 510 | 593 |
| 511 handle_->endRead(1); | 594 reader->endRead(1); |
| 512 | 595 |
| 513 result = handle_->beginRead(&buffer, kNone, &size); | 596 result = reader->beginRead(&buffer, kNone, &size); |
| 514 EXPECT_EQ(kOk, result); | 597 EXPECT_EQ(kOk, result); |
| 515 EXPECT_EQ(4u, size); | 598 EXPECT_EQ(4u, size); |
| 516 EXPECT_EQ("nce ", ToString(buffer, 4)); | 599 EXPECT_EQ("nce ", ToString(buffer, 4)); |
| 517 | 600 |
| 518 handle_->endRead(4); | 601 reader->endRead(4); |
| 519 | 602 |
| 520 result = handle_->beginRead(&buffer, kNone, &size); | 603 result = reader->beginRead(&buffer, kNone, &size); |
| 521 EXPECT_EQ(kOk, result); | 604 EXPECT_EQ(kOk, result); |
| 522 EXPECT_EQ(5u, size); | 605 EXPECT_EQ(5u, size); |
| 523 EXPECT_EQ("upon ", ToString(buffer, 5)); | 606 EXPECT_EQ("upon ", ToString(buffer, 5)); |
| 524 | 607 |
| 525 handle_->endRead(5); | 608 reader->endRead(5); |
| 526 | 609 |
| 527 result = handle_->beginRead(&buffer, kNone, &size); | 610 result = reader->beginRead(&buffer, kNone, &size); |
| 528 EXPECT_EQ(kShouldWait, result); | 611 EXPECT_EQ(kShouldWait, result); |
| 529 EXPECT_EQ(0u, size); | 612 EXPECT_EQ(0u, size); |
| 530 EXPECT_EQ(nullptr, buffer); | 613 EXPECT_EQ(nullptr, buffer); |
| 531 | 614 |
| 532 writer_->Close(); | 615 writer_->Close(); |
| 533 | 616 |
| 534 result = handle_->beginRead(&buffer, kNone, &size); | 617 result = reader->beginRead(&buffer, kNone, &size); |
| 535 EXPECT_EQ(kDone, result); | 618 EXPECT_EQ(kDone, result); |
| 536 EXPECT_EQ(0u, size); | 619 EXPECT_EQ(0u, size); |
| 537 EXPECT_EQ(nullptr, buffer); | 620 EXPECT_EQ(nullptr, buffer); |
| 538 } | 621 } |
| 539 | 622 |
| 540 TEST(SharedMemoryDataConsumerHandleBackpressureTest, Read) { | 623 TEST(SharedMemoryDataConsumerHandleBackpressureTest, Read) { |
| 541 base::MessageLoop loop; | 624 base::MessageLoop loop; |
| 542 char buffer[20]; | 625 char buffer[20]; |
| 543 Result result; | 626 Result result; |
| 544 size_t size; | 627 size_t size; |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 685 logger->log()); | 768 logger->log()); |
| 686 } | 769 } |
| 687 | 770 |
| 688 INSTANTIATE_TEST_CASE_P(SharedMemoryDataConsumerHandleTest, | 771 INSTANTIATE_TEST_CASE_P(SharedMemoryDataConsumerHandleTest, |
| 689 SharedMemoryDataConsumerHandleTest, | 772 SharedMemoryDataConsumerHandleTest, |
| 690 ::testing::Values(kApplyBackpressure, | 773 ::testing::Values(kApplyBackpressure, |
| 691 kDoNotApplyBackpressure)); | 774 kDoNotApplyBackpressure)); |
| 692 } // namespace | 775 } // namespace |
| 693 | 776 |
| 694 } // namespace content | 777 } // namespace content |
| OLD | NEW |