| // Copyright (c) 2016 The WebM project authors. All Rights Reserved. | |
| // | |
| // Use of this source code is governed by a BSD-style license | |
| // that can be found in the LICENSE file in the root of the source | |
| // tree. An additional intellectual property rights grant can be found | |
| // in the file PATENTS. All contributing project authors may | |
| // be found in the AUTHORS file in the root of the source tree. | |
| #include "src/parser_utils.h" | |
| #include <cstdint> | |
| #include <limits> | |
| #include <memory> | |
| #include "gtest/gtest.h" | |
| #include "test_utils/limited_reader.h" | |
| #include "webm/buffer_reader.h" | |
| #include "webm/reader.h" | |
| #include "webm/status.h" | |
| using webm::BufferReader; | |
| using webm::LimitedReader; | |
| using webm::Reader; | |
| using webm::Status; | |
| namespace { | |
| class ParserUtilsTest : public testing::Test {}; | |
| TEST_F(ParserUtilsTest, ReadByte) { | |
| LimitedReader reader( | |
| std::unique_ptr<Reader>(new BufferReader({0x12, 0x34, 0x56, 0x78}))); | |
| Status status; | |
| std::uint8_t byte; | |
| status = ReadByte(&reader, &byte); | |
| EXPECT_EQ(Status::kOkCompleted, status.code); | |
| EXPECT_EQ(0x12, byte); | |
| status = ReadByte(&reader, &byte); | |
| EXPECT_EQ(Status::kOkCompleted, status.code); | |
| EXPECT_EQ(0x34, byte); | |
| status = ReadByte(&reader, &byte); | |
| EXPECT_EQ(Status::kOkCompleted, status.code); | |
| EXPECT_EQ(0x56, byte); | |
| reader.set_total_read_limit(0); | |
| status = ReadByte(&reader, &byte); | |
| EXPECT_EQ(Status::kWouldBlock, status.code); | |
| EXPECT_EQ(0x56, byte); | |
| reader.set_total_read_limit(std::numeric_limits<std::size_t>::max()); | |
| status = ReadByte(&reader, &byte); | |
| EXPECT_EQ(Status::kOkCompleted, status.code); | |
| EXPECT_EQ(0x78, byte); | |
| status = ReadByte(&reader, &byte); | |
| EXPECT_EQ(Status::kEndOfFile, status.code); | |
| EXPECT_EQ(0x78, byte); | |
| } | |
| TEST_F(ParserUtilsTest, AccumulateIntegerBytes) { | |
| LimitedReader reader( | |
| std::unique_ptr<Reader>(new BufferReader({0x12, 0x34, 0x56, 0x78}))); | |
| std::uint32_t integer = 0; | |
| Status status; | |
| std::uint64_t num_bytes_actually_read; | |
| reader.set_total_read_limit(1); | |
| status = | |
| AccumulateIntegerBytes(4, &reader, &integer, &num_bytes_actually_read); | |
| EXPECT_EQ(Status::kWouldBlock, status.code); | |
| EXPECT_EQ(static_cast<std::uint64_t>(1), num_bytes_actually_read); | |
| EXPECT_EQ(static_cast<std::uint32_t>(0x12), integer); | |
| reader.set_total_read_limit(std::numeric_limits<std::size_t>::max()); | |
| status = | |
| AccumulateIntegerBytes(3, &reader, &integer, &num_bytes_actually_read); | |
| EXPECT_EQ(Status::kOkCompleted, status.code); | |
| EXPECT_EQ(static_cast<std::uint64_t>(3), num_bytes_actually_read); | |
| EXPECT_EQ(static_cast<std::uint32_t>(0x12345678), integer); | |
| // Make sure calling with num_bytes_remaining == 0 is a no-op. | |
| status = | |
| AccumulateIntegerBytes(0, &reader, &integer, &num_bytes_actually_read); | |
| EXPECT_EQ(Status::kOkCompleted, status.code); | |
| EXPECT_EQ(static_cast<std::uint64_t>(0), num_bytes_actually_read); | |
| EXPECT_EQ(static_cast<std::uint32_t>(0x12345678), integer); | |
| status = | |
| AccumulateIntegerBytes(4, &reader, &integer, &num_bytes_actually_read); | |
| EXPECT_EQ(Status::kEndOfFile, status.code); | |
| EXPECT_EQ(static_cast<std::uint64_t>(0), num_bytes_actually_read); | |
| EXPECT_EQ(static_cast<std::uint32_t>(0x12345678), integer); | |
| } | |
| } // namespace |