// Copyright 2021 The libgav1 Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "examples/file_reader.h" #include #include #include #include #include "examples/file_reader_interface.h" #include "examples/file_reader_test_common.h" #include "gtest/gtest.h" #include "tests/utils.h" namespace libgav1 { namespace { // For use with tests that expect Open() failure to distinguish failure due to // the file contents versus failure due to a missing file. bool FileCanBeRead(const std::string& filename) { FILE* const file = fopen(filename.c_str(), "r"); if (file != nullptr) { fclose(file); return true; } return false; } TEST(FileReaderTest, FailOpen) { EXPECT_EQ(FileReader::Open(""), nullptr); const std::string filename = test_utils::GetTestInputFilePath("ivf-signature-only"); SCOPED_TRACE("Filename: " + filename); EXPECT_TRUE(FileCanBeRead(filename)); EXPECT_EQ(FileReader::Open(filename), nullptr); } TEST(FileReaderTest, Open) { const std::string filenames[] = { test_utils::GetTestInputFilePath("five-frames.ivf"), test_utils::GetTestInputFilePath("ivf-header-and-truncated-frame-header"), test_utils::GetTestInputFilePath("ivf-header-only"), test_utils::GetTestInputFilePath("one-frame-truncated.ivf"), test_utils::GetTestInputFilePath("one-frame.ivf"), }; for (const auto& filename : filenames) { EXPECT_NE(FileReader::Open(filename), nullptr) << "Filename: " << filename; } } TEST_P(FileReaderFailTest, FailRead) { ASSERT_FALSE(reader_->ReadTemporalUnit(&tu_data_, nullptr)); } TEST_P(FileReaderErrorTolerant, ReadThroughEndOfFile) { while (!reader_->IsEndOfFile()) { tu_data_.clear(); ASSERT_TRUE(reader_->ReadTemporalUnit(&tu_data_, nullptr)); ASSERT_GT(tu_data_.size(), 0); } } TEST_P(FileReaderTestNoTimeStamps, ReadThroughEndOfFile) { while (!reader_->IsEndOfFile()) { tu_data_.clear(); ASSERT_TRUE(reader_->ReadTemporalUnit(&tu_data_, nullptr)); } } TEST_P(FileReaderTestWithTimeStamps, ReadThroughEndOfFile) { int64_t timestamp = 0; while (!reader_->IsEndOfFile()) { tu_data_.clear(); ASSERT_TRUE(reader_->ReadTemporalUnit(&tu_data_, ×tamp)); if (!tu_data_.empty()) { last_timestamp_ = timestamp; } } ASSERT_TRUE(tu_data_.empty()); ASSERT_EQ(last_timestamp_, expected_last_timestamp_); } INSTANTIATE_TEST_SUITE_P( FailRead, FileReaderFailTest, testing::Values( FileReaderTestParameters(FileReader::Open, "ivf-header-and-truncated-frame-header"), FileReaderTestParameters(FileReader::Open, "one-frame-truncated.ivf"))); INSTANTIATE_TEST_SUITE_P(ReadThroughEndOfFile, FileReaderErrorTolerant, testing::Values(FileReaderTestParameters( FileReader::Open, "one-frame-truncated.ivf"))); INSTANTIATE_TEST_SUITE_P( ReadThroughEndOfFile, FileReaderTestNoTimeStamps, testing::Values(FileReaderTestParameters(FileReader::Open, "one-frame.ivf"), FileReaderTestParameters(FileReader::Open, "one-frame-large-timestamp.ivf"), FileReaderTestParameters(FileReader::Open, "five-frames.ivf"))); INSTANTIATE_TEST_SUITE_P( ReadThroughEndOfFile, FileReaderTestWithTimeStamps, testing::Values( FileReaderTestWithTimeStampsParameters(FileReader::Open, "one-frame.ivf", 0), FileReaderTestWithTimeStampsParameters(FileReader::Open, "one-frame-large-timestamp.ivf", 4294967296), FileReaderTestWithTimeStampsParameters(FileReader::Open, "five-frames.ivf", 4))); } // namespace } // namespace libgav1