From dd787e2f2a553f840b628760365295639e9c58d6 Mon Sep 17 00:00:00 2001 From: Martchus Date: Wed, 18 Aug 2021 22:48:17 +0200 Subject: [PATCH] Extend Ogg related tests * Test writing trailing zero lacing value if required * Test adding cover --- CMakeLists.txt | 2 +- scripts/download_testfiles.sh | 3 ++ tests/overall.h | 3 ++ tests/overallogg.cpp | 80 ++++++++++++++++++++++++++++++++++- tests/testfilecheck.cpp | 3 ++ 5 files changed, 89 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1621845..e764567 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/scripts/download_testfiles.sh b/scripts/download_testfiles.sh index 408cf59..825513a 100755 --- a/scripts/download_testfiles.sh +++ b/scripts/download_testfiles.sh @@ -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 diff --git a/tests/overall.h b/tests/overall.h index e51b9f0..ad3dfd1 100644 --- a/tests/overall.h +++ b/tests/overall.h @@ -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(); diff --git a/tests/overallogg.cpp b/tests/overallogg.cpp index eebb3ef..20943e0 100644 --- a/tests/overallogg.cpp +++ b/tests/overallogg.cpp @@ -5,6 +5,12 @@ #include "../tag.h" #include "../vorbis/vorbiscomment.h" +#include + +#include + +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(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); } } diff --git a/tests/testfilecheck.cpp b/tests/testfilecheck.cpp index 2bfea02..849273b 100644 --- a/tests/testfilecheck.cpp +++ b/tests/testfilecheck.cpp @@ -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" } }, }; /*!