Extend Ogg related tests

* Test writing trailing zero lacing value if required
* Test adding cover
This commit is contained in:
Martchus 2021-08-18 22:48:17 +02:00
parent ee9aeb00b4
commit dd787e2f2a
5 changed files with 89 additions and 2 deletions

View File

@ -10,7 +10,7 @@ set(META_APP_URL "https://github.com/${META_APP_AUTHOR}/${META_PROJECT_NAME}")
set(META_APP_DESCRIPTION "C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags")
set(META_VERSION_MAJOR 10)
set(META_VERSION_MINOR 1)
set(META_VERSION_PATCH 0)
set(META_VERSION_PATCH 1)
set(META_REQUIRED_CPP_UNIT_VERSION 1.14.0)
set(META_ADD_DEFAULT_CPP_UNIT_TEST_APPLICATION ON)

View File

@ -66,6 +66,9 @@ testfiles=(
'mtx-test-data/ogg/qt4dance_medium.ogg'
'mtx-test-data/opus/v-opus.ogg'
'misc/multiple_id3v2_4_values.mp3'
'ogg/noise-without-cover.opus'
'ogg/noise-broken-segment-termination.opus'
'ogg/example-cover.png'
)
# download the files

View File

@ -92,7 +92,9 @@ private:
void checkOggTestfile1();
void checkOggTestfile2();
void checkOggTestfile3();
void checkOggTestMetaData();
void checkOggTestMetaDataCover();
void checkFlacTestfile1();
void checkFlacTestfile2();
@ -102,6 +104,7 @@ private:
void setMp3TestMetaData1();
void setMp3TestMetaData2();
void setOggTestMetaData();
void setOggTestMetaDataCover();
void removeAllTags();
void noop();
void alterMp4Tracks();

View File

