Change CharReader to FileReader

Instead of having multiple char readers, one for strings and
one for files, just have one for files and use memory files
when testing.

Change-Id: Id1a2230046ba540ddf69ca10edb3edc74d2419b6
This commit is contained in:
Aaron Vaage 2018-01-02 16:35:38 -08:00
parent db74d6756e
commit 9e7b5c1ca9
7 changed files with 212 additions and 96 deletions

View File

@ -77,6 +77,13 @@ int64_t MemoryFile::Read(void* buffer, uint64_t length) {
} }
int64_t MemoryFile::Write(const void* buffer, uint64_t length) { int64_t MemoryFile::Write(const void* buffer, uint64_t length) {
// If length is zero, we won't resize the buffer and it is possible for
// |position| to equal the length of the buffer. This will cause a segfault
// when indexing into the buffer for the memcpy.
if (length == 0) {
return 0;
}
const uint64_t size = Size(); const uint64_t size = Size();
if (size < position_ + length) { if (size < position_ + length) {
file_->resize(position_ + length); file_->resize(position_ + length);

View File

@ -7,14 +7,43 @@
#include "packager/media/formats/webvtt/text_readers.h" #include "packager/media/formats/webvtt/text_readers.h"
#include "packager/base/logging.h" #include "packager/base/logging.h"
#include "packager/file/file.h"
namespace shaka { namespace shaka {
namespace media { namespace media {
PeekingCharReader::PeekingCharReader(std::unique_ptr<CharReader> source) Status FileReader::Open(const std::string& filename,
std::unique_ptr<FileReader>* out) {
const char* kReadOnly = "r";
std::unique_ptr<File, FileCloser> file(
File::Open(filename.c_str(), kReadOnly));
if (!file) {
return Status(error::INVALID_ARGUMENT,
"Could not open input file " + filename);
}
*out = std::unique_ptr<FileReader>(new FileReader(std::move(file)));
return Status::OK;
}
bool FileReader::Next(char* out) {
// TODO(vaage): If file reading performance is poor, change this to buffer
// data and read from the buffer.
return file_->Read(out, 1) == 1;
}
FileReader::FileReader(std::unique_ptr<File, FileCloser> file)
: file_(std::move(file)) {
DCHECK(file_);
}
PeekingReader::PeekingReader(std::unique_ptr<FileReader> source)
: source_(std::move(source)) {} : source_(std::move(source)) {}
bool PeekingCharReader::Next(char* out) { bool PeekingReader::Next(char* out) {
DCHECK(out); DCHECK(out);
if (Peek(out)) { if (Peek(out)) {
has_cached_next_ = false; has_cached_next_ = false;
@ -23,7 +52,7 @@ bool PeekingCharReader::Next(char* out) {
return false; return false;
} }
bool PeekingCharReader::Peek(char* out) { bool PeekingReader::Peek(char* out) {
DCHECK(out); DCHECK(out);
if (!has_cached_next_ && source_->Next(&cached_next_)) { if (!has_cached_next_ && source_->Next(&cached_next_)) {
has_cached_next_ = true; has_cached_next_ = true;
@ -35,7 +64,7 @@ bool PeekingCharReader::Peek(char* out) {
return false; return false;
} }
LineReader::LineReader(std::unique_ptr<CharReader> source) LineReader::LineReader(std::unique_ptr<FileReader> source)
: source_(std::move(source)) {} : source_(std::move(source)) {}
// Split lines based on https://w3c.github.io/webvtt/#webvtt-line-terminator // Split lines based on https://w3c.github.io/webvtt/#webvtt-line-terminator
@ -63,7 +92,7 @@ bool LineReader::Next(std::string* out) {
return read_something; return read_something;
} }
BlockReader::BlockReader(std::unique_ptr<CharReader> source) BlockReader::BlockReader(std::unique_ptr<FileReader> source)
: source_(std::move(source)) {} : source_(std::move(source)) {}
bool BlockReader::Next(std::vector<std::string>* out) { bool BlockReader::Next(std::vector<std::string>* out) {
@ -89,15 +118,5 @@ bool BlockReader::Next(std::vector<std::string>* out) {
return in_block; return in_block;
} }
StringCharReader::StringCharReader(const std::string& str) : source_(str) {}
bool StringCharReader::Next(char* out) {
if (pos_ < source_.length()) {
*out = source_[pos_++];
return true;
}
return false;
}
} // namespace media } // namespace media
} // namespace shaka } // namespace shaka

View File

@ -11,33 +11,57 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include "packager/file/file_closer.h"
#include "packager/status.h"
namespace shaka { namespace shaka {
class File;
namespace media { namespace media {
class CharReader { /// Class to read character-by-character from a file.
class FileReader {
public: public:
virtual bool Next(char* out) = 0; /// Create a new file reader by opening a file. If the file fails to open (in
}; /// readonly mode) a non-ok status will be returned. If the file successfully
/// opens, |out| will be set to a new FileReader and an ok status will be
/// returned.
static Status Open(const std::string& filename,
std::unique_ptr<FileReader>* out);
class PeekingCharReader : public CharReader { /// Read the next character from the file. If there is a next character,
public: /// |out| will be set and true will be returned. If there is no next
explicit PeekingCharReader(std::unique_ptr<CharReader> source); /// character false will be returned.
bool Next(char* out);
bool Next(char* out) override;
bool Peek(char* out);
private: private:
PeekingCharReader(const PeekingCharReader&) = delete; explicit FileReader(std::unique_ptr<File, FileCloser> file);
PeekingCharReader operator=(const PeekingCharReader&) = delete;
std::unique_ptr<CharReader> source_; FileReader(const FileReader& reader) = delete;
FileReader operator=(const FileReader& reader) = delete;
std::unique_ptr<File, FileCloser> file_;
};
class PeekingReader {
public:
explicit PeekingReader(std::unique_ptr<FileReader> source);
bool Peek(char* out);
bool Next(char* out);
private:
PeekingReader(const PeekingReader&) = delete;
PeekingReader operator=(const PeekingReader&) = delete;
std::unique_ptr<FileReader> source_;
char cached_next_ = 0; char cached_next_ = 0;
bool has_cached_next_ = false; bool has_cached_next_ = false;
}; };
class LineReader { class LineReader {
public: public:
explicit LineReader(std::unique_ptr<CharReader> source); explicit LineReader(std::unique_ptr<FileReader> source);
bool Next(std::string* out); bool Next(std::string* out);
@ -45,12 +69,12 @@ class LineReader {
LineReader(const LineReader&) = delete; LineReader(const LineReader&) = delete;
LineReader operator=(const LineReader&) = delete; LineReader operator=(const LineReader&) = delete;
PeekingCharReader source_; PeekingReader source_;
}; };
class BlockReader { class BlockReader {
public: public:
explicit BlockReader(std::unique_ptr<CharReader> source); explicit BlockReader(std::unique_ptr<FileReader> source);
bool Next(std::vector<std::string>* out); bool Next(std::vector<std::string>* out);
@ -61,20 +85,6 @@ class BlockReader {
LineReader source_; LineReader source_;
}; };
class StringCharReader : public CharReader {
public:
explicit StringCharReader(const std::string& str);
bool Next(char* out) override;
private:
StringCharReader(const StringCharReader&) = delete;
StringCharReader& operator=(const StringCharReader&) = delete;
const std::string source_;
size_t pos_ = 0;
};
} // namespace media } // namespace media
} // namespace shaka } // namespace shaka

View File

@ -6,31 +6,45 @@
#include <gtest/gtest.h> #include <gtest/gtest.h>
#include "packager/file/file.h"
#include "packager/media/formats/webvtt/text_readers.h" #include "packager/media/formats/webvtt/text_readers.h"
#include "packager/status_test_util.h"
namespace shaka { namespace shaka {
namespace media { namespace media {
namespace {
const char* kFilename = "memory://test-file";
} // namespace
TEST(TextReadersTest, ReadWholeStream) { TEST(TextReadersTest, ReadWholeStream) {
const std::string input = "abcd"; const char* text = "abcd";
StringCharReader source(input);
ASSERT_TRUE(File::WriteStringToFile(kFilename, text));
std::unique_ptr<FileReader> source;
ASSERT_OK(FileReader::Open(kFilename, &source));
char c; char c;
ASSERT_TRUE(source.Next(&c)); ASSERT_TRUE(source->Next(&c));
ASSERT_EQ(c, 'a'); ASSERT_EQ(c, 'a');
ASSERT_TRUE(source.Next(&c)); ASSERT_TRUE(source->Next(&c));
ASSERT_EQ(c, 'b'); ASSERT_EQ(c, 'b');
ASSERT_TRUE(source.Next(&c)); ASSERT_TRUE(source->Next(&c));
ASSERT_EQ(c, 'c'); ASSERT_EQ(c, 'c');
ASSERT_TRUE(source.Next(&c)); ASSERT_TRUE(source->Next(&c));
ASSERT_EQ(c, 'd'); ASSERT_EQ(c, 'd');
ASSERT_FALSE(source.Next(&c)); ASSERT_FALSE(source->Next(&c));
} }
TEST(TextReadersTest, Peeking) { TEST(TextReadersTest, Peeking) {
const std::string input = "abc"; const char* text = "abc";
std::unique_ptr<CharReader> source(new StringCharReader(input));
PeekingCharReader reader(std::move(source)); ASSERT_TRUE(File::WriteStringToFile(kFilename, text));
std::unique_ptr<FileReader> source;
ASSERT_OK(FileReader::Open(kFilename, &source));
PeekingReader reader(std::move(source));
char c; char c;
ASSERT_TRUE(reader.Peek(&c)); ASSERT_TRUE(reader.Peek(&c));
@ -50,8 +64,13 @@ TEST(TextReadersTest, Peeking) {
} }
TEST(TextReadersTest, ReadLinesWithNewLine) { TEST(TextReadersTest, ReadLinesWithNewLine) {
const std::string input = "a\nb\nc"; const char* text = "a\nb\nc";
std::unique_ptr<CharReader> source(new StringCharReader(input));
ASSERT_TRUE(File::WriteStringToFile(kFilename, text));
std::unique_ptr<FileReader> source;
ASSERT_OK(FileReader::Open(kFilename, &source));
LineReader reader(std::move(source)); LineReader reader(std::move(source));
std::string s; std::string s;
@ -65,8 +84,13 @@ TEST(TextReadersTest, ReadLinesWithNewLine) {
} }
TEST(TextReadersTest, ReadLinesWithReturnsAndNewLine) { TEST(TextReadersTest, ReadLinesWithReturnsAndNewLine) {
const std::string input = "a\r\nb\r\nc"; const char* text = "a\r\nb\r\nc";
std::unique_ptr<CharReader> source(new StringCharReader(input));
ASSERT_TRUE(File::WriteStringToFile(kFilename, text));
std::unique_ptr<FileReader> source;
ASSERT_OK(FileReader::Open(kFilename, &source));
LineReader reader(std::move(source)); LineReader reader(std::move(source));
std::string s; std::string s;
@ -80,8 +104,13 @@ TEST(TextReadersTest, ReadLinesWithReturnsAndNewLine) {
} }
TEST(TextReadersTest, ReadLinesWithNewLineAndReturns) { TEST(TextReadersTest, ReadLinesWithNewLineAndReturns) {
const std::string input = "a\n\rb\n\rc"; const char* text = "a\n\rb\n\rc";
std::unique_ptr<CharReader> source(new StringCharReader(input));
ASSERT_TRUE(File::WriteStringToFile(kFilename, text));
std::unique_ptr<FileReader> source;
ASSERT_OK(FileReader::Open(kFilename, &source));
LineReader reader(std::move(source)); LineReader reader(std::move(source));
std::string s; std::string s;
@ -99,8 +128,13 @@ TEST(TextReadersTest, ReadLinesWithNewLineAndReturns) {
} }
TEST(TextReadersTest, ReadLinesWithReturnAtEnd) { TEST(TextReadersTest, ReadLinesWithReturnAtEnd) {
const std::string input = "a\r\nb\r\nc\r"; const char* text = "a\r\nb\r\nc\r";
std::unique_ptr<CharReader> source(new StringCharReader(input));
ASSERT_TRUE(File::WriteStringToFile(kFilename, text));
std::unique_ptr<FileReader> source;
ASSERT_OK(FileReader::Open(kFilename, &source));
LineReader reader(std::move(source)); LineReader reader(std::move(source));
std::string s; std::string s;
@ -114,11 +148,15 @@ TEST(TextReadersTest, ReadLinesWithReturnAtEnd) {
} }
TEST(TextReadersTest, ReadBlocksReadMultilineBlock) { TEST(TextReadersTest, ReadBlocksReadMultilineBlock) {
const std::string input = const char* text =
"block 1 - line 1\n" "block 1 - line 1\n"
"block 1 - line 2"; "block 1 - line 2";
std::unique_ptr<CharReader> source(new StringCharReader(input)); ASSERT_TRUE(File::WriteStringToFile(kFilename, text));
std::unique_ptr<FileReader> source;
ASSERT_OK(FileReader::Open(kFilename, &source));
BlockReader reader(std::move(source)); BlockReader reader(std::move(source));
std::vector<std::string> block; std::vector<std::string> block;
@ -132,7 +170,7 @@ TEST(TextReadersTest, ReadBlocksReadMultilineBlock) {
} }
TEST(TextReadersTest, ReadBlocksSkipBlankLinesBeforeBlocks) { TEST(TextReadersTest, ReadBlocksSkipBlankLinesBeforeBlocks) {
const std::string input = const char* text =
"\n" "\n"
"\n" "\n"
"block 1\n" "block 1\n"
@ -140,7 +178,11 @@ TEST(TextReadersTest, ReadBlocksSkipBlankLinesBeforeBlocks) {
"\n" "\n"
"block 2\n"; "block 2\n";
std::unique_ptr<CharReader> source(new StringCharReader(input)); ASSERT_TRUE(File::WriteStringToFile(kFilename, text));
std::unique_ptr<FileReader> source;
ASSERT_OK(FileReader::Open(kFilename, &source));
BlockReader reader(std::move(source)); BlockReader reader(std::move(source));
std::vector<std::string> block; std::vector<std::string> block;
@ -157,9 +199,13 @@ TEST(TextReadersTest, ReadBlocksSkipBlankLinesBeforeBlocks) {
} }
TEST(TextReadersTest, ReadBlocksWithOnlyBlankLines) { TEST(TextReadersTest, ReadBlocksWithOnlyBlankLines) {
const std::string input = "\n\n\n\n"; const char* text = "\n\n\n\n";
ASSERT_TRUE(File::WriteStringToFile(kFilename, text));
std::unique_ptr<FileReader> source;
ASSERT_OK(FileReader::Open(kFilename, &source));
std::unique_ptr<CharReader> source(new StringCharReader(input));
BlockReader reader(std::move(source)); BlockReader reader(std::move(source));
std::vector<std::string> block; std::vector<std::string> block;

View File

@ -46,7 +46,7 @@ bool MaybeCueId(const std::string& line) {
} }
} // namespace } // namespace
WebVttParser::WebVttParser(std::unique_ptr<CharReader> source) WebVttParser::WebVttParser(std::unique_ptr<FileReader> source)
: reader_(std::move(source)) {} : reader_(std::move(source)) {}
Status WebVttParser::InitializeInternal() { Status WebVttParser::InitializeInternal() {

View File

@ -20,7 +20,7 @@ namespace media {
// Used to parse a WebVTT source into Cues that will be sent downstream. // Used to parse a WebVTT source into Cues that will be sent downstream.
class WebVttParser : public OriginHandler { class WebVttParser : public OriginHandler {
public: public:
explicit WebVttParser(std::unique_ptr<CharReader> source); explicit WebVttParser(std::unique_ptr<FileReader> source);
Status Run() override; Status Run() override;
void Cancel() override; void Cancel() override;

View File

@ -7,6 +7,7 @@
#include <gmock/gmock.h> #include <gmock/gmock.h>
#include <gtest/gtest.h> #include <gtest/gtest.h>
#include "packager/file/file.h"
#include "packager/media/base/media_handler_test_base.h" #include "packager/media/base/media_handler_test_base.h"
#include "packager/media/formats/webvtt/text_readers.h" #include "packager/media/formats/webvtt/text_readers.h"
#include "packager/media/formats/webvtt/webvtt_parser.h" #include "packager/media/formats/webvtt/webvtt_parser.h"
@ -29,9 +30,18 @@ const char* kNoSettings = "";
class WebVttParserTest : public MediaHandlerTestBase { class WebVttParserTest : public MediaHandlerTestBase {
protected: protected:
void SetUpAndInitializeGraph(const std::string& text_input) { void SetUpAndInitializeGraph(const char* text) {
parser_ = std::make_shared<WebVttParser>( const char* kFilename = "memory://test-file";
std::unique_ptr<StringCharReader>(new StringCharReader(text_input)));
// Create the input file from the text passed to the test.
ASSERT_TRUE(File::WriteStringToFile(kFilename, text));
// Read from the file we just wrote.
std::unique_ptr<FileReader> reader;
ASSERT_OK(FileReader::Open(kFilename, &reader));
parser_ = std::make_shared<WebVttParser>(std::move(reader));
ASSERT_OK(MediaHandlerTestBase::SetUpAndInitializeGraph( ASSERT_OK(MediaHandlerTestBase::SetUpAndInitializeGraph(
parser_, kInputCount, kOutputCount)); parser_, kInputCount, kOutputCount));
} }
@ -40,7 +50,9 @@ class WebVttParserTest : public MediaHandlerTestBase {
}; };
TEST_F(WebVttParserTest, FailToParseEmptyFile) { TEST_F(WebVttParserTest, FailToParseEmptyFile) {
SetUpAndInitializeGraph(""); const char* text = "";
ASSERT_NO_FATAL_FAILURE(SetUpAndInitializeGraph(text));
EXPECT_CALL(*Output(kOutputIndex), OnProcess(testing::_)).Times(0); EXPECT_CALL(*Output(kOutputIndex), OnProcess(testing::_)).Times(0);
EXPECT_CALL(*Output(kOutputIndex), OnFlush(testing::_)).Times(0); EXPECT_CALL(*Output(kOutputIndex), OnFlush(testing::_)).Times(0);
@ -49,9 +61,11 @@ TEST_F(WebVttParserTest, FailToParseEmptyFile) {
} }
TEST_F(WebVttParserTest, ParseOnlyHeader) { TEST_F(WebVttParserTest, ParseOnlyHeader) {
SetUpAndInitializeGraph( const char* text =
"WEBVTT\n" "WEBVTT\n"
"\n"); "\n";
ASSERT_NO_FATAL_FAILURE(SetUpAndInitializeGraph(text));
{ {
testing::InSequence s; testing::InSequence s;
@ -64,9 +78,11 @@ TEST_F(WebVttParserTest, ParseOnlyHeader) {
} }
TEST_F(WebVttParserTest, ParseHeaderWithBOM) { TEST_F(WebVttParserTest, ParseHeaderWithBOM) {
SetUpAndInitializeGraph( const char* text =
"\xFE\xFFWEBVTT\n" "\xFE\xFFWEBVTT\n"
"\n"); "\n";
ASSERT_NO_FATAL_FAILURE(SetUpAndInitializeGraph(text));
{ {
testing::InSequence s; testing::InSequence s;
@ -79,9 +95,11 @@ TEST_F(WebVttParserTest, ParseHeaderWithBOM) {
} }
TEST_F(WebVttParserTest, FailToParseHeaderWrongWord) { TEST_F(WebVttParserTest, FailToParseHeaderWrongWord) {
SetUpAndInitializeGraph( const char* text =
"NOT WEBVTT\n" "NOT WEBVTT\n"
"\n"); "\n";
ASSERT_NO_FATAL_FAILURE(SetUpAndInitializeGraph(text));
EXPECT_CALL(*Output(kOutputIndex), OnProcess(testing::_)).Times(0); EXPECT_CALL(*Output(kOutputIndex), OnProcess(testing::_)).Times(0);
EXPECT_CALL(*Output(kOutputIndex), OnFlush(testing::_)).Times(0); EXPECT_CALL(*Output(kOutputIndex), OnFlush(testing::_)).Times(0);
@ -90,10 +108,12 @@ TEST_F(WebVttParserTest, FailToParseHeaderWrongWord) {
} }
TEST_F(WebVttParserTest, FailToParseHeaderNotOneLine) { TEST_F(WebVttParserTest, FailToParseHeaderNotOneLine) {
SetUpAndInitializeGraph( const char* text =
"WEBVTT\n" "WEBVTT\n"
"WEBVTT\n" "WEBVTT\n"
"\n"); "\n";
ASSERT_NO_FATAL_FAILURE(SetUpAndInitializeGraph(text));
EXPECT_CALL(*Output(kOutputIndex), OnProcess(testing::_)).Times(0); EXPECT_CALL(*Output(kOutputIndex), OnProcess(testing::_)).Times(0);
EXPECT_CALL(*Output(kOutputIndex), OnFlush(testing::_)).Times(0); EXPECT_CALL(*Output(kOutputIndex), OnFlush(testing::_)).Times(0);
@ -104,14 +124,16 @@ TEST_F(WebVttParserTest, FailToParseHeaderNotOneLine) {
// TODO: Add style blocks support to WebVttParser. // TODO: Add style blocks support to WebVttParser.
// This test is disabled until WebVTT parses STYLE blocks. // This test is disabled until WebVTT parses STYLE blocks.
TEST_F(WebVttParserTest, DISABLED_ParseStyleBlocks) { TEST_F(WebVttParserTest, DISABLED_ParseStyleBlocks) {
SetUpAndInitializeGraph( const char* text =
"WEBVTT\n" "WEBVTT\n"
"\n" "\n"
"STYLE\n" "STYLE\n"
"::cue {\n" "::cue {\n"
" background-image: linear-gradient(to bottom, dimgray, lightgray);\n" " background-image: linear-gradient(to bottom, dimgray, lightgray);\n"
" color: papayawhip;\n" " color: papayawhip;\n"
"}"); "}";
ASSERT_NO_FATAL_FAILURE(SetUpAndInitializeGraph(text));
{ {
testing::InSequence s; testing::InSequence s;
@ -124,11 +146,13 @@ TEST_F(WebVttParserTest, DISABLED_ParseStyleBlocks) {
} }
TEST_F(WebVttParserTest, ParseOneCue) { TEST_F(WebVttParserTest, ParseOneCue) {
SetUpAndInitializeGraph( const char* text =
"WEBVTT\n" "WEBVTT\n"
"\n" "\n"
"00:01:00.000 --> 01:00:00.000\n" "00:01:00.000 --> 01:00:00.000\n"
"subtitle\n"); "subtitle\n";
ASSERT_NO_FATAL_FAILURE(SetUpAndInitializeGraph(text));
{ {
testing::InSequence s; testing::InSequence s;
@ -144,23 +168,27 @@ TEST_F(WebVttParserTest, ParseOneCue) {
} }
TEST_F(WebVttParserTest, FailToParseCueWithArrowInId) { TEST_F(WebVttParserTest, FailToParseCueWithArrowInId) {
SetUpAndInitializeGraph( const char* text =
"WEBVTT\n" "WEBVTT\n"
"\n" "\n"
"-->\n" "-->\n"
"00:01:00.000 --> 01:00:00.000\n" "00:01:00.000 --> 01:00:00.000\n"
"subtitle\n"); "subtitle\n";
ASSERT_NO_FATAL_FAILURE(SetUpAndInitializeGraph(text));
ASSERT_NE(Status::OK, parser_->Run()); ASSERT_NE(Status::OK, parser_->Run());
} }
TEST_F(WebVttParserTest, ParseOneCueWithId) { TEST_F(WebVttParserTest, ParseOneCueWithId) {
SetUpAndInitializeGraph( const char* text =
"WEBVTT\n" "WEBVTT\n"
"\n" "\n"
"id\n" "id\n"
"00:01:00.000 --> 01:00:00.000\n" "00:01:00.000 --> 01:00:00.000\n"
"subtitle\n"); "subtitle\n";
ASSERT_NO_FATAL_FAILURE(SetUpAndInitializeGraph(text));
{ {
testing::InSequence s; testing::InSequence s;
@ -176,11 +204,13 @@ TEST_F(WebVttParserTest, ParseOneCueWithId) {
} }
TEST_F(WebVttParserTest, ParseOneCueWithSettings) { TEST_F(WebVttParserTest, ParseOneCueWithSettings) {
SetUpAndInitializeGraph( const char* text =
"WEBVTT\n" "WEBVTT\n"
"\n" "\n"
"00:01:00.000 --> 01:00:00.000 size:50%\n" "00:01:00.000 --> 01:00:00.000 size:50%\n"
"subtitle\n"); "subtitle\n";
ASSERT_NO_FATAL_FAILURE(SetUpAndInitializeGraph(text));
{ {
testing::InSequence s; testing::InSequence s;
@ -197,7 +227,7 @@ TEST_F(WebVttParserTest, ParseOneCueWithSettings) {
// Verify that a typical case with mulitple cues work. // Verify that a typical case with mulitple cues work.
TEST_F(WebVttParserTest, ParseMultipleCues) { TEST_F(WebVttParserTest, ParseMultipleCues) {
SetUpAndInitializeGraph( const char* text =
"WEBVTT\n" "WEBVTT\n"
"\n" "\n"
"00:00:01.000 --> 00:00:05.200\n" "00:00:01.000 --> 00:00:05.200\n"
@ -207,7 +237,9 @@ TEST_F(WebVttParserTest, ParseMultipleCues) {
"subtitle B\n" "subtitle B\n"
"\n" "\n"
"00:00:05.800 --> 00:00:08.000\n" "00:00:05.800 --> 00:00:08.000\n"
"subtitle C\n"); "subtitle C\n";
ASSERT_NO_FATAL_FAILURE(SetUpAndInitializeGraph(text));
{ {
testing::InSequence s; testing::InSequence s;
@ -231,7 +263,7 @@ TEST_F(WebVttParserTest, ParseMultipleCues) {
// Verify that a typical case with mulitple cues work even when comments are // Verify that a typical case with mulitple cues work even when comments are
// present. // present.
TEST_F(WebVttParserTest, ParseWithComments) { TEST_F(WebVttParserTest, ParseWithComments) {
SetUpAndInitializeGraph( const char* text =
"WEBVTT\n" "WEBVTT\n"
"\n" "\n"
"NOTE This is a one line comment\n" "NOTE This is a one line comment\n"
@ -251,7 +283,9 @@ TEST_F(WebVttParserTest, ParseWithComments) {
"NOTE\tThis is a comment that using a tab\n" "NOTE\tThis is a comment that using a tab\n"
"\n" "\n"
"00:00:05.800 --> 00:00:08.000\n" "00:00:05.800 --> 00:00:08.000\n"
"subtitle C\n"); "subtitle C\n";
ASSERT_NO_FATAL_FAILURE(SetUpAndInitializeGraph(text));
{ {
testing::InSequence s; testing::InSequence s;