| OLD | NEW |
| (Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "content/child/shared_memory_data_consumer_handle.h" |
| 6 |
| 7 #include <string.h> |
| 8 #include <string> |
| 9 #include <vector> |
| 10 |
| 11 #include "testing/gmock/include/gmock/gmock.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" |
| 13 |
| 14 namespace content { |
| 15 |
| 16 namespace { |
| 17 using blink::WebDataConsumerHandle; |
| 18 using Result = WebDataConsumerHandle::Result; |
| 19 using Writer = SharedMemoryDataConsumerHandle::Writer; |
| 20 using BackpressureMode = SharedMemoryDataConsumerHandle::BackpressureMode; |
| 21 const BackpressureMode kApplyBackpressure = |
| 22 SharedMemoryDataConsumerHandle::kApplyBackpressure; |
| 23 const BackpressureMode kDoNotApplyBackpressure = |
| 24 SharedMemoryDataConsumerHandle::kDoNotApplyBackpressure; |
| 25 |
| 26 const WebDataConsumerHandle::Flags kNone = WebDataConsumerHandle::FlagNone; |
| 27 const Result kOk = WebDataConsumerHandle::Ok; |
| 28 const Result kDone = WebDataConsumerHandle::Done; |
| 29 const Result kShouldWait = WebDataConsumerHandle::ShouldWait; |
| 30 |
| 31 using ::testing::_; |
| 32 using ::testing::InSequence; |
| 33 using ::testing::MockFunction; |
| 34 using ::testing::Return; |
| 35 using ::testing::StrictMock; |
| 36 |
| 37 using Checkpoint = StrictMock<MockFunction<void(int)>>; |
| 38 using ReceivedData = RequestPeer::ReceivedData; |
| 39 |
| 40 class Logger final : public base::RefCounted<Logger> { |
| 41 public: |
| 42 Logger() {} |
| 43 void Add(const std::string& entry) { log_ += entry + "\n"; } |
| 44 const std::string& log() const { return log_; } |
| 45 |
| 46 private: |
| 47 friend class base::RefCounted<Logger>; |
| 48 ~Logger() {} |
| 49 std::string log_; |
| 50 |
| 51 DISALLOW_COPY_AND_ASSIGN(Logger); |
| 52 }; |
| 53 |
| 54 class LoggingFixedReceivedData final : public RequestPeer::ReceivedData { |
| 55 public: |
| 56 LoggingFixedReceivedData(const char* name, |
| 57 const char* s, |
| 58 scoped_refptr<Logger> logger) |
| 59 : name_(name), data_(s, s + strlen(s)), logger_(logger) {} |
| 60 ~LoggingFixedReceivedData() override { |
| 61 logger_->Add(name_ + " is destructed."); |
| 62 } |
| 63 |
| 64 const char* payload() const override { |
| 65 return data_.empty() ? nullptr : &data_[0]; |
| 66 } |
| 67 int length() const override { return static_cast<int>(data_.size()); } |
| 68 int encoded_length() const override { return static_cast<int>(data_.size()); } |
| 69 |
| 70 private: |
| 71 const std::string name_; |
| 72 const std::vector<char> data_; |
| 73 scoped_refptr<Logger> logger_; |
| 74 |
| 75 DISALLOW_COPY_AND_ASSIGN(LoggingFixedReceivedData); |
| 76 }; |
| 77 |
| 78 class FixedReceivedData final : public RequestPeer::ReceivedData { |
| 79 public: |
| 80 explicit FixedReceivedData(const char* s) |
| 81 : data_(s, s + strlen(s)), encoded_length_(strlen(s)) {} |
| 82 |
| 83 const char* payload() const override { |
| 84 return data_.empty() ? nullptr : &data_[0]; |
| 85 } |
| 86 int length() const override { return static_cast<int>(data_.size()); } |
| 87 int encoded_length() const override { return encoded_length_; } |
| 88 |
| 89 private: |
| 90 const std::vector<char> data_; |
| 91 int encoded_length_; |
| 92 |
| 93 DISALLOW_COPY_AND_ASSIGN(FixedReceivedData); |
| 94 }; |
| 95 |
| 96 class MockClient : public WebDataConsumerHandle::Client { |
| 97 public: |
| 98 MOCK_METHOD0(didGetReadable, void()); |
| 99 }; |
| 100 |
| 101 std::string ToString(const void* p, size_t size) { |
| 102 const char* q = static_cast<const char*>(p); |
| 103 return std::string(q, q + size); |
| 104 } |
| 105 |
| 106 class SharedMemoryDataConsumerHandleTest |
| 107 : public ::testing::TestWithParam<BackpressureMode> { |
| 108 protected: |
| 109 void SetUp() override { |
| 110 handle_.reset(new SharedMemoryDataConsumerHandle(GetParam(), &writer_)); |
| 111 } |
| 112 |
| 113 StrictMock<MockClient> client_; |
| 114 scoped_ptr<SharedMemoryDataConsumerHandle> handle_; |
| 115 scoped_ptr<Writer> writer_; |
| 116 }; |
| 117 |
| 118 TEST_P(SharedMemoryDataConsumerHandleTest, ReadFromEmpty) { |
| 119 char buffer[4]; |
| 120 size_t read = 88; |
| 121 Result result = handle_->read(buffer, 4, kNone, &read); |
| 122 |
| 123 EXPECT_EQ(result, kShouldWait); |
| 124 EXPECT_EQ(0u, read); |
| 125 } |
| 126 |
| 127 TEST_P(SharedMemoryDataConsumerHandleTest, AutoClose) { |
| 128 char buffer[4]; |
| 129 size_t read = 88; |
| 130 |
| 131 writer_.reset(); |
| 132 Result result = handle_->read(buffer, 4, kNone, &read); |
| 133 |
| 134 EXPECT_EQ(result, kDone); |
| 135 EXPECT_EQ(0u, read); |
| 136 } |
| 137 |
| 138 TEST_P(SharedMemoryDataConsumerHandleTest, ReadSimple) { |
| 139 writer_->AddData(make_scoped_ptr(new FixedReceivedData("hello"))); |
| 140 |
| 141 char buffer[4] = {}; |
| 142 size_t read = 88; |
| 143 Result result = handle_->read(buffer, 3, kNone, &read); |
| 144 |
| 145 EXPECT_EQ(kOk, result); |
| 146 EXPECT_EQ(3u, read); |
| 147 EXPECT_STREQ("hel", buffer); |
| 148 |
| 149 result = handle_->read(buffer, 3, kNone, &read); |
| 150 EXPECT_EQ(kOk, result); |
| 151 EXPECT_EQ(2u, read); |
| 152 EXPECT_STREQ("lol", buffer); |
| 153 |
| 154 result = handle_->read(buffer, 3, kNone, &read); |
| 155 EXPECT_EQ(kShouldWait, result); |
| 156 EXPECT_EQ(0u, read); |
| 157 |
| 158 writer_->Close(); |
| 159 |
| 160 result = handle_->read(buffer, 3, kNone, &read); |
| 161 EXPECT_EQ(kDone, result); |
| 162 EXPECT_EQ(0u, read); |
| 163 } |
| 164 |
| 165 TEST_P(SharedMemoryDataConsumerHandleTest, CloseBeforeReading) { |
| 166 writer_->AddData(make_scoped_ptr(new FixedReceivedData("hello"))); |
| 167 writer_->Close(); |
| 168 |
| 169 char buffer[20] = {}; |
| 170 size_t read = 88; |
| 171 Result result = handle_->read(buffer, arraysize(buffer), kNone, &read); |
| 172 |
| 173 EXPECT_EQ(kOk, result); |
| 174 EXPECT_EQ(5u, read); |
| 175 EXPECT_STREQ("hello", buffer); |
| 176 |
| 177 result = handle_->read(buffer, arraysize(buffer), kNone, &read); |
| 178 EXPECT_EQ(kDone, result); |
| 179 EXPECT_EQ(0u, read); |
| 180 } |
| 181 |
| 182 TEST_P(SharedMemoryDataConsumerHandleTest, AddMultipleData) { |
| 183 writer_->AddData(make_scoped_ptr(new FixedReceivedData("Once "))); |
| 184 writer_->AddData(make_scoped_ptr(new FixedReceivedData("upon "))); |
| 185 writer_->AddData(make_scoped_ptr(new FixedReceivedData("a "))); |
| 186 writer_->AddData(make_scoped_ptr(new FixedReceivedData("time "))); |
| 187 writer_->AddData(make_scoped_ptr(new FixedReceivedData("there "))); |
| 188 writer_->AddData(make_scoped_ptr(new FixedReceivedData("was "))); |
| 189 writer_->AddData(make_scoped_ptr(new FixedReceivedData("a "))); |
| 190 writer_->Close(); |
| 191 |
| 192 char buffer[20]; |
| 193 size_t read; |
| 194 Result result; |
| 195 |
| 196 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); |
| 197 result = handle_->read(buffer, 6, kNone, &read); |
| 198 EXPECT_EQ(kOk, result); |
| 199 EXPECT_EQ(6u, read); |
| 200 EXPECT_STREQ("Once u", buffer); |
| 201 |
| 202 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); |
| 203 result = handle_->read(buffer, 2, kNone, &read); |
| 204 EXPECT_EQ(kOk, result); |
| 205 EXPECT_EQ(2u, read); |
| 206 EXPECT_STREQ("po", buffer); |
| 207 |
| 208 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); |
| 209 result = handle_->read(buffer, 9, kNone, &read); |
| 210 EXPECT_EQ(kOk, result); |
| 211 EXPECT_EQ(9u, read); |
| 212 EXPECT_STREQ("n a time ", buffer); |
| 213 |
| 214 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); |
| 215 result = handle_->read(buffer, 3, kNone, &read); |
| 216 EXPECT_EQ(kOk, result); |
| 217 EXPECT_EQ(3u, read); |
| 218 EXPECT_STREQ("the", buffer); |
| 219 |
| 220 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); |
| 221 result = handle_->read(buffer, 20, kNone, &read); |
| 222 EXPECT_EQ(kOk, result); |
| 223 EXPECT_EQ(9u, read); |
| 224 EXPECT_STREQ("re was a ", buffer); |
| 225 |
| 226 result = handle_->read(buffer, arraysize(buffer), kNone, &read); |
| 227 EXPECT_EQ(kDone, result); |
| 228 EXPECT_EQ(0u, read); |
| 229 } |
| 230 |
| 231 TEST_P(SharedMemoryDataConsumerHandleTest, AddMultipleDataInteractively) { |
| 232 writer_->AddData(make_scoped_ptr(new FixedReceivedData("Once "))); |
| 233 writer_->AddData(make_scoped_ptr(new FixedReceivedData("upon "))); |
| 234 |
| 235 char buffer[20]; |
| 236 size_t read; |
| 237 Result result; |
| 238 |
| 239 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); |
| 240 result = handle_->read(buffer, 6, kNone, &read); |
| 241 EXPECT_EQ(kOk, result); |
| 242 EXPECT_EQ(6u, read); |
| 243 EXPECT_STREQ("Once u", buffer); |
| 244 |
| 245 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); |
| 246 result = handle_->read(buffer, 2, kNone, &read); |
| 247 EXPECT_EQ(kOk, result); |
| 248 EXPECT_EQ(2u, read); |
| 249 EXPECT_STREQ("po", buffer); |
| 250 |
| 251 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); |
| 252 result = handle_->read(buffer, 9, kNone, &read); |
| 253 EXPECT_EQ(kOk, result); |
| 254 EXPECT_EQ(2u, read); |
| 255 EXPECT_STREQ("n ", buffer); |
| 256 |
| 257 writer_->AddData(make_scoped_ptr(new FixedReceivedData("a "))); |
| 258 |
| 259 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); |
| 260 result = handle_->read(buffer, 1, kNone, &read); |
| 261 EXPECT_EQ(kOk, result); |
| 262 EXPECT_EQ(1u, read); |
| 263 EXPECT_STREQ("a", buffer); |
| 264 |
| 265 writer_->AddData(make_scoped_ptr(new FixedReceivedData("time "))); |
| 266 writer_->AddData(make_scoped_ptr(new FixedReceivedData("there "))); |
| 267 writer_->AddData(make_scoped_ptr(new FixedReceivedData("was "))); |
| 268 writer_->AddData(make_scoped_ptr(new FixedReceivedData("a "))); |
| 269 writer_->Close(); |
| 270 |
| 271 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); |
| 272 result = handle_->read(buffer, 9, kNone, &read); |
| 273 EXPECT_EQ(kOk, result); |
| 274 EXPECT_EQ(9u, read); |
| 275 EXPECT_STREQ(" time the", buffer); |
| 276 |
| 277 std::fill(&buffer[0], &buffer[arraysize(buffer)], 0); |
| 278 result = handle_->read(buffer, 20, kNone, &read); |
| 279 EXPECT_EQ(kOk, result); |
| 280 EXPECT_EQ(9u, read); |
| 281 EXPECT_STREQ("re was a ", buffer); |
| 282 |
| 283 result = handle_->read(buffer, arraysize(buffer), kNone, &read); |
| 284 EXPECT_EQ(kDone, result); |
| 285 EXPECT_EQ(0u, read); |
| 286 } |
| 287 |
| 288 TEST_P(SharedMemoryDataConsumerHandleTest, RegisterClient) { |
| 289 Checkpoint checkpoint; |
| 290 |
| 291 InSequence s; |
| 292 EXPECT_CALL(checkpoint, Call(0)); |
| 293 EXPECT_CALL(checkpoint, Call(1)); |
| 294 EXPECT_CALL(client_, didGetReadable()); |
| 295 EXPECT_CALL(checkpoint, Call(2)); |
| 296 |
| 297 checkpoint.Call(0); |
| 298 handle_->registerClient(&client_); |
| 299 checkpoint.Call(1); |
| 300 writer_->Close(); |
| 301 checkpoint.Call(2); |
| 302 } |
| 303 |
| 304 TEST_P(SharedMemoryDataConsumerHandleTest, RegisterClientWhenDataExists) { |
| 305 Checkpoint checkpoint; |
| 306 |
| 307 InSequence s; |
| 308 EXPECT_CALL(checkpoint, Call(0)); |
| 309 EXPECT_CALL(checkpoint, Call(1)); |
| 310 EXPECT_CALL(client_, didGetReadable()); |
| 311 EXPECT_CALL(checkpoint, Call(2)); |
| 312 |
| 313 checkpoint.Call(0); |
| 314 writer_->AddData(make_scoped_ptr(new FixedReceivedData("Once "))); |
| 315 checkpoint.Call(1); |
| 316 handle_->registerClient(&client_); |
| 317 checkpoint.Call(2); |
| 318 } |
| 319 |
| 320 TEST_P(SharedMemoryDataConsumerHandleTest, AddDataWhenClientIsRegistered) { |
| 321 Checkpoint checkpoint; |
| 322 char buffer[20]; |
| 323 Result result; |
| 324 size_t size; |
| 325 |
| 326 InSequence s; |
| 327 EXPECT_CALL(checkpoint, Call(0)); |
| 328 EXPECT_CALL(checkpoint, Call(1)); |
| 329 EXPECT_CALL(client_, didGetReadable()); |
| 330 EXPECT_CALL(checkpoint, Call(2)); |
| 331 EXPECT_CALL(checkpoint, Call(3)); |
| 332 EXPECT_CALL(checkpoint, Call(4)); |
| 333 EXPECT_CALL(client_, didGetReadable()); |
| 334 EXPECT_CALL(checkpoint, Call(5)); |
| 335 |
| 336 checkpoint.Call(0); |
| 337 handle_->registerClient(&client_); |
| 338 checkpoint.Call(1); |
| 339 writer_->AddData(make_scoped_ptr(new FixedReceivedData("Once "))); |
| 340 checkpoint.Call(2); |
| 341 writer_->AddData(make_scoped_ptr(new FixedReceivedData("upon "))); |
| 342 checkpoint.Call(3); |
| 343 result = handle_->read(buffer, arraysize(buffer), kNone, &size); |
| 344 EXPECT_EQ(kOk, result); |
| 345 EXPECT_EQ(10u, size); |
| 346 checkpoint.Call(4); |
| 347 writer_->AddData(make_scoped_ptr(new FixedReceivedData("a "))); |
| 348 checkpoint.Call(5); |
| 349 } |
| 350 |
| 351 TEST_P(SharedMemoryDataConsumerHandleTest, CloseWithClientAndData) { |
| 352 Checkpoint checkpoint; |
| 353 |
| 354 InSequence s; |
| 355 EXPECT_CALL(checkpoint, Call(0)); |
| 356 EXPECT_CALL(checkpoint, Call(1)); |
| 357 EXPECT_CALL(client_, didGetReadable()); |
| 358 EXPECT_CALL(checkpoint, Call(2)); |
| 359 EXPECT_CALL(checkpoint, Call(3)); |
| 360 |
| 361 checkpoint.Call(0); |
| 362 handle_->registerClient(&client_); |
| 363 checkpoint.Call(1); |
| 364 writer_->AddData(make_scoped_ptr(new FixedReceivedData("Once "))); |
| 365 checkpoint.Call(2); |
| 366 writer_->Close(); |
| 367 checkpoint.Call(3); |
| 368 } |
| 369 |
| 370 TEST_P(SharedMemoryDataConsumerHandleTest, UnregisterClient) { |
| 371 Checkpoint checkpoint; |
| 372 |
| 373 InSequence s; |
| 374 EXPECT_CALL(checkpoint, Call(0)); |
| 375 EXPECT_CALL(checkpoint, Call(1)); |
| 376 EXPECT_CALL(checkpoint, Call(2)); |
| 377 |
| 378 checkpoint.Call(0); |
| 379 handle_->registerClient(&client_); |
| 380 checkpoint.Call(1); |
| 381 handle_->unregisterClient(); |
| 382 writer_->AddData(make_scoped_ptr(new FixedReceivedData("Once "))); |
| 383 checkpoint.Call(2); |
| 384 } |
| 385 |
| 386 TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadShouldWait) { |
| 387 Result result; |
| 388 const void* buffer = &result; |
| 389 size_t size = 99; |
| 390 |
| 391 result = handle_->beginRead(&buffer, kNone, &size); |
| 392 EXPECT_EQ(kShouldWait, result); |
| 393 EXPECT_EQ(nullptr, buffer); |
| 394 EXPECT_EQ(0u, size); |
| 395 } |
| 396 |
| 397 TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadSimple) { |
| 398 writer_->AddData(make_scoped_ptr(new FixedReceivedData("Once "))); |
| 399 |
| 400 Result result; |
| 401 const void* buffer = &result; |
| 402 size_t size = 99; |
| 403 |
| 404 result = handle_->beginRead(&buffer, kNone, &size); |
| 405 EXPECT_EQ(kOk, result); |
| 406 EXPECT_EQ(5u, size); |
| 407 EXPECT_EQ("Once ", ToString(buffer, 5)); |
| 408 |
| 409 handle_->endRead(1); |
| 410 |
| 411 result = handle_->beginRead(&buffer, kNone, &size); |
| 412 EXPECT_EQ(kOk, result); |
| 413 EXPECT_EQ(4u, size); |
| 414 EXPECT_EQ("nce ", ToString(buffer, 4)); |
| 415 |
| 416 handle_->endRead(4); |
| 417 |
| 418 result = handle_->beginRead(&buffer, kNone, &size); |
| 419 EXPECT_EQ(kShouldWait, result); |
| 420 EXPECT_EQ(0u, size); |
| 421 EXPECT_EQ(nullptr, buffer); |
| 422 |
| 423 writer_->Close(); |
| 424 |
| 425 result = handle_->beginRead(&buffer, kNone, &size); |
| 426 EXPECT_EQ(kDone, result); |
| 427 EXPECT_EQ(0u, size); |
| 428 EXPECT_EQ(nullptr, buffer); |
| 429 } |
| 430 |
| 431 TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadWithMultipleData) { |
| 432 writer_->AddData(make_scoped_ptr(new FixedReceivedData("Once "))); |
| 433 writer_->AddData(make_scoped_ptr(new FixedReceivedData("upon "))); |
| 434 |
| 435 Result result; |
| 436 const void* buffer = &result; |
| 437 size_t size = 99; |
| 438 |
| 439 result = handle_->beginRead(&buffer, kNone, &size); |
| 440 EXPECT_EQ(kOk, result); |
| 441 EXPECT_EQ(5u, size); |
| 442 EXPECT_EQ("Once ", ToString(buffer, 5)); |
| 443 |
| 444 handle_->endRead(1); |
| 445 |
| 446 result = handle_->beginRead(&buffer, kNone, &size); |
| 447 EXPECT_EQ(kOk, result); |
| 448 EXPECT_EQ(4u, size); |
| 449 EXPECT_EQ("nce ", ToString(buffer, 4)); |
| 450 |
| 451 handle_->endRead(4); |
| 452 |
| 453 result = handle_->beginRead(&buffer, kNone, &size); |
| 454 EXPECT_EQ(kOk, result); |
| 455 EXPECT_EQ(5u, size); |
| 456 EXPECT_EQ("upon ", ToString(buffer, 5)); |
| 457 |
| 458 handle_->endRead(5); |
| 459 |
| 460 result = handle_->beginRead(&buffer, kNone, &size); |
| 461 EXPECT_EQ(kShouldWait, result); |
| 462 EXPECT_EQ(0u, size); |
| 463 EXPECT_EQ(nullptr, buffer); |
| 464 |
| 465 writer_->Close(); |
| 466 |
| 467 result = handle_->beginRead(&buffer, kNone, &size); |
| 468 EXPECT_EQ(kDone, result); |
| 469 EXPECT_EQ(0u, size); |
| 470 EXPECT_EQ(nullptr, buffer); |
| 471 } |
| 472 |
| 473 TEST(SharedMemoryDataConsumerHandleBackpressureTest, Read) { |
| 474 char buffer[20]; |
| 475 Result result; |
| 476 size_t size; |
| 477 |
| 478 scoped_ptr<Writer> writer; |
| 479 auto handle = make_scoped_ptr( |
| 480 new SharedMemoryDataConsumerHandle(kApplyBackpressure, &writer)); |
| 481 scoped_refptr<Logger> logger(new Logger); |
| 482 writer->AddData( |
| 483 make_scoped_ptr(new LoggingFixedReceivedData("data1", "Once ", logger))); |
| 484 writer->AddData( |
| 485 make_scoped_ptr(new LoggingFixedReceivedData("data2", "upon ", logger))); |
| 486 writer->AddData( |
| 487 make_scoped_ptr(new LoggingFixedReceivedData("data3", "a ", logger))); |
| 488 writer->AddData( |
| 489 make_scoped_ptr(new LoggingFixedReceivedData("data4", "time ", logger))); |
| 490 |
| 491 logger->Add("1"); |
| 492 result = handle->read(buffer, 2, kNone, &size); |
| 493 EXPECT_EQ(kOk, result); |
| 494 EXPECT_EQ(2u, size); |
| 495 logger->Add("2"); |
| 496 result = handle->read(buffer, 5, kNone, &size); |
| 497 EXPECT_EQ(kOk, result); |
| 498 EXPECT_EQ(5u, size); |
| 499 logger->Add("3"); |
| 500 result = handle->read(buffer, 6, kNone, &size); |
| 501 EXPECT_EQ(kOk, result); |
| 502 EXPECT_EQ(6u, size); |
| 503 logger->Add("4"); |
| 504 |
| 505 EXPECT_EQ( |
| 506 "1\n" |
| 507 "2\n" |
| 508 "data1 is destructed.\n" |
| 509 "3\n" |
| 510 "data2 is destructed.\n" |
| 511 "data3 is destructed.\n" |
| 512 "4\n", |
| 513 logger->log()); |
| 514 } |
| 515 |
| 516 TEST(SharedMemoryDataConsumerHandleBackpressureTest, CloseAndReset) { |
| 517 char buffer[20]; |
| 518 Result result; |
| 519 size_t size; |
| 520 |
| 521 scoped_ptr<Writer> writer; |
| 522 auto handle = make_scoped_ptr( |
| 523 new SharedMemoryDataConsumerHandle(kApplyBackpressure, &writer)); |
| 524 scoped_refptr<Logger> logger(new Logger); |
| 525 writer->AddData( |
| 526 make_scoped_ptr(new LoggingFixedReceivedData("data1", "Once ", logger))); |
| 527 writer->AddData( |
| 528 make_scoped_ptr(new LoggingFixedReceivedData("data2", "upon ", logger))); |
| 529 writer->AddData( |
| 530 make_scoped_ptr(new LoggingFixedReceivedData("data3", "a ", logger))); |
| 531 |
| 532 logger->Add("1"); |
| 533 result = handle->read(buffer, 2, kNone, &size); |
| 534 EXPECT_EQ(kOk, result); |
| 535 EXPECT_EQ(2u, size); |
| 536 logger->Add("2"); |
| 537 writer->Close(); |
| 538 logger->Add("3"); |
| 539 handle.reset(); |
| 540 logger->Add("4"); |
| 541 |
| 542 EXPECT_EQ( |
| 543 "1\n" |
| 544 "2\n" |
| 545 "3\n" |
| 546 "data1 is destructed.\n" |
| 547 "data2 is destructed.\n" |
| 548 "data3 is destructed.\n" |
| 549 "4\n", |
| 550 logger->log()); |
| 551 } |
| 552 |
| 553 TEST(SharedMemoryDataConsumerHandleWithoutBackpressureTest, AddData) { |
| 554 scoped_ptr<Writer> writer; |
| 555 auto handle = make_scoped_ptr( |
| 556 new SharedMemoryDataConsumerHandle(kDoNotApplyBackpressure, &writer)); |
| 557 scoped_refptr<Logger> logger(new Logger); |
| 558 |
| 559 logger->Add("1"); |
| 560 writer->AddData( |
| 561 make_scoped_ptr(new LoggingFixedReceivedData("data1", "Once ", logger))); |
| 562 logger->Add("2"); |
| 563 writer->AddData( |
| 564 make_scoped_ptr(new LoggingFixedReceivedData("data2", "upon ", logger))); |
| 565 logger->Add("3"); |
| 566 |
| 567 EXPECT_EQ( |
| 568 "1\n" |
| 569 "data1 is destructed.\n" |
| 570 "2\n" |
| 571 "data2 is destructed.\n" |
| 572 "3\n", |
| 573 logger->log()); |
| 574 } |
| 575 |
| 576 INSTANTIATE_TEST_CASE_P(SharedMemoryDataConsumerHandleTest, |
| 577 SharedMemoryDataConsumerHandleTest, |
| 578 ::testing::Values(kApplyBackpressure, |
| 579 kDoNotApplyBackpressure)); |
| 580 } // namespace |
| 581 |
| 582 } // namespace content |
| OLD | NEW |