1*09537850SAkhilesh Sanikop // Copyright 2021 The libgav1 Authors
2*09537850SAkhilesh Sanikop //
3*09537850SAkhilesh Sanikop // Licensed under the Apache License, Version 2.0 (the "License");
4*09537850SAkhilesh Sanikop // you may not use this file except in compliance with the License.
5*09537850SAkhilesh Sanikop // You may obtain a copy of the License at
6*09537850SAkhilesh Sanikop //
7*09537850SAkhilesh Sanikop // http://www.apache.org/licenses/LICENSE-2.0
8*09537850SAkhilesh Sanikop //
9*09537850SAkhilesh Sanikop // Unless required by applicable law or agreed to in writing, software
10*09537850SAkhilesh Sanikop // distributed under the License is distributed on an "AS IS" BASIS,
11*09537850SAkhilesh Sanikop // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*09537850SAkhilesh Sanikop // See the License for the specific language governing permissions and
13*09537850SAkhilesh Sanikop // limitations under the License.
14*09537850SAkhilesh Sanikop
15*09537850SAkhilesh Sanikop #include "examples/file_reader.h"
16*09537850SAkhilesh Sanikop
17*09537850SAkhilesh Sanikop #include <cstdint>
18*09537850SAkhilesh Sanikop #include <cstdio>
19*09537850SAkhilesh Sanikop #include <memory>
20*09537850SAkhilesh Sanikop #include <vector>
21*09537850SAkhilesh Sanikop
22*09537850SAkhilesh Sanikop #include "examples/file_reader_interface.h"
23*09537850SAkhilesh Sanikop #include "examples/file_reader_test_common.h"
24*09537850SAkhilesh Sanikop #include "gtest/gtest.h"
25*09537850SAkhilesh Sanikop #include "tests/utils.h"
26*09537850SAkhilesh Sanikop
27*09537850SAkhilesh Sanikop namespace libgav1 {
28*09537850SAkhilesh Sanikop namespace {
29*09537850SAkhilesh Sanikop
30*09537850SAkhilesh Sanikop // For use with tests that expect Open() failure to distinguish failure due to
31*09537850SAkhilesh Sanikop // the file contents versus failure due to a missing file.
FileCanBeRead(const std::string & filename)32*09537850SAkhilesh Sanikop bool FileCanBeRead(const std::string& filename) {
33*09537850SAkhilesh Sanikop FILE* const file = fopen(filename.c_str(), "r");
34*09537850SAkhilesh Sanikop if (file != nullptr) {
35*09537850SAkhilesh Sanikop fclose(file);
36*09537850SAkhilesh Sanikop return true;
37*09537850SAkhilesh Sanikop }
38*09537850SAkhilesh Sanikop return false;
39*09537850SAkhilesh Sanikop }
40*09537850SAkhilesh Sanikop
TEST(FileReaderTest,FailOpen)41*09537850SAkhilesh Sanikop TEST(FileReaderTest, FailOpen) {
42*09537850SAkhilesh Sanikop EXPECT_EQ(FileReader::Open(""), nullptr);
43*09537850SAkhilesh Sanikop const std::string filename =
44*09537850SAkhilesh Sanikop test_utils::GetTestInputFilePath("ivf-signature-only");
45*09537850SAkhilesh Sanikop SCOPED_TRACE("Filename: " + filename);
46*09537850SAkhilesh Sanikop EXPECT_TRUE(FileCanBeRead(filename));
47*09537850SAkhilesh Sanikop EXPECT_EQ(FileReader::Open(filename), nullptr);
48*09537850SAkhilesh Sanikop }
49*09537850SAkhilesh Sanikop
TEST(FileReaderTest,Open)50*09537850SAkhilesh Sanikop TEST(FileReaderTest, Open) {
51*09537850SAkhilesh Sanikop const std::string filenames[] = {
52*09537850SAkhilesh Sanikop test_utils::GetTestInputFilePath("five-frames.ivf"),
53*09537850SAkhilesh Sanikop test_utils::GetTestInputFilePath("ivf-header-and-truncated-frame-header"),
54*09537850SAkhilesh Sanikop test_utils::GetTestInputFilePath("ivf-header-only"),
55*09537850SAkhilesh Sanikop test_utils::GetTestInputFilePath("one-frame-truncated.ivf"),
56*09537850SAkhilesh Sanikop test_utils::GetTestInputFilePath("one-frame.ivf"),
57*09537850SAkhilesh Sanikop };
58*09537850SAkhilesh Sanikop for (const auto& filename : filenames) {
59*09537850SAkhilesh Sanikop EXPECT_NE(FileReader::Open(filename), nullptr) << "Filename: " << filename;
60*09537850SAkhilesh Sanikop }
61*09537850SAkhilesh Sanikop }
62*09537850SAkhilesh Sanikop
TEST_P(FileReaderFailTest,FailRead)63*09537850SAkhilesh Sanikop TEST_P(FileReaderFailTest, FailRead) {
64*09537850SAkhilesh Sanikop ASSERT_FALSE(reader_->ReadTemporalUnit(&tu_data_, nullptr));
65*09537850SAkhilesh Sanikop }
66*09537850SAkhilesh Sanikop
TEST_P(FileReaderErrorTolerant,ReadThroughEndOfFile)67*09537850SAkhilesh Sanikop TEST_P(FileReaderErrorTolerant, ReadThroughEndOfFile) {
68*09537850SAkhilesh Sanikop while (!reader_->IsEndOfFile()) {
69*09537850SAkhilesh Sanikop tu_data_.clear();
70*09537850SAkhilesh Sanikop ASSERT_TRUE(reader_->ReadTemporalUnit(&tu_data_, nullptr));
71*09537850SAkhilesh Sanikop ASSERT_GT(tu_data_.size(), 0);
72*09537850SAkhilesh Sanikop }
73*09537850SAkhilesh Sanikop }
74*09537850SAkhilesh Sanikop
TEST_P(FileReaderTestNoTimeStamps,ReadThroughEndOfFile)75*09537850SAkhilesh Sanikop TEST_P(FileReaderTestNoTimeStamps, ReadThroughEndOfFile) {
76*09537850SAkhilesh Sanikop while (!reader_->IsEndOfFile()) {
77*09537850SAkhilesh Sanikop tu_data_.clear();
78*09537850SAkhilesh Sanikop ASSERT_TRUE(reader_->ReadTemporalUnit(&tu_data_, nullptr));
79*09537850SAkhilesh Sanikop }
80*09537850SAkhilesh Sanikop }
81*09537850SAkhilesh Sanikop
TEST_P(FileReaderTestWithTimeStamps,ReadThroughEndOfFile)82*09537850SAkhilesh Sanikop TEST_P(FileReaderTestWithTimeStamps, ReadThroughEndOfFile) {
83*09537850SAkhilesh Sanikop int64_t timestamp = 0;
84*09537850SAkhilesh Sanikop while (!reader_->IsEndOfFile()) {
85*09537850SAkhilesh Sanikop tu_data_.clear();
86*09537850SAkhilesh Sanikop ASSERT_TRUE(reader_->ReadTemporalUnit(&tu_data_, ×tamp));
87*09537850SAkhilesh Sanikop if (!tu_data_.empty()) {
88*09537850SAkhilesh Sanikop last_timestamp_ = timestamp;
89*09537850SAkhilesh Sanikop }
90*09537850SAkhilesh Sanikop }
91*09537850SAkhilesh Sanikop ASSERT_TRUE(tu_data_.empty());
92*09537850SAkhilesh Sanikop ASSERT_EQ(last_timestamp_, expected_last_timestamp_);
93*09537850SAkhilesh Sanikop }
94*09537850SAkhilesh Sanikop
95*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(
96*09537850SAkhilesh Sanikop FailRead, FileReaderFailTest,
97*09537850SAkhilesh Sanikop testing::Values(
98*09537850SAkhilesh Sanikop FileReaderTestParameters(FileReader::Open,
99*09537850SAkhilesh Sanikop "ivf-header-and-truncated-frame-header"),
100*09537850SAkhilesh Sanikop FileReaderTestParameters(FileReader::Open, "one-frame-truncated.ivf")));
101*09537850SAkhilesh Sanikop
102*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(ReadThroughEndOfFile, FileReaderErrorTolerant,
103*09537850SAkhilesh Sanikop testing::Values(FileReaderTestParameters(
104*09537850SAkhilesh Sanikop FileReader::Open, "one-frame-truncated.ivf")));
105*09537850SAkhilesh Sanikop
106*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(
107*09537850SAkhilesh Sanikop ReadThroughEndOfFile, FileReaderTestNoTimeStamps,
108*09537850SAkhilesh Sanikop testing::Values(FileReaderTestParameters(FileReader::Open, "one-frame.ivf"),
109*09537850SAkhilesh Sanikop FileReaderTestParameters(FileReader::Open,
110*09537850SAkhilesh Sanikop "one-frame-large-timestamp.ivf"),
111*09537850SAkhilesh Sanikop FileReaderTestParameters(FileReader::Open,
112*09537850SAkhilesh Sanikop "five-frames.ivf")));
113*09537850SAkhilesh Sanikop
114*09537850SAkhilesh Sanikop INSTANTIATE_TEST_SUITE_P(
115*09537850SAkhilesh Sanikop ReadThroughEndOfFile, FileReaderTestWithTimeStamps,
116*09537850SAkhilesh Sanikop testing::Values(
117*09537850SAkhilesh Sanikop FileReaderTestWithTimeStampsParameters(FileReader::Open,
118*09537850SAkhilesh Sanikop "one-frame.ivf", 0),
119*09537850SAkhilesh Sanikop FileReaderTestWithTimeStampsParameters(FileReader::Open,
120*09537850SAkhilesh Sanikop "one-frame-large-timestamp.ivf",
121*09537850SAkhilesh Sanikop 4294967296),
122*09537850SAkhilesh Sanikop FileReaderTestWithTimeStampsParameters(FileReader::Open,
123*09537850SAkhilesh Sanikop "five-frames.ivf", 4)));
124*09537850SAkhilesh Sanikop
125*09537850SAkhilesh Sanikop } // namespace
126*09537850SAkhilesh Sanikop } // namespace libgav1
127