Use Mock Muxer Listener in WebVttOutput Tests

Use a mock muxer listener so that we can verify that the webvtt
output handlers will write to a manifest correctly.

Change-Id: I0294a998bfaf06a6d8f7d4c287fb014839b38f73
This commit is contained in:
Aaron Vaage 2018-01-04 15:00:11 -08:00
parent 49933737cd
commit c877af9f3b
1 changed files with 106 additions and 26 deletions

View File

@ -11,12 +11,15 @@
#include "packager/media/base/media_handler_test_base.h" #include "packager/media/base/media_handler_test_base.h"
#include "packager/media/base/text_stream_info.h" #include "packager/media/base/text_stream_info.h"
#include "packager/media/event/combined_muxer_listener.h" #include "packager/media/event/combined_muxer_listener.h"
#include "packager/media/event/mock_muxer_listener.h"
#include "packager/media/formats/webvtt/webvtt_output_handler.h" #include "packager/media/formats/webvtt/webvtt_output_handler.h"
#include "packager/status_test_util.h" #include "packager/status_test_util.h"
namespace shaka { namespace shaka {
namespace media { namespace media {
namespace { namespace {
using testing::_;
const size_t kInputCount = 1; const size_t kInputCount = 1;
const size_t kOutputCount = 0; const size_t kOutputCount = 0;
const size_t kInputIndex = 0; const size_t kInputIndex = 0;
@ -28,6 +31,9 @@ const char* kNoId = "";
const char* kSegmentedFileTemplate = "memory://output/template-$Number$.vtt"; const char* kSegmentedFileTemplate = "memory://output/template-$Number$.vtt";
const char* kSegmentedFileOutput1 = "memory://output/template-1.vtt"; const char* kSegmentedFileOutput1 = "memory://output/template-1.vtt";
const char* kSegmentedFileOutput2 = "memory://output/template-2.vtt"; const char* kSegmentedFileOutput2 = "memory://output/template-2.vtt";
const uint64_t kSegmentDuration = 10000;
const float kMillisecondsPerSecond = 1000.0f;
} // namespace } // namespace
class WebVttSegmentedOutputTest : public MediaHandlerTestBase { class WebVttSegmentedOutputTest : public MediaHandlerTestBase {
@ -35,7 +41,11 @@ class WebVttSegmentedOutputTest : public MediaHandlerTestBase {
void SetUp() { void SetUp() {
MuxerOptions muxer_options; MuxerOptions muxer_options;
muxer_options.segment_template = kSegmentedFileTemplate; muxer_options.segment_template = kSegmentedFileTemplate;
std::unique_ptr<MuxerListener> muxer_listener(new CombinedMuxerListener());
// Create a mock muxer listener but save a reference to the mock so that we
// can use it in the test.
std::unique_ptr<MockMuxerListener> muxer_listener(new MockMuxerListener);
muxer_listener_ = muxer_listener.get();
out_ = std::make_shared<WebVttSegmentedOutputHandler>( out_ = std::make_shared<WebVttSegmentedOutputHandler>(
muxer_options, std::move(muxer_listener)); muxer_options, std::move(muxer_listener));
@ -43,20 +53,27 @@ class WebVttSegmentedOutputTest : public MediaHandlerTestBase {
ASSERT_OK(SetUpAndInitializeGraph(out_, kInputCount, kOutputCount)); ASSERT_OK(SetUpAndInitializeGraph(out_, kInputCount, kOutputCount));
} }
MockMuxerListener* muxer_listener_ = nullptr;
std::shared_ptr<WebVttSegmentedOutputHandler> out_; std::shared_ptr<WebVttSegmentedOutputHandler> out_;
}; };
TEST_F(WebVttSegmentedOutputTest, WithNoSegmentAndWithNoSamples) { TEST_F(WebVttSegmentedOutputTest, WithNoSegmentAndWithNoSamples) {
// Expected output - No files should be created as there were no EXPECT_CALL(*muxer_listener_, OnNewSegment(_, _, _, _)).Times(0);
// samples.
{
// No segments should have be created as there were no samples.
testing::InSequence s;
EXPECT_CALL(*muxer_listener_, OnMediaStart(_, _, _, _));
const float kMediaDuration = 0 * kSegmentDuration / kMillisecondsPerSecond;
EXPECT_CALL(*muxer_listener_,
OnMediaEndMock(_, _, _, _, _, _, _, _, kMediaDuration));
}
ASSERT_OK(Input(kInputIndex) ASSERT_OK(Input(kInputIndex)
->Dispatch(StreamData::FromStreamInfo(kStreamIndex, ->Dispatch(StreamData::FromStreamInfo(kStreamIndex,
GetTextStreamInfo()))); GetTextStreamInfo())));
ASSERT_OK(
Input(kInputIndex)
->Dispatch(StreamData::FromSegmentInfo(
kStreamIndex, GetSegmentInfo(kStreamIndex, 10000, !kEncrypted))));
ASSERT_OK(Input(kInputIndex)->FlushAllDownstreams()); ASSERT_OK(Input(kInputIndex)->FlushAllDownstreams());
} }
@ -68,6 +85,20 @@ TEST_F(WebVttSegmentedOutputTest, WithOneSegmentAndWithOneSample) {
"payload\n" "payload\n"
"\n"; "\n";
const uint64_t kSegmentStart = 0;
{
testing::InSequence s;
EXPECT_CALL(*muxer_listener_, OnMediaStart(_, _, _, _));
EXPECT_CALL(*muxer_listener_,
OnNewSegment(kSegmentedFileOutput1, kSegmentStart,
kSegmentDuration, _));
const float kMediaDuration = 1 * kSegmentDuration / kMillisecondsPerSecond;
EXPECT_CALL(*muxer_listener_,
OnMediaEndMock(_, _, _, _, _, _, _, _, kMediaDuration));
}
ASSERT_OK(Input(kInputIndex) ASSERT_OK(Input(kInputIndex)
->Dispatch(StreamData::FromStreamInfo(kStreamIndex, ->Dispatch(StreamData::FromStreamInfo(kStreamIndex,
GetTextStreamInfo()))); GetTextStreamInfo())));
@ -75,9 +106,11 @@ TEST_F(WebVttSegmentedOutputTest, WithOneSegmentAndWithOneSample) {
Input(kInputIndex) Input(kInputIndex)
->Dispatch(StreamData::FromTextSample( ->Dispatch(StreamData::FromTextSample(
kStreamIndex, GetTextSample(kNoId, 5000, 6000, "payload")))); kStreamIndex, GetTextSample(kNoId, 5000, 6000, "payload"))));
ASSERT_OK(Input(kInputIndex) ASSERT_OK(
->Dispatch(StreamData::FromSegmentInfo( Input(kInputIndex)
kStreamIndex, GetSegmentInfo(0, 10000, !kEncrypted)))); ->Dispatch(StreamData::FromSegmentInfo(
kStreamIndex,
GetSegmentInfo(kSegmentStart, kSegmentDuration, !kEncrypted))));
ASSERT_OK(Input(kInputIndex)->FlushAllDownstreams()); ASSERT_OK(Input(kInputIndex)->FlushAllDownstreams());
ASSERT_FILE_STREQ(kSegmentedFileOutput1, kExpectedOutput); ASSERT_FILE_STREQ(kSegmentedFileOutput1, kExpectedOutput);
@ -98,6 +131,24 @@ TEST_F(WebVttSegmentedOutputTest, WithTwoSegmentAndWithOneSample) {
"payload 2\n" "payload 2\n"
"\n"; "\n";
const uint64_t kSegment1Start = 0;
const uint64_t kSegment2Start = kSegmentDuration;
{
testing::InSequence s;
EXPECT_CALL(*muxer_listener_, OnMediaStart(_, _, _, _));
EXPECT_CALL(*muxer_listener_,
OnNewSegment(kSegmentedFileOutput1, kSegment1Start,
kSegmentDuration, _));
EXPECT_CALL(*muxer_listener_,
OnNewSegment(kSegmentedFileOutput2, kSegment2Start,
kSegmentDuration, _));
const float kMediaDuration = 2 * kSegmentDuration / kMillisecondsPerSecond;
EXPECT_CALL(*muxer_listener_,
OnMediaEndMock(_, _, _, _, _, _, _, _, kMediaDuration));
}
ASSERT_OK(Input(kInputIndex) ASSERT_OK(Input(kInputIndex)
->Dispatch(StreamData::FromStreamInfo(0, GetTextStreamInfo()))); ->Dispatch(StreamData::FromStreamInfo(0, GetTextStreamInfo())));
@ -106,17 +157,21 @@ TEST_F(WebVttSegmentedOutputTest, WithTwoSegmentAndWithOneSample) {
Input(kInputIndex) Input(kInputIndex)
->Dispatch(StreamData::FromTextSample( ->Dispatch(StreamData::FromTextSample(
kStreamIndex, GetTextSample(kNoId, 5000, 6000, "payload 1")))); kStreamIndex, GetTextSample(kNoId, 5000, 6000, "payload 1"))));
ASSERT_OK(Input(kInputIndex) ASSERT_OK(
->Dispatch(StreamData::FromSegmentInfo( Input(kInputIndex)
kStreamIndex, GetSegmentInfo(0, 10000, !kEncrypted)))); ->Dispatch(StreamData::FromSegmentInfo(
kStreamIndex,
GetSegmentInfo(kSegment1Start, kSegmentDuration, !kEncrypted))));
// Segment Two // Segment Two
ASSERT_OK( ASSERT_OK(
Input(kInputIndex) Input(kInputIndex)
->Dispatch(StreamData::FromTextSample( ->Dispatch(StreamData::FromTextSample(
kStreamIndex, GetTextSample(kNoId, 15000, 16000, "payload 2")))); kStreamIndex, GetTextSample(kNoId, 15000, 16000, "payload 2"))));
ASSERT_OK(Input(kInputIndex) ASSERT_OK(
->Dispatch(StreamData::FromSegmentInfo( Input(kInputIndex)
kStreamIndex, GetSegmentInfo(10000, 10000, !kEncrypted)))); ->Dispatch(StreamData::FromSegmentInfo(
kStreamIndex,
GetSegmentInfo(kSegment2Start, kSegmentDuration, !kEncrypted))));
ASSERT_OK(Input(kInputIndex)->FlushAllDownstreams()); ASSERT_OK(Input(kInputIndex)->FlushAllDownstreams());
ASSERT_FILE_STREQ(kSegmentedFileOutput1, kExpectedOutput1); ASSERT_FILE_STREQ(kSegmentedFileOutput1, kExpectedOutput1);
@ -124,32 +179,57 @@ TEST_F(WebVttSegmentedOutputTest, WithTwoSegmentAndWithOneSample) {
} }
TEST_F(WebVttSegmentedOutputTest, WithAnEmptySegment) { TEST_F(WebVttSegmentedOutputTest, WithAnEmptySegment) {
const char* kExpectedOutput = const char* kExpectedOutput1 =
"WEBVTT\n"
"\n";
const char* kExpectedOutput2 =
"WEBVTT\n" "WEBVTT\n"
"\n" "\n"
"00:00:15.000 --> 00:00:16.000\n" "00:00:15.000 --> 00:00:16.000\n"
"payload 2\n" "payload 2\n"
"\n"; "\n";
const uint64_t kSegment1Start = 0;
const uint64_t kSegment2Start = kSegmentDuration;
{
testing::InSequence s;
EXPECT_CALL(*muxer_listener_, OnMediaStart(_, _, _, _));
EXPECT_CALL(*muxer_listener_,
OnNewSegment(kSegmentedFileOutput1, kSegment1Start,
kSegmentDuration, _));
EXPECT_CALL(*muxer_listener_,
OnNewSegment(kSegmentedFileOutput2, kSegment2Start,
kSegmentDuration, _));
const float kMediaDuration = 2 * kSegmentDuration / kMillisecondsPerSecond;
EXPECT_CALL(*muxer_listener_,
OnMediaEndMock(_, _, _, _, _, _, _, _, kMediaDuration));
}
ASSERT_OK(Input(kInputIndex) ASSERT_OK(Input(kInputIndex)
->Dispatch(StreamData::FromStreamInfo(0, GetTextStreamInfo()))); ->Dispatch(StreamData::FromStreamInfo(0, GetTextStreamInfo())));
// Segment One // Segment One
ASSERT_OK(Input(kInputIndex) ASSERT_OK(
->Dispatch(StreamData::FromSegmentInfo( Input(kInputIndex)
kStreamIndex, GetSegmentInfo(0, 10000, !kEncrypted)))); ->Dispatch(StreamData::FromSegmentInfo(
kStreamIndex,
GetSegmentInfo(kSegment1Start, kSegmentDuration, !kEncrypted))));
// Segment Two // Segment Two
ASSERT_OK( ASSERT_OK(
Input(kInputIndex) Input(kInputIndex)
->Dispatch(StreamData::FromTextSample( ->Dispatch(StreamData::FromTextSample(
kStreamIndex, GetTextSample(kNoId, 15000, 16000, "payload 2")))); kStreamIndex, GetTextSample(kNoId, 15000, 16000, "payload 2"))));
ASSERT_OK(Input(kInputIndex) ASSERT_OK(
->Dispatch(StreamData::FromSegmentInfo( Input(kInputIndex)
kStreamIndex, GetSegmentInfo(10000, 10000, !kEncrypted)))); ->Dispatch(StreamData::FromSegmentInfo(
kStreamIndex,
GetSegmentInfo(kSegment2Start, kSegmentDuration, !kEncrypted))));
ASSERT_OK(Input(kInputIndex)->FlushAllDownstreams()); ASSERT_OK(Input(kInputIndex)->FlushAllDownstreams());
// The empty segment will not write to disk, but it will use segment's ASSERT_FILE_STREQ(kSegmentedFileOutput1, kExpectedOutput1);
// filename. ASSERT_FILE_STREQ(kSegmentedFileOutput2, kExpectedOutput2);
ASSERT_FILE_STREQ(kSegmentedFileOutput2, kExpectedOutput);
} }
} // namespace media } // namespace media
} // namespace shaka } // namespace shaka