| 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 <stddef.h> | 5 #include <stddef.h> |
| 6 #include <stdint.h> | 6 #include <stdint.h> |
| 7 | 7 |
| 8 #include <deque> | 8 #include <deque> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| 11 | 11 |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/callback_helpers.h" | 13 #include "base/callback_helpers.h" |
| 14 #include "base/message_loop/message_loop.h" | 14 #include "base/message_loop/message_loop.h" |
| 15 #include "base/test/simple_test_tick_clock.h" |
| 16 #include "media/base/fake_single_thread_task_runner.h" |
| 15 #include "media/base/test_random.h" | 17 #include "media/base/test_random.h" |
| 16 #include "media/blink/multibuffer.h" | 18 #include "media/blink/multibuffer.h" |
| 17 #include "media/blink/multibuffer_reader.h" | 19 #include "media/blink/multibuffer_reader.h" |
| 18 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
| 19 | 21 |
| 20 const int kBlockSizeShift = 8; | 22 const int kBlockSizeShift = 8; |
| 21 const size_t kBlockSize = 1UL << kBlockSizeShift; | 23 const size_t kBlockSize = 1UL << kBlockSizeShift; |
| 22 | 24 |
| 23 namespace media { | 25 namespace media { |
| 24 | 26 |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 int32_t max_blocks_after_defer_; | 215 int32_t max_blocks_after_defer_; |
| 214 bool must_read_whole_file_; | 216 bool must_read_whole_file_; |
| 215 int32_t writers_created_; | 217 int32_t writers_created_; |
| 216 TestRandom* rnd_; | 218 TestRandom* rnd_; |
| 217 }; | 219 }; |
| 218 | 220 |
| 219 class MultiBufferTest : public testing::Test { | 221 class MultiBufferTest : public testing::Test { |
| 220 public: | 222 public: |
| 221 MultiBufferTest() | 223 MultiBufferTest() |
| 222 : rnd_(42), | 224 : rnd_(42), |
| 223 lru_(new MultiBuffer::GlobalLRU()), | 225 task_runner_(new FakeSingleThreadTaskRunner(&clock_)), |
| 226 lru_(new MultiBuffer::GlobalLRU(task_runner_)), |
| 224 multibuffer_(kBlockSizeShift, lru_, &rnd_) {} | 227 multibuffer_(kBlockSizeShift, lru_, &rnd_) {} |
| 225 | 228 |
| 229 void TearDown() override { |
| 230 // Make sure we have nothing left to prune. |
| 231 lru_->Prune(1000000); |
| 232 // Run the outstanding callback to make sure everything is freed. |
| 233 task_runner_->Sleep(base::TimeDelta::FromSeconds(30)); |
| 234 } |
| 235 |
| 226 void Advance() { | 236 void Advance() { |
| 227 CHECK(writers.size()); | 237 CHECK(writers.size()); |
| 228 writers[rnd_.Rand() % writers.size()]->Advance(); | 238 writers[rnd_.Rand() % writers.size()]->Advance(); |
| 229 } | 239 } |
| 230 | 240 |
| 231 bool AdvanceAll() { | 241 bool AdvanceAll() { |
| 232 bool advanced = false; | 242 bool advanced = false; |
| 233 for (size_t i = 0; i < writers.size(); i++) { | 243 for (size_t i = 0; i < writers.size(); i++) { |
| 234 advanced |= writers[i]->Advance(); | 244 advanced |= writers[i]->Advance(); |
| 235 } | 245 } |
| 236 multibuffer_.CheckLRUState(); | 246 multibuffer_.CheckLRUState(); |
| 237 return advanced; | 247 return advanced; |
| 238 } | 248 } |
| 239 | 249 |
| 240 protected: | 250 protected: |
| 241 TestRandom rnd_; | 251 TestRandom rnd_; |
| 252 base::SimpleTestTickClock clock_; |
| 253 scoped_refptr<FakeSingleThreadTaskRunner> task_runner_; |
| 242 scoped_refptr<MultiBuffer::GlobalLRU> lru_; | 254 scoped_refptr<MultiBuffer::GlobalLRU> lru_; |
| 243 TestMultiBuffer multibuffer_; | 255 TestMultiBuffer multibuffer_; |
| 256 |
| 257 // TODO(hubbe): Make MultiBufferReader take a task_runner_ |
| 244 base::MessageLoop message_loop_; | 258 base::MessageLoop message_loop_; |
| 245 }; | 259 }; |
| 246 | 260 |
| 247 TEST_F(MultiBufferTest, ReadAll) { | 261 TEST_F(MultiBufferTest, ReadAll) { |
| 248 multibuffer_.SetMaxWriters(1); | 262 multibuffer_.SetMaxWriters(1); |
| 249 size_t pos = 0; | 263 size_t pos = 0; |
| 250 size_t end = 10000; | 264 size_t end = 10000; |
| 251 multibuffer_.SetFileSize(10000); | 265 multibuffer_.SetFileSize(10000); |
| 252 multibuffer_.SetMustReadWholeFile(true); | 266 multibuffer_.SetMustReadWholeFile(true); |
| 253 MultiBufferReader reader(&multibuffer_, pos, end, | 267 MultiBufferReader reader(&multibuffer_, pos, end, |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 lru_->Prune(3); | 396 lru_->Prune(3); |
| 383 current_size -= 3; | 397 current_size -= 3; |
| 384 EXPECT_EQ(current_size, lru_->Size()); | 398 EXPECT_EQ(current_size, lru_->Size()); |
| 385 lru_->Prune(3); | 399 lru_->Prune(3); |
| 386 current_size -= 3; | 400 current_size -= 3; |
| 387 EXPECT_EQ(current_size, lru_->Size()); | 401 EXPECT_EQ(current_size, lru_->Size()); |
| 388 lru_->Prune(1000); | 402 lru_->Prune(1000); |
| 389 EXPECT_EQ(0, lru_->Size()); | 403 EXPECT_EQ(0, lru_->Size()); |
| 390 } | 404 } |
| 391 | 405 |
| 406 TEST_F(MultiBufferTest, LRUTestExpirationTest) { |
| 407 int64_t max_size = 17; |
| 408 int64_t current_size = 0; |
| 409 lru_->IncrementMaxSize(max_size); |
| 410 |
| 411 multibuffer_.SetMaxWriters(1); |
| 412 size_t pos = 0; |
| 413 size_t end = 10000; |
| 414 multibuffer_.SetFileSize(10000); |
| 415 MultiBufferReader reader(&multibuffer_, pos, end, |
| 416 base::Callback<void(int64_t, int64_t)>()); |
| 417 reader.SetPreload(10000, 10000); |
| 418 // Note, no pinning, all data should end up in LRU. |
| 419 EXPECT_EQ(current_size, lru_->Size()); |
| 420 current_size += max_size; |
| 421 while (AdvanceAll()) { |
| 422 } |
| 423 EXPECT_EQ(current_size, lru_->Size()); |
| 424 EXPECT_FALSE(lru_->Pruneable()); |
| 425 |
| 426 // Make 3 packets pruneable. |
| 427 lru_->IncrementMaxSize(-3); |
| 428 max_size -= 3; |
| 429 |
| 430 // There should be no change after 29 seconds. |
| 431 task_runner_->Sleep(base::TimeDelta::FromSeconds(29)); |
| 432 EXPECT_EQ(current_size, lru_->Size()); |
| 433 EXPECT_TRUE(lru_->Pruneable()); |
| 434 |
| 435 // After 30 seconds, pruning should have happened. |
| 436 task_runner_->Sleep(base::TimeDelta::FromSeconds(30)); |
| 437 current_size -= 3; |
| 438 EXPECT_EQ(current_size, lru_->Size()); |
| 439 EXPECT_FALSE(lru_->Pruneable()); |
| 440 |
| 441 // Make the rest of the packets pruneable. |
| 442 lru_->IncrementMaxSize(-max_size); |
| 443 |
| 444 // After another 30 seconds, everything should be pruned. |
| 445 task_runner_->Sleep(base::TimeDelta::FromSeconds(30)); |
| 446 EXPECT_EQ(0, lru_->Size()); |
| 447 EXPECT_FALSE(lru_->Pruneable()); |
| 448 } |
| 449 |
| 392 class ReadHelper { | 450 class ReadHelper { |
| 393 public: | 451 public: |
| 394 ReadHelper(size_t end, | 452 ReadHelper(size_t end, |
| 395 size_t max_read_size, | 453 size_t max_read_size, |
| 396 MultiBuffer* multibuffer, | 454 MultiBuffer* multibuffer, |
| 397 TestRandom* rnd) | 455 TestRandom* rnd) |
| 398 : pos_(0), | 456 : pos_(0), |
| 399 end_(end), | 457 end_(end), |
| 400 max_read_size_(max_read_size), | 458 max_read_size_(max_read_size), |
| 401 read_size_(0), | 459 read_size_(0), |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 508 multibuffer_.CheckLRUState(); | 566 multibuffer_.CheckLRUState(); |
| 509 } | 567 } |
| 510 multibuffer_.CheckPresentState(); | 568 multibuffer_.CheckPresentState(); |
| 511 while (!read_helpers.empty()) { | 569 while (!read_helpers.empty()) { |
| 512 delete read_helpers.back(); | 570 delete read_helpers.back(); |
| 513 read_helpers.pop_back(); | 571 read_helpers.pop_back(); |
| 514 } | 572 } |
| 515 } | 573 } |
| 516 | 574 |
| 517 } // namespace media | 575 } // namespace media |
| OLD | NEW |