2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
10 #include "ServiceBroker.h"
11 #include "filesystem/Directory.h"
12 #include "filesystem/File.h"
13 #include "games/tags/GameInfoTag.h"
14 #include "music/tags/MusicInfoTag.h"
15 #include "pictures/PictureInfoTag.h"
16 #include "test/TestUtils.h"
17 #include "utils/FileExtensionProvider.h"
18 #include "utils/FileUtils.h"
19 #include "utils/URIUtils.h"
20 #include "video/VideoFileItemClassify.h"
21 #include "video/VideoInfoTag.h"
25 #include <gtest/gtest.h>
31 StubDefinition(const std::string
& path
,
33 const std::string
& tagPath
= "",
34 bool isFolder
= false)
35 : item(path
, isFolder
), result(res
)
40 item
.GetVideoInfoTag()->m_strPath
= tagPath
;
42 item
.GetVideoInfoTag()->m_strFileNameAndPath
= tagPath
;
50 class DiscStubTest
: public testing::WithParamInterface
<StubDefinition
>, public testing::Test
54 TEST_P(DiscStubTest
, IsDiscStub
)
56 EXPECT_EQ(VIDEO::IsDiscStub(GetParam().item
), GetParam().result
);
59 const auto discstub_tests
= std::array
{
60 StubDefinition
{"/home/user/test.disc"},
61 StubDefinition
{"videodb://foo/bar", true, "/home/user/test.disc"},
62 StubDefinition
{"videodb://foo/bar", false, "/home/user/test.disc", true},
63 StubDefinition
{"/home/user/test.avi", false},
66 INSTANTIATE_TEST_SUITE_P(TestVideoFileItemClassify
,
68 testing::ValuesIn(discstub_tests
));
70 struct VideoClassifyTest
72 VideoClassifyTest(const std::string
& path
,
74 const std::string
& mime
= "",
76 : item(path
, false), result(res
)
79 item
.SetMimeType(mime
);
83 item
.GetVideoInfoTag()->m_strFileNameAndPath
= path
;
86 item
.GetGameInfoTag()->SetGameClient("some_client");
89 item
.GetMusicInfoTag()->SetPlayCount(1);
92 item
.GetPictureInfoTag()->SetInfo("foo", "bar");
104 class VideoTest
: public testing::WithParamInterface
<VideoClassifyTest
>, public testing::Test
108 TEST_P(VideoTest
, IsVideo
)
110 EXPECT_EQ(VIDEO::IsVideo(GetParam().item
), GetParam().result
);
113 const auto video_tests
= std::array
{
114 VideoClassifyTest
{"/home/user/video.avi", true, "video/avi"},
115 VideoClassifyTest
{"/home/user/video.avi", true, "", 1},
116 VideoClassifyTest
{"/home/user/video.gam", false, "", 2},
117 VideoClassifyTest
{"/home/user/video.mus", false, "", 3},
118 VideoClassifyTest
{"/home/user/video.pic", false, "", 4},
119 VideoClassifyTest
{"pvr://recordings/tv/1", true},
120 VideoClassifyTest
{"pvr://123", false},
121 VideoClassifyTest
{"dvd://VIDEO_TS/video_ts.ifo", true},
122 VideoClassifyTest
{"dvd://1", true},
123 VideoClassifyTest
{"/home/user/video.not", true, "application/ogg"},
124 VideoClassifyTest
{"/home/user/video.not", true, "application/mp4"},
125 VideoClassifyTest
{"/home/user/video.not", true, "application/mxf"},
128 INSTANTIATE_TEST_SUITE_P(TestVideoFileItemClassify
, VideoTest
, testing::ValuesIn(video_tests
));
130 TEST(TestVideoFileItemClassify
, VideoExtensions
)
132 const auto& exts
= CServiceBroker::GetFileExtensionProvider().GetVideoExtensions();
133 for (const auto& ext
: StringUtils::Split(exts
, "|"))
137 EXPECT_TRUE(VIDEO::IsVideo(CFileItem(ext
, false)));
142 TEST(TestVideoFileItemClassify
, IsBDFile
)
144 EXPECT_TRUE(VIDEO::IsBDFile(CFileItem("/home/foo/index.BDMV", false)));
145 EXPECT_TRUE(VIDEO::IsBDFile(CFileItem("smb://foo/bar/index.bdm", false)));
146 EXPECT_TRUE(VIDEO::IsBDFile(CFileItem("ftp://foo:bar@foobar.com/movieobject.BDMV", false)));
147 EXPECT_TRUE(VIDEO::IsBDFile(CFileItem("https://foobar.com/movieobj.bdm", false)));
148 EXPECT_FALSE(VIDEO::IsBDFile(CFileItem("https://foobar.com/movieobject.not", false)));
151 TEST(TestVideoFileItemClassify
, IsDVDFile
)
153 EXPECT_TRUE(VIDEO::IsDVDFile(CFileItem("/home/foo/video_ts.vob", false), true, false));
154 EXPECT_TRUE(VIDEO::IsDVDFile(CFileItem("/home/foo/video_ts.VOB", false), true, true));
155 EXPECT_FALSE(VIDEO::IsDVDFile(CFileItem("/home/foo/video_TS.vob", false), false, false));
156 EXPECT_FALSE(VIDEO::IsDVDFile(CFileItem("/home/foo/video_ts.VOb", false), false, true));
158 EXPECT_TRUE(VIDEO::IsDVDFile(CFileItem("/home/foo/vts_yo_0.vob", false), true, false));
159 EXPECT_TRUE(VIDEO::IsDVDFile(CFileItem("/home/foo/vts_0_ifo.vob", false), true, true));
160 EXPECT_FALSE(VIDEO::IsDVDFile(CFileItem("/home/foo/VTS_123456_0.vob", false), false, false));
161 EXPECT_FALSE(VIDEO::IsDVDFile(CFileItem("/home/foo/VTS_qwerty_0.VOB", false), false, true));
163 EXPECT_TRUE(VIDEO::IsDVDFile(CFileItem("/home/foo/video_ts.IFO", false), false, true));
164 EXPECT_TRUE(VIDEO::IsDVDFile(CFileItem("/home/foo/video_ts.IFO", false), true, true));
165 EXPECT_FALSE(VIDEO::IsDVDFile(CFileItem("/home/foo/video_ts.IFO", false), false, false));
166 EXPECT_FALSE(VIDEO::IsDVDFile(CFileItem("/home/foo/video_ts.IFO", false), true, false));
168 EXPECT_TRUE(VIDEO::IsDVDFile(CFileItem("/home/foo/vts_ab_0.ifo", false), false, true));
169 EXPECT_TRUE(VIDEO::IsDVDFile(CFileItem("/home/foo/vts_ab_0.ifo", false), false, true));
170 EXPECT_FALSE(VIDEO::IsDVDFile(CFileItem("/home/foo/VTS_ab_0.ifo", false), false, false));
171 EXPECT_FALSE(VIDEO::IsDVDFile(CFileItem("/home/foo/VTS_ab_0.ifo", false), false, false));
174 TEST(TestVideoFileItemClassify
, IsProtectedBlurayDisc
)
176 const auto temp_file
= CXBMCTestUtils::Instance().CreateTempFile("bluraytest");
177 const std::string dir
= CXBMCTestUtils::Instance().TempFileDirectory(temp_file
);
178 CFileUtils::DeleteItem(URIUtils::AddFileToFolder(dir
, "AACS", "Unit_Key_RO.inf"));
179 EXPECT_FALSE(VIDEO::IsProtectedBlurayDisc(CFileItem(dir
, true)));
180 XFILE::CDirectory::Create(URIUtils::AddFileToFolder(dir
, "AACS"));
181 XFILE::CFile inf_file
;
182 inf_file
.OpenForWrite(URIUtils::AddFileToFolder(dir
, "AACS", "Unit_Key_RO.inf"));
184 EXPECT_TRUE(VIDEO::IsProtectedBlurayDisc(CFileItem(dir
, true)));
185 CFileUtils::DeleteItem(URIUtils::AddFileToFolder(dir
, "AACS", "Unit_Key_RO.inf"));
186 CXBMCTestUtils::Instance().DeleteTempFile(temp_file
);
189 TEST(TestVideoFileItemClassify
, IsSubtitle
)
191 const auto& exts
= CServiceBroker::GetFileExtensionProvider().GetSubtitleExtensions();
192 for (const auto& ext
: StringUtils::Split(exts
, "|"))
196 EXPECT_TRUE(VIDEO::IsSubtitle(CFileItem("random" + ext
, false)));
200 EXPECT_FALSE(VIDEO::IsSubtitle(CFileItem("random.notasub", false)));
203 TEST(TestVideoFileItemClassify
, IsVideoAssetsFile
)
205 EXPECT_TRUE(VIDEO::IsVideoAssetFile(CFileItem("videodb://foo/bar?videoversionid=1", false)));
206 EXPECT_FALSE(VIDEO::IsVideoAssetFile(CFileItem("videodb://foo/bar?videoversionid=1", true)));
207 EXPECT_FALSE(VIDEO::IsVideoAssetFile(CFileItem("videodb://foo/bar", false)));
210 TEST(TestVideoFileItemClassify
, IsVideoDb
)
212 EXPECT_TRUE(VIDEO::IsVideoDb(CFileItem("videodb://1/2/3", false)));
213 EXPECT_TRUE(VIDEO::IsVideoDb(CFileItem("videodb://1/2/", true)));
214 EXPECT_FALSE(VIDEO::IsVideoDb(CFileItem("/videodb/home/foo/Extraordinary/", true)));
217 TEST(TestVideoFileItemClassify
, IsVideoExtrasFolder
)
219 EXPECT_TRUE(VIDEO::IsVideoExtrasFolder(CFileItem("/home/foo/Extras/", true)));
220 EXPECT_TRUE(VIDEO::IsVideoExtrasFolder(CFileItem("/home/foo/extras/", true)));
221 EXPECT_FALSE(VIDEO::IsVideoExtrasFolder(CFileItem("/home/foo/Extraordinary/", true)));
222 EXPECT_FALSE(VIDEO::IsVideoExtrasFolder(CFileItem("/home/foo/Extras/abc.mkv", false)));