Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(187)

Side by Side Diff: media/blink/multibuffer_unittest.cc

Issue 1829163002: Lazily prune the multibuffer block cache. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: test added + moved FakeSingleThreadTaskRunner to media/base Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
226 void Advance() { 229 void Advance() {
227 CHECK(writers.size()); 230 CHECK(writers.size());
228 writers[rnd_.Rand() % writers.size()]->Advance(); 231 writers[rnd_.Rand() % writers.size()]->Advance();
229 } 232 }
230 233
231 bool AdvanceAll() { 234 bool AdvanceAll() {
232 bool advanced = false; 235 bool advanced = false;
233 for (size_t i = 0; i < writers.size(); i++) { 236 for (size_t i = 0; i < writers.size(); i++) {
234 advanced |= writers[i]->Advance(); 237 advanced |= writers[i]->Advance();
235 } 238 }
236 multibuffer_.CheckLRUState(); 239 multibuffer_.CheckLRUState();
237 return advanced; 240 return advanced;
238 } 241 }
239 242
240 protected: 243 protected:
241 TestRandom rnd_; 244 TestRandom rnd_;
245 base::SimpleTestTickClock clock_;
246 scoped_refptr<FakeSingleThreadTaskRunner> task_runner_;
242 scoped_refptr<MultiBuffer::GlobalLRU> lru_; 247 scoped_refptr<MultiBuffer::GlobalLRU> lru_;
243 TestMultiBuffer multibuffer_; 248 TestMultiBuffer multibuffer_;
249
250 // TODO(hubbe): Make MultiBufferReader take a task_runner_
244 base::MessageLoop message_loop_; 251 base::MessageLoop message_loop_;
245 }; 252 };
246 253
247 TEST_F(MultiBufferTest, ReadAll) { 254 TEST_F(MultiBufferTest, ReadAll) {
248 multibuffer_.SetMaxWriters(1); 255 multibuffer_.SetMaxWriters(1);
249 size_t pos = 0; 256 size_t pos = 0;
250 size_t end = 10000; 257 size_t end = 10000;
251 multibuffer_.SetFileSize(10000); 258 multibuffer_.SetFileSize(10000);
252 multibuffer_.SetMustReadWholeFile(true); 259 multibuffer_.SetMustReadWholeFile(true);
253 MultiBufferReader reader(&multibuffer_, pos, end, 260 MultiBufferReader reader(&multibuffer_, pos, end,
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
382 lru_->Prune(3); 389 lru_->Prune(3);
383 current_size -= 3; 390 current_size -= 3;
384 EXPECT_EQ(current_size, lru_->Size()); 391 EXPECT_EQ(current_size, lru_->Size());
385 lru_->Prune(3); 392 lru_->Prune(3);
386 current_size -= 3; 393 current_size -= 3;
387 EXPECT_EQ(current_size, lru_->Size()); 394 EXPECT_EQ(current_size, lru_->Size());
388 lru_->Prune(1000); 395 lru_->Prune(1000);
389 EXPECT_EQ(0, lru_->Size()); 396 EXPECT_EQ(0, lru_->Size());
390 } 397 }
391 398
399 TEST_F(MultiBufferTest, LRUTestExpirationTest) {
400 int64_t max_size = 17;
401 int64_t current_size = 0;
402 lru_->IncrementMaxSize(max_size);
403
404 multibuffer_.SetMaxWriters(1);
405 size_t pos = 0;
406 size_t end = 10000;
407 multibuffer_.SetFileSize(10000);
408 MultiBufferReader reader(&multibuffer_, pos, end,
409 base::Callback<void(int64_t, int64_t)>());
410 reader.SetPreload(10000, 10000);
411 // Note, no pinning, all data should end up in LRU.
412 EXPECT_EQ(current_size, lru_->Size());
413 current_size += max_size;
414 while (AdvanceAll()) {
415 }
416 EXPECT_EQ(current_size, lru_->Size());
417 EXPECT_FALSE(lru_->Pruneable());
418
419 // Make 3 packets pruneable.
420 lru_->IncrementMaxSize(-3);
421 max_size -= 3;
422
423 // There should be no change after 29 seconds.
424 task_runner_->Sleep(base::TimeDelta::FromSeconds(29));
425 EXPECT_EQ(current_size, lru_->Size());
426 EXPECT_TRUE(lru_->Pruneable());
427
428 // After 30 seconds, pruning should have happened.
429 task_runner_->Sleep(base::TimeDelta::FromSeconds(30));
430 current_size -= 3;
431 EXPECT_EQ(current_size, lru_->Size());
432 EXPECT_FALSE(lru_->Pruneable());
433
434 // Make the rest of the packets pruneable.
435 lru_->IncrementMaxSize(-max_size);
436
437 // After another 30 seconds, everything should be pruned.
438 task_runner_->Sleep(base::TimeDelta::FromSeconds(30));
439 EXPECT_EQ(0, lru_->Size());
440 EXPECT_FALSE(lru_->Pruneable());
441 }
442
392 class ReadHelper { 443 class ReadHelper {
393 public: 444 public:
394 ReadHelper(size_t end, 445 ReadHelper(size_t end,
395 size_t max_read_size, 446 size_t max_read_size,
396 MultiBuffer* multibuffer, 447 MultiBuffer* multibuffer,
397 TestRandom* rnd) 448 TestRandom* rnd)
398 : pos_(0), 449 : pos_(0),
399 end_(end), 450 end_(end),
400 max_read_size_(max_read_size), 451 max_read_size_(max_read_size),
401 read_size_(0), 452 read_size_(0),
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
508 multibuffer_.CheckLRUState(); 559 multibuffer_.CheckLRUState();
509 } 560 }
510 multibuffer_.CheckPresentState(); 561 multibuffer_.CheckPresentState();
511 while (!read_helpers.empty()) { 562 while (!read_helpers.empty()) {
512 delete read_helpers.back(); 563 delete read_helpers.back();
513 read_helpers.pop_back(); 564 read_helpers.pop_back();
514 } 565 }
515 } 566 }
516 567
517 } // namespace media 568 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698