1 // Copyright (c) 2016 The WebM project authors. All Rights Reserved. 2 // 3 // Use of this source code is governed by a BSD-style license 4 // that can be found in the LICENSE file in the root of the source 5 // tree. An additional intellectual property rights grant can be found 6 // in the file PATENTS. All contributing project authors may 7 // be found in the AUTHORS file in the root of the source tree. 8 #ifndef TEST_UTILS_PARSER_TEST_H_ 9 #define TEST_UTILS_PARSER_TEST_H_ 10 11 #include <cstdint> 12 #include <new> 13 #include <vector> 14 15 #include "gmock/gmock.h" 16 #include "gtest/gtest.h" 17 18 #include "test_utils/limited_reader.h" 19 #include "test_utils/mock_callback.h" 20 #include "webm/buffer_reader.h" 21 #include "webm/reader.h" 22 #include "webm/status.h" 23 24 namespace webm { 25 26 // Base class for unit tests that test an instance of the Parser inteface. The 27 // template parameter T is the parser class being tested. 28 template <typename T> 29 class ParserTest : public testing::Test { 30 public: 31 // Sets the reader's internal buffer to the given buffer. SetReaderData(std::vector<std::uint8_t> data)32 virtual void SetReaderData(std::vector<std::uint8_t> data) { 33 reader_ = BufferReader(std::move(data)); 34 } 35 36 // Destroys and recreates the parser, forwarding the arguments to the 37 // constructor. This is primarily useful for tests that require the parser to 38 // have different constructor parameters. 39 template <typename... Args> ResetParser(Args &&...args)40 void ResetParser(Args&&... args) { 41 parser_.~T(); 42 new (&parser_) T(std::forward<Args>(args)...); 43 } 44 45 // Calls Feed() on the parser, making sure it completes successfully and reads 46 // size number of bytes. ParseAndVerify(std::uint64_t size)47 virtual void ParseAndVerify(std::uint64_t size) { 48 std::uint64_t num_bytes_read = 0; 49 const Status status = parser_.Feed(&callback_, &reader_, &num_bytes_read); 50 ASSERT_EQ(Status::kOkCompleted, status.code); 51 ASSERT_EQ(size, num_bytes_read); 52 } 53 54 // Calls Feed() on the parser, making sure it completes successfully and reads 55 // all the data available in the reader. ParseAndVerify()56 virtual void ParseAndVerify() { ParseAndVerify(reader_.size()); } 57 58 // Similar to ParseAndVerify(), but instead artificially limits the reader to 59 // providing one byte per call to Feed(). If Feed() returns 60 // Status::kWouldBlock or Status::kOkPartial, Feed() will be called again 61 // (feeding it another byte). IncrementalParseAndVerify()62 virtual void IncrementalParseAndVerify() { 63 const std::uint64_t expected_num_bytes_read = reader_.size(); 64 65 webm::LimitedReader limited_reader( 66 std::unique_ptr<webm::Reader>(new BufferReader(std::move(reader_)))); 67 68 Status status; 69 std::uint64_t num_bytes_read = 0; 70 do { 71 limited_reader.set_total_read_skip_limit(1); 72 std::uint64_t local_num_bytes_read = 0; 73 status = parser_.Feed(&callback_, &limited_reader, &local_num_bytes_read); 74 num_bytes_read += local_num_bytes_read; 75 const std::uint64_t kMinBytesRead = 1; 76 ASSERT_GE(kMinBytesRead, local_num_bytes_read); 77 } while (status.code == Status::kWouldBlock || 78 status.code == Status::kOkPartial); 79 80 ASSERT_EQ(Status::kOkCompleted, status.code); 81 ASSERT_EQ(expected_num_bytes_read, num_bytes_read); 82 } 83 84 // Calls Feed() on the parser, making sure it returns the expected status 85 // code. ParseAndExpectResult(Status::Code expected)86 virtual void ParseAndExpectResult(Status::Code expected) { 87 std::uint64_t num_bytes_read = 0; 88 const Status status = parser_.Feed(&callback_, &reader_, &num_bytes_read); 89 ASSERT_EQ(expected, status.code); 90 } 91 92 protected: 93 // These members are protected (not private) so unit tests have access to 94 // them. This is intentional. 95 96 // The parser that the unit tests will be testing. 97 T parser_; 98 99 // The callback that is used during parsing. 100 testing::NiceMock<MockCallback> callback_; 101 102 // The reader used for feeding data into the parser. 103 BufferReader reader_; 104 }; 105 106 } // namespace webm 107 108 #endif // TEST_UTILS_PARSER_TEST_H_ 109