@ -5,6 +5,12 @@
#include "../tag.h"
#include "../vorbis/vorbiscomment.h"
#include <c++utilities/io/misc.h>
#include <functional>
using namespace CppUtilities;
/*!
* \brief Checks "mtx-test-data/ogg/qt4dance_medium.ogg"
*/
@ -87,6 +93,56 @@ void OverallTests::checkOggTestfile2()
CPPUNIT_ASSERT(m_diag.level() <= DiagLevel::Information);
}
/*!
* \brief Checks "ogg/noise-*.opus".
*/
void OverallTests::checkOggTestfile3()
{
CPPUNIT_ASSERT_EQUAL(ContainerFormat::Ogg, m_fileInfo.containerFormat());
const auto tracks = m_fileInfo.tracks();
CPPUNIT_ASSERT_EQUAL(1_st, tracks.size());
for (const auto &track : tracks) {
switch (track->id()) {
case 1843569915:
CPPUNIT_ASSERT_EQUAL(MediaType::Audio, track->mediaType());
CPPUNIT_ASSERT_EQUAL(GeneralMediaFormat::Opus, track->format().general);
CPPUNIT_ASSERT_EQUAL(static_cast<std::uint16_t>(2), track->channelCount());
CPPUNIT_ASSERT_EQUAL(48000u, track->samplingFrequency());
CPPUNIT_ASSERT_EQUAL(TimeSpan::fromSeconds(19.461), track->duration());
break;
default:
CPPUNIT_FAIL("unknown track ID");
}
}
const auto tags = m_fileInfo.tags();
switch (m_tagStatus) {
case TagStatus::Original:
CPPUNIT_ASSERT(m_fileInfo.hasAnyTag());
CPPUNIT_ASSERT_EQUAL(1_st, tags.size());
CPPUNIT_ASSERT_EQUAL("Lavf58.76.100"s, tags.front()->value(KnownField::Encoder).toString());
CPPUNIT_ASSERT_EQUAL("eng"s, tags.front()->value(KnownField::Language).toString());
[[fallthrough]];
case TagStatus::TestMetaDataPresent:
checkOggTestMetaDataCover();
break;
case TagStatus::Removed:
CPPUNIT_ASSERT_EQUAL(0_st, tags.size());
}
if (m_tagStatus != TagStatus::Original) {
CPPUNIT_ASSERT_MESSAGE("no warnings for non-broken file", m_diag.level() <= DiagLevel::Information);
return;
}
CPPUNIT_ASSERT_EQUAL_MESSAGE("warning present", DiagLevel::Warning, m_diag.level());
for (const auto &msg : m_diag) {
if (msg.level() == DiagLevel::Warning) {
CPPUNIT_ASSERT_EQUAL_MESSAGE("warning due to broken segment termination", "3 bytes left in last segment."s, msg.message());
CPPUNIT_ASSERT_EQUAL_MESSAGE("warning relates to Vorbis comment", "parsing Vorbis comment"s, msg.context());
break;
}
}
}
/*!
* \brief Checks whether test meta data for OGG files has been applied correctly.
*/
@ -109,6 +165,18 @@ void OverallTests::checkOggTestMetaData()
m_preservedMetaData.pop();
}
void OverallTests::checkOggTestMetaDataCover()
{
// check whether a tag is assigned
const auto tags = m_fileInfo.tags();
const auto *const tag = m_fileInfo.vorbisComment();
CPPUNIT_ASSERT_EQUAL(1_st, tags.size());
CPPUNIT_ASSERT(tag != nullptr);
const auto expectedCoverData = readFile(testFilePath("ogg/example-cover.png"));
CPPUNIT_ASSERT_EQUAL_MESSAGE("expected cover assigned", std::string_view(expectedCoverData), tag->value(KnownField::Cover).data());
}
void OverallTests::setOggTestMetaData()
{
// ensure a tag exists
@ -124,6 +192,13 @@ void OverallTests::setOggTestMetaData()
// TODO: set more fields
}
void OverallTests::setOggTestMetaDataCover()
{
auto *const tag = m_fileInfo.createVorbisComment();
const auto cover = readFile(testFilePath("ogg/example-cover.png"));
tag->setValue(KnownField::Cover, TagValue(cover.data(), cover.size(), TagDataType::Picture));
}
/*!
* \brief Tests the Ogg parser via MediaFileInfo.
* \remarks FLAC in Ogg is tested in testFlacParsing().
@ -135,6 +210,7 @@ void OverallTests::testOggParsing()
m_tagStatus = TagStatus::Original;
parseFile(testFilePath("mtx-test-data/ogg/qt4dance_medium.ogg"), &OverallTests::checkOggTestfile1);
parseFile(testFilePath("mtx-test-data/opus/v-opus.ogg"), &OverallTests::checkOggTestfile2);
parseFile(testFilePath("ogg/noise-broken-segment-termination.opus"), &OverallTests::checkOggTestfile3);
}
/*!
@ -166,8 +242,10 @@ void OverallTests::testOggMaking()
// do actual tests
m_tagStatus = (m_mode & RemoveTag) ? TagStatus::Removed : TagStatus::TestMetaDataPresent;
void (OverallTests::*modifyRoutine)(void) = (m_mode & RemoveTag) ? &OverallTests::removeAllTags : &OverallTests::setOggTestMetaData;
const auto modifyRoutine = (m_mode & RemoveTag) ? &OverallTests::removeAllTags : &OverallTests::setOggTestMetaData;
const auto modifyRoutineCover = (m_mode & RemoveTag) ? &OverallTests::removeAllTags : &OverallTests::setOggTestMetaDataCover;
makeFile(workingCopyPath("mtx-test-data/ogg/qt4dance_medium.ogg"), modifyRoutine, &OverallTests::checkOggTestfile1);
makeFile(workingCopyPath("mtx-test-data/opus/v-opus.ogg"), modifyRoutine, &OverallTests::checkOggTestfile2);
makeFile(workingCopyPath("ogg/noise-without-cover.opus"), modifyRoutineCover, &OverallTests::checkOggTestfile3);
}
}

View File

@ -76,6 +76,9 @@ struct TestFile {
{ "mtx-test-data/ogg/qt4dance_medium.ogg", { "0b5429da9713be171c6ae0da69621261e8d5ddc9db3da872e5ade1a1c883decd" } },
{ "mtx-test-data/opus/v-opus.ogg", { "e12adece4dbcccf2471b61c3ebd7c6576dee351d85809ab6f01d6f324d65b417" } },
{ "misc/multiple_id3v2_4_values.mp3", { "da012a41213cdc49b2afe1457625d8baced1a64e2351f17b520bf82c6bfe4e03" } },
{ "ogg/noise-without-cover.opus", { "ff578894c0c47aed4cc41ae94dee2886fe2c556593e44f731135f47bca870464" } },
{ "ogg/noise-broken-segment-termination.opus", { "12835cf12b5b9fa70c239ae05e9d5bb768e715a2d61ef6301ed4af673088de45" } },
{ "ogg/example-cover.png", { "897e1a2d0cfb79c1fe5068108bb34610c3758bd0b9a7e90c1702c4e6972e0801" } },
};
/*!