SimpleHlsNotifierTest: Use value parameterized tests for rebase tests
Change-Id: Ie734624f6335b01b9bf989e1432ddb4fdf2e4b8b
This commit is contained in:
parent
4b8e9a662f
commit
ac616f36e4
|
@ -75,7 +75,6 @@ class MockMediaPlaylistFactory : public MediaPlaylistFactory {
|
||||||
|
|
||||||
const double kTestTimeShiftBufferDepth = 1800.0;
|
const double kTestTimeShiftBufferDepth = 1800.0;
|
||||||
const char kTestPrefix[] = "http://testprefix.com/";
|
const char kTestPrefix[] = "http://testprefix.com/";
|
||||||
const char kEmptyPrefix[] = "";
|
|
||||||
const char kAnyOutputDir[] = "anything";
|
const char kAnyOutputDir[] = "anything";
|
||||||
|
|
||||||
const uint64_t kAnyStartTime = 10;
|
const uint64_t kAnyStartTime = 10;
|
||||||
|
@ -155,199 +154,6 @@ TEST_F(SimpleHlsNotifierTest, Init) {
|
||||||
EXPECT_TRUE(notifier.Init());
|
EXPECT_TRUE(notifier.Init());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify that relative paths can be handled.
|
|
||||||
// For this test, since the prefix "anything/" matches, the prefix should be
|
|
||||||
// stripped.
|
|
||||||
TEST_F(SimpleHlsNotifierTest, RebaseSegmentUrl) {
|
|
||||||
std::unique_ptr<MockMasterPlaylist> mock_master_playlist(
|
|
||||||
new MockMasterPlaylist());
|
|
||||||
std::unique_ptr<MockMediaPlaylistFactory> factory(
|
|
||||||
new MockMediaPlaylistFactory());
|
|
||||||
|
|
||||||
// Pointer released by SimpleHlsNotifier.
|
|
||||||
MockMediaPlaylist* mock_media_playlist =
|
|
||||||
new MockMediaPlaylist("playlist.m3u8", "", "");
|
|
||||||
|
|
||||||
EXPECT_CALL(*mock_media_playlist,
|
|
||||||
SetMediaInfo(Property(&MediaInfo::init_segment_url, StrEq(""))))
|
|
||||||
.WillOnce(Return(true));
|
|
||||||
|
|
||||||
// Verify that the common prefix is stripped for AddSegment().
|
|
||||||
EXPECT_CALL(
|
|
||||||
*mock_media_playlist,
|
|
||||||
AddSegment("http://testprefix.com/path/to/media1.ts", _, _, _, _));
|
|
||||||
EXPECT_CALL(*factory, CreateMock(_, StrEq("video_playlist.m3u8"),
|
|
||||||
StrEq("name"), StrEq("groupid")))
|
|
||||||
.WillOnce(Return(mock_media_playlist));
|
|
||||||
|
|
||||||
SimpleHlsNotifier notifier(hls_params_);
|
|
||||||
|
|
||||||
InjectMasterPlaylist(std::move(mock_master_playlist), ¬ifier);
|
|
||||||
InjectMediaPlaylistFactory(std::move(factory), ¬ifier);
|
|
||||||
|
|
||||||
EXPECT_TRUE(notifier.Init());
|
|
||||||
MediaInfo media_info;
|
|
||||||
uint32_t stream_id;
|
|
||||||
EXPECT_TRUE(notifier.NotifyNewStream(media_info, "video_playlist.m3u8",
|
|
||||||
"name", "groupid", &stream_id));
|
|
||||||
|
|
||||||
EXPECT_TRUE(notifier.NotifyNewSegment(stream_id, "anything/path/to/media1.ts",
|
|
||||||
kAnyStartTime, kAnyDuration, 0,
|
|
||||||
kAnySize));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(SimpleHlsNotifierTest, RebaseInitSegmentUrl) {
|
|
||||||
std::unique_ptr<MockMasterPlaylist> mock_master_playlist(
|
|
||||||
new MockMasterPlaylist());
|
|
||||||
std::unique_ptr<MockMediaPlaylistFactory> factory(
|
|
||||||
new MockMediaPlaylistFactory());
|
|
||||||
|
|
||||||
// Pointer released by SimpleHlsNotifier.
|
|
||||||
MockMediaPlaylist* mock_media_playlist =
|
|
||||||
new MockMediaPlaylist("playlist.m3u8", "", "");
|
|
||||||
|
|
||||||
// Verify that the common prefix is stripped in init segment.
|
|
||||||
EXPECT_CALL(
|
|
||||||
*mock_media_playlist,
|
|
||||||
SetMediaInfo(Property(&MediaInfo::init_segment_url,
|
|
||||||
StrEq("http://testprefix.com/path/to/init.mp4"))))
|
|
||||||
.WillOnce(Return(true));
|
|
||||||
|
|
||||||
EXPECT_CALL(*factory, CreateMock(_, StrEq("video_playlist.m3u8"),
|
|
||||||
StrEq("name"), StrEq("groupid")))
|
|
||||||
.WillOnce(Return(mock_media_playlist));
|
|
||||||
|
|
||||||
SimpleHlsNotifier notifier(hls_params_);
|
|
||||||
|
|
||||||
InjectMasterPlaylist(std::move(mock_master_playlist), ¬ifier);
|
|
||||||
InjectMediaPlaylistFactory(std::move(factory), ¬ifier);
|
|
||||||
|
|
||||||
EXPECT_TRUE(notifier.Init());
|
|
||||||
MediaInfo media_info;
|
|
||||||
media_info.set_init_segment_name("anything/path/to/init.mp4");
|
|
||||||
uint32_t stream_id;
|
|
||||||
EXPECT_TRUE(notifier.NotifyNewStream(media_info, "video_playlist.m3u8",
|
|
||||||
"name", "groupid", &stream_id));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(SimpleHlsNotifierTest, RebaseSegmentUrlRelativeToPlaylist) {
|
|
||||||
std::unique_ptr<MockMasterPlaylist> mock_master_playlist(
|
|
||||||
new MockMasterPlaylist());
|
|
||||||
std::unique_ptr<MockMediaPlaylistFactory> factory(
|
|
||||||
new MockMediaPlaylistFactory());
|
|
||||||
|
|
||||||
// Pointer released by SimpleHlsNotifier.
|
|
||||||
MockMediaPlaylist* mock_media_playlist =
|
|
||||||
new MockMediaPlaylist("video/playlist.m3u8", "", "");
|
|
||||||
|
|
||||||
// Verify that the init segment URL is relative to playlist path.
|
|
||||||
EXPECT_CALL(*mock_media_playlist,
|
|
||||||
SetMediaInfo(Property(&MediaInfo::init_segment_url,
|
|
||||||
StrEq("path/to/init.mp4"))))
|
|
||||||
.WillOnce(Return(true));
|
|
||||||
|
|
||||||
// Verify that the segment URL is relative to playlist path.
|
|
||||||
EXPECT_CALL(*mock_media_playlist,
|
|
||||||
AddSegment(StrEq("path/to/media1.m4s"), _, _, _, _));
|
|
||||||
EXPECT_CALL(*factory, CreateMock(_, StrEq("video/playlist.m3u8"),
|
|
||||||
StrEq("name"), StrEq("groupid")))
|
|
||||||
.WillOnce(Return(mock_media_playlist));
|
|
||||||
|
|
||||||
hls_params_.base_url = kEmptyPrefix;
|
|
||||||
SimpleHlsNotifier notifier(hls_params_);
|
|
||||||
|
|
||||||
InjectMasterPlaylist(std::move(mock_master_playlist), ¬ifier);
|
|
||||||
InjectMediaPlaylistFactory(std::move(factory), ¬ifier);
|
|
||||||
|
|
||||||
EXPECT_TRUE(notifier.Init());
|
|
||||||
MediaInfo media_info;
|
|
||||||
media_info.set_init_segment_name("anything/video/path/to/init.mp4");
|
|
||||||
uint32_t stream_id;
|
|
||||||
EXPECT_TRUE(notifier.NotifyNewStream(media_info, "video/playlist.m3u8",
|
|
||||||
"name", "groupid", &stream_id));
|
|
||||||
EXPECT_TRUE(
|
|
||||||
notifier.NotifyNewSegment(stream_id, "anything/video/path/to/media1.m4s",
|
|
||||||
kAnyStartTime, kAnyDuration, 0, kAnySize));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Verify that when segment path's prefix and output dir match, then the
|
|
||||||
// prefix is stripped from segment path.
|
|
||||||
TEST_F(SimpleHlsNotifierTest, RebaseAbsoluteSegmentPrefixAndOutputDirMatch) {
|
|
||||||
const char kAbsoluteOutputDir[] = "/tmp/something/";
|
|
||||||
hls_params_.master_playlist_output =
|
|
||||||
std::string(kAbsoluteOutputDir) + kMasterPlaylistName;
|
|
||||||
SimpleHlsNotifier test_notifier(hls_params_);
|
|
||||||
|
|
||||||
std::unique_ptr<MockMasterPlaylist> mock_master_playlist(
|
|
||||||
new MockMasterPlaylist());
|
|
||||||
std::unique_ptr<MockMediaPlaylistFactory> factory(
|
|
||||||
new MockMediaPlaylistFactory());
|
|
||||||
|
|
||||||
// Pointer released by SimpleHlsNotifier.
|
|
||||||
MockMediaPlaylist* mock_media_playlist =
|
|
||||||
new MockMediaPlaylist("playlist.m3u8", "", "");
|
|
||||||
|
|
||||||
EXPECT_CALL(*mock_media_playlist, SetMediaInfo(_)).WillOnce(Return(true));
|
|
||||||
|
|
||||||
// Verify that the output_dir is stripped and then kTestPrefix is prepended.
|
|
||||||
EXPECT_CALL(*mock_media_playlist,
|
|
||||||
AddSegment("http://testprefix.com/media1.ts", _, _, _, _));
|
|
||||||
EXPECT_CALL(*factory, CreateMock(_, StrEq("video_playlist.m3u8"),
|
|
||||||
StrEq("name"), StrEq("groupid")))
|
|
||||||
.WillOnce(Return(mock_media_playlist));
|
|
||||||
|
|
||||||
InjectMasterPlaylist(std::move(mock_master_playlist), &test_notifier);
|
|
||||||
InjectMediaPlaylistFactory(std::move(factory), &test_notifier);
|
|
||||||
EXPECT_TRUE(test_notifier.Init());
|
|
||||||
MediaInfo media_info;
|
|
||||||
uint32_t stream_id;
|
|
||||||
EXPECT_TRUE(test_notifier.NotifyNewStream(media_info, "video_playlist.m3u8",
|
|
||||||
"name", "groupid", &stream_id));
|
|
||||||
|
|
||||||
EXPECT_TRUE(
|
|
||||||
test_notifier.NotifyNewSegment(stream_id, "/tmp/something/media1.ts",
|
|
||||||
kAnyStartTime, kAnyDuration, 0, kAnySize));
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the paths don't match at all and they are both absolute and completely
|
|
||||||
// different, then keep it as is.
|
|
||||||
TEST_F(SimpleHlsNotifierTest,
|
|
||||||
RebaseAbsoluteSegmentCompletelyDifferentDirectory) {
|
|
||||||
const char kAbsoluteOutputDir[] = "/tmp/something/";
|
|
||||||
hls_params_.master_playlist_output =
|
|
||||||
std::string(kAbsoluteOutputDir) + kMasterPlaylistName;
|
|
||||||
SimpleHlsNotifier test_notifier(hls_params_);
|
|
||||||
|
|
||||||
std::unique_ptr<MockMasterPlaylist> mock_master_playlist(
|
|
||||||
new MockMasterPlaylist());
|
|
||||||
std::unique_ptr<MockMediaPlaylistFactory> factory(
|
|
||||||
new MockMediaPlaylistFactory());
|
|
||||||
|
|
||||||
// Pointer released by SimpleHlsNotifier.
|
|
||||||
MockMediaPlaylist* mock_media_playlist =
|
|
||||||
new MockMediaPlaylist("playlist.m3u8", "", "");
|
|
||||||
|
|
||||||
EXPECT_CALL(*mock_media_playlist, SetMediaInfo(_)).WillOnce(Return(true));
|
|
||||||
EXPECT_CALL(*mock_media_playlist,
|
|
||||||
AddSegment("http://testprefix.com//var/somewhereelse/media1.ts",
|
|
||||||
_, _, _, _));
|
|
||||||
EXPECT_CALL(*factory, CreateMock(_, StrEq("video_playlist.m3u8"),
|
|
||||||
StrEq("name"), StrEq("groupid")))
|
|
||||||
.WillOnce(Return(mock_media_playlist));
|
|
||||||
|
|
||||||
InjectMasterPlaylist(std::move(mock_master_playlist), &test_notifier);
|
|
||||||
InjectMediaPlaylistFactory(std::move(factory), &test_notifier);
|
|
||||||
EXPECT_TRUE(test_notifier.Init());
|
|
||||||
MediaInfo media_info;
|
|
||||||
media_info.set_segment_template("/var/somewhereelse/media$Number$.ts");
|
|
||||||
uint32_t stream_id;
|
|
||||||
EXPECT_TRUE(test_notifier.NotifyNewStream(media_info, "video_playlist.m3u8",
|
|
||||||
"name", "groupid", &stream_id));
|
|
||||||
EXPECT_TRUE(
|
|
||||||
test_notifier.NotifyNewSegment(stream_id, "/var/somewhereelse/media1.ts",
|
|
||||||
kAnyStartTime, kAnyDuration, 0, kAnySize));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(SimpleHlsNotifierTest, Flush) {
|
TEST_F(SimpleHlsNotifierTest, Flush) {
|
||||||
SimpleHlsNotifier notifier(hls_params_);
|
SimpleHlsNotifier notifier(hls_params_);
|
||||||
std::unique_ptr<MockMasterPlaylist> mock_master_playlist(
|
std::unique_ptr<MockMasterPlaylist> mock_master_playlist(
|
||||||
|
@ -565,6 +371,124 @@ TEST_F(SimpleHlsNotifierTest, NotifyCueEvent) {
|
||||||
EXPECT_TRUE(notifier.NotifyCueEvent(stream_id, kCueEventTimestamp));
|
EXPECT_TRUE(notifier.NotifyCueEvent(stream_id, kCueEventTimestamp));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct RebaseUrlTestData {
|
||||||
|
// Base URL is the prefix of segment URL and media playlist URL if it is
|
||||||
|
// specified; otherwise, relative URL is used for the relavent URLs.
|
||||||
|
std::string base_url;
|
||||||
|
// A local path to a directory where the master playlist should output.
|
||||||
|
std::string master_playlist_dir;
|
||||||
|
// Media playlist path. This may be relative or absolute.
|
||||||
|
std::string playlist_path;
|
||||||
|
// Media segment path. This may be relative or absolute.
|
||||||
|
std::string segment_path;
|
||||||
|
// Expected segment URL in the media playlist:
|
||||||
|
// - If |base_url| is specified, it is |base_url| +
|
||||||
|
// |relative path of segment_path from master_playlist_dir|.
|
||||||
|
// - Otherwise, it is
|
||||||
|
// |relative path of segment_path from directory that contains
|
||||||
|
// playlist_path|.
|
||||||
|
std::string expected_segment_url;
|
||||||
|
// Init media segment path. This may be relative or absolute.
|
||||||
|
std::string init_segment_path;
|
||||||
|
// Expected init segment URL in the media playlist:
|
||||||
|
// - If |base_url| is specified, it is |base_url| +
|
||||||
|
// |relative path of init_segment_path from master_playlist_dir|.
|
||||||
|
// - Otherwise, it is
|
||||||
|
// |relative path of init_segment_path from directory that contains
|
||||||
|
// playlist_path|.
|
||||||
|
std::string expected_init_segment_url;
|
||||||
|
};
|
||||||
|
|
||||||
|
class SimpleHlsNotifierRebaseUrlTest
|
||||||
|
: public SimpleHlsNotifierTest,
|
||||||
|
public WithParamInterface<RebaseUrlTestData> {
|
||||||
|
protected:
|
||||||
|
void SetUp() override { test_data_ = GetParam(); }
|
||||||
|
|
||||||
|
RebaseUrlTestData test_data_;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_P(SimpleHlsNotifierRebaseUrlTest, Test) {
|
||||||
|
hls_params_.base_url = test_data_.base_url;
|
||||||
|
hls_params_.master_playlist_output =
|
||||||
|
test_data_.master_playlist_dir + kMasterPlaylistName;
|
||||||
|
SimpleHlsNotifier test_notifier(hls_params_);
|
||||||
|
|
||||||
|
std::unique_ptr<MockMasterPlaylist> mock_master_playlist(
|
||||||
|
new MockMasterPlaylist());
|
||||||
|
std::unique_ptr<MockMediaPlaylistFactory> factory(
|
||||||
|
new MockMediaPlaylistFactory());
|
||||||
|
|
||||||
|
// Pointer released by SimpleHlsNotifier.
|
||||||
|
MockMediaPlaylist* mock_media_playlist =
|
||||||
|
new MockMediaPlaylist(test_data_.playlist_path, "", "");
|
||||||
|
|
||||||
|
EXPECT_CALL(
|
||||||
|
*mock_media_playlist,
|
||||||
|
SetMediaInfo(Property(&MediaInfo::init_segment_url,
|
||||||
|
StrEq(test_data_.expected_init_segment_url))))
|
||||||
|
.WillOnce(Return(true));
|
||||||
|
|
||||||
|
if (!test_data_.expected_segment_url.empty()) {
|
||||||
|
EXPECT_CALL(*mock_media_playlist,
|
||||||
|
AddSegment(test_data_.expected_segment_url, _, _, _, _));
|
||||||
|
}
|
||||||
|
EXPECT_CALL(*factory, CreateMock(_, StrEq(test_data_.playlist_path),
|
||||||
|
StrEq("name"), StrEq("groupid")))
|
||||||
|
.WillOnce(Return(mock_media_playlist));
|
||||||
|
|
||||||
|
InjectMasterPlaylist(std::move(mock_master_playlist), &test_notifier);
|
||||||
|
InjectMediaPlaylistFactory(std::move(factory), &test_notifier);
|
||||||
|
EXPECT_TRUE(test_notifier.Init());
|
||||||
|
|
||||||
|
MediaInfo media_info;
|
||||||
|
if (!test_data_.init_segment_path.empty())
|
||||||
|
media_info.set_init_segment_name(test_data_.init_segment_path);
|
||||||
|
uint32_t stream_id;
|
||||||
|
EXPECT_TRUE(test_notifier.NotifyNewStream(
|
||||||
|
media_info, test_data_.playlist_path, "name", "groupid", &stream_id));
|
||||||
|
if (!test_data_.segment_path.empty()) {
|
||||||
|
EXPECT_TRUE(test_notifier.NotifyNewSegment(
|
||||||
|
stream_id, test_data_.segment_path, kAnyStartTime, kAnyDuration, 0,
|
||||||
|
kAnySize));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_CASE_P(
|
||||||
|
RebaseUrl,
|
||||||
|
SimpleHlsNotifierRebaseUrlTest,
|
||||||
|
::testing::Values(
|
||||||
|
// Verify relative segment path.
|
||||||
|
RebaseUrlTestData{
|
||||||
|
"http://testprefix.com/", "master_directory/",
|
||||||
|
"video_playlist.m3u8", "master_directory/path/to/media1.ts",
|
||||||
|
"http://testprefix.com/path/to/media1.ts",
|
||||||
|
"" /* init segment path */, "" /* expected init segment url */},
|
||||||
|
// Verify relative init segment path.
|
||||||
|
RebaseUrlTestData{"http://testprefix.com/", "master_directory/",
|
||||||
|
"video_playlist.m3u8", "" /* segment path */,
|
||||||
|
"" /* expected segment url */,
|
||||||
|
"master_directory/path/to/init.mp4",
|
||||||
|
"http://testprefix.com/path/to/init.mp4"},
|
||||||
|
// Verify segment url relative to playlist.
|
||||||
|
RebaseUrlTestData{
|
||||||
|
"" /* no base_url */, "master_directory/",
|
||||||
|
"video/video_playlist.m3u8",
|
||||||
|
"master_directory/video/path/to/media1.m4s", "path/to/media1.m4s",
|
||||||
|
"master_directory/video/path/to/init.mp4", "path/to/init.mp4"},
|
||||||
|
// Verify absolute directory.
|
||||||
|
RebaseUrlTestData{
|
||||||
|
"http://testprefix.com/", "/tmp/something/", "video_playlist.m3u8",
|
||||||
|
"/tmp/something/media1.ts", "http://testprefix.com/media1.ts",
|
||||||
|
"" /* init segment path */, "" /* expected init segment url */},
|
||||||
|
// Verify absolute directory, but media in a different directory.
|
||||||
|
// Note that we don't really expect this in practice.
|
||||||
|
RebaseUrlTestData{"http://testprefix.com/", "/tmp/something/",
|
||||||
|
"video_playlist.m3u8", "/var/somewhereelse/media1.ts",
|
||||||
|
"http://testprefix.com//var/somewhereelse/media1.ts",
|
||||||
|
"" /* init segment path */,
|
||||||
|
"" /* expected init segment url */}));
|
||||||
|
|
||||||
class LiveOrEventSimpleHlsNotifierTest
|
class LiveOrEventSimpleHlsNotifierTest
|
||||||
: public SimpleHlsNotifierTest,
|
: public SimpleHlsNotifierTest,
|
||||||
public WithParamInterface<HlsPlaylistType> {
|
public WithParamInterface<HlsPlaylistType> {
|
||||||
|
|
Loading…
Reference in New Issue