| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/media/playback/mediaplayer/demux/sliding_buffer.h" |
| |
| #include "gtest/gtest.h" |
| |
| namespace media_player { |
| namespace { |
| |
| void FillBlock(SlidingBuffer::Block block) { |
| for (size_t i = 0; i < block.size; ++i) { |
| block.buffer[i] = uint8_t((i + block.start) % 256); |
| } |
| } |
| |
| void FillBlocks(std::vector<SlidingBuffer::Block> blocks) { |
| for (const auto& block : blocks) { |
| FillBlock(block); |
| } |
| } |
| |
| void CheckRange(SlidingBuffer& buffer, size_t start, size_t size, |
| size_t expected_read_size) { |
| std::vector<uint8_t> store(expected_read_size, 0); |
| size_t bytes_read = buffer.Read(start, store.data(), size); |
| EXPECT_EQ(bytes_read, expected_read_size); |
| for (size_t i = 0; i < bytes_read; ++i) { |
| EXPECT_EQ(store[i], (i + start) % 256); |
| } |
| } |
| |
| TEST(SlidingBuffer, Sanity) { |
| SlidingBuffer under_test(100); |
| |
| auto blocks = under_test.Slide(0, 50); |
| EXPECT_EQ(blocks.size(), 1u); |
| EXPECT_EQ(blocks[0].start, 0u); |
| EXPECT_EQ(blocks[0].size, 50u); |
| } |
| |
| TEST(SlidingBuffer, SlideForward) { |
| SlidingBuffer under_test(100); |
| |
| auto blocks = under_test.Slide(400, 50); |
| EXPECT_EQ(blocks.size(), 1u); |
| EXPECT_EQ(blocks[0].start, 400u); |
| EXPECT_EQ(blocks[0].size, 50u); |
| } |
| |
| TEST(SlidingBuffer, SlideReverse) { |
| SlidingBuffer under_test(100); |
| |
| under_test.Slide(400, 50); |
| auto blocks = under_test.Slide(300, 50); |
| EXPECT_EQ(blocks.size(), 1u); |
| EXPECT_EQ(blocks[0].start, 300u); |
| EXPECT_EQ(blocks[0].size, 50u); |
| } |
| |
| TEST(SlidingBuffer, SlideReverseWithGap) { |
| SlidingBuffer under_test(100); |
| |
| under_test.Slide(400, 50); |
| auto blocks = under_test.Slide(390, 50); |
| EXPECT_EQ(blocks.size(), 1u); |
| EXPECT_EQ(blocks[0].start, 390u); |
| EXPECT_EQ(blocks[0].size, 10u); |
| } |
| |
| TEST(SlidingBuffer, SlideForwardWithGap) { |
| SlidingBuffer under_test(100); |
| |
| under_test.Slide(400, 50); |
| auto blocks = under_test.Slide(410, 50); |
| EXPECT_EQ(blocks.size(), 1u); |
| EXPECT_EQ(blocks[0].start, 450u); |
| EXPECT_EQ(blocks[0].size, 10u); |
| } |
| |
| TEST(SlidingBuffer, Integrity) { |
| SlidingBuffer under_test(100); |
| FillBlocks(under_test.Slide(400, 100)); |
| FillBlocks(under_test.Slide(500, 10)); |
| CheckRange(under_test, 420, 520, 90); |
| } |
| |
| } // namespace |
| } // namespace media_player |