diff options
Diffstat (limited to 'test')
43 files changed, 2713 insertions, 618 deletions
diff --git a/test/combine_test.cc b/test/combine_test.cc index 12cbb6e2..a5f6a57f 100644 --- a/test/combine_test.cc +++ b/test/combine_test.cc @@ -87,10 +87,12 @@ check_no_errors (boost::filesystem::path path) { vector<boost::filesystem::path> directories; directories.push_back (path); - auto notes = dcp::verify(directories, {}, &stage, &progress, {}, xsd_test); + auto notes = dcp::verify(directories, {}, &stage, &progress, {}, xsd_test).notes; vector<dcp::VerificationNote> filtered_notes; std::copy_if (notes.begin(), notes.end(), std::back_inserter(filtered_notes), [](dcp::VerificationNote const& i) { - return i.code() != dcp::VerificationNote::Code::INVALID_STANDARD && i.code() != dcp::VerificationNote::Code::INVALID_SUBTITLE_DURATION; + return i.type() != dcp::VerificationNote::Type::OK && + i.code() != dcp::VerificationNote::Code::INVALID_STANDARD && + i.code() != dcp::VerificationNote::Code::INVALID_SUBTITLE_DURATION; }); dump_notes (filtered_notes); BOOST_CHECK (filtered_notes.empty()); @@ -475,10 +477,12 @@ BOOST_AUTO_TEST_CASE(combine_multi_reel_subtitles) check_combined({in}, out); - auto notes = dcp::verify({out}, {}, &stage, &progress, {}, xsd_test); + auto notes = dcp::verify({out}, {}, &stage, &progress, {}, xsd_test).notes; vector<dcp::VerificationNote> filtered_notes; std::copy_if(notes.begin(), notes.end(), std::back_inserter(filtered_notes), [](dcp::VerificationNote const& i) { - return i.code() != dcp::VerificationNote::Code::INVALID_STANDARD && i.code() != dcp::VerificationNote::Code::MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL; + return i.type() != dcp::VerificationNote::Type::OK && + i.code() != dcp::VerificationNote::Code::INVALID_STANDARD && + i.code() != dcp::VerificationNote::Code::MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL; }); dump_notes(filtered_notes); BOOST_CHECK(filtered_notes.empty()); diff --git a/test/cpl_sar_test.cc b/test/cpl_sar_test.cc index 0ecc87e0..ab1ef182 100644 --- a/test/cpl_sar_test.cc +++ b/test/cpl_sar_test.cc @@ -33,7 +33,7 @@ #include "cpl.h" -#include "mono_picture_asset.h" +#include "mono_j2k_picture_asset.h" #include "reel_mono_picture_asset.h" #include "warnings.h" #include <libcxml/cxml.h> @@ -68,7 +68,7 @@ check (shared_ptr<dcp::ReelMonoPictureAsset> pa, dcp::Fraction frac, string sar) BOOST_AUTO_TEST_CASE (cpl_sar) { auto pa = make_shared<dcp::ReelMonoPictureAsset>( - make_shared<dcp::MonoPictureAsset>("test/ref/DCP/dcp_test1/video.mxf"), 0 + make_shared<dcp::MonoJ2KPictureAsset>("test/ref/DCP/dcp_test1/video.mxf"), 0 ); /* Easy ones */ diff --git a/test/data/text_formatter.txt b/test/data/text_formatter.txt new file mode 100644 index 00000000..8861db99 --- /dev/null +++ b/test/data/text_formatter.txt @@ -0,0 +1,8 @@ +Heading + +Subheading + * Foo + * Bar + * Fred + * Jim + * Sheila diff --git a/test/data/text_formatter_windows.txt b/test/data/text_formatter_windows.txt new file mode 100644 index 00000000..16d78d84 --- /dev/null +++ b/test/data/text_formatter_windows.txt @@ -0,0 +1,8 @@ +Heading
+
+Subheading
+ * Foo
+ * Bar
+ * Fred
+ * Jim
+ * Sheila
diff --git a/test/dcp_test.cc b/test/dcp_test.cc index 5456092c..63de990f 100644 --- a/test/dcp_test.cc +++ b/test/dcp_test.cc @@ -38,8 +38,8 @@ #include "dcp.h" #include "equality_options.h" #include "metadata.h" -#include "mono_picture_asset.h" -#include "picture_asset_writer.h" +#include "mono_j2k_picture_asset.h" +#include "j2k_picture_asset_writer.h" #include "reel.h" #include "reel_atmos_asset.h" #include "reel_markers_asset.h" @@ -49,7 +49,7 @@ #include "reel_stereo_picture_asset.h" #include "sound_asset.h" #include "sound_asset_writer.h" -#include "stereo_picture_asset.h" +#include "stereo_j2k_picture_asset.h" #include "test.h" #include <asdcp/KM_util.h> #include <sndfile.h> @@ -105,9 +105,9 @@ BOOST_AUTO_TEST_CASE (dcp_test2) cpl->set_issue_date ("2012-07-17T04:45:18+00:00"); cpl->set_annotation_text ("A Test DCP"); - auto mp = make_shared<dcp::StereoPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE); + auto mp = make_shared<dcp::StereoJ2KPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE); mp->set_metadata (mxf_meta); - auto picture_writer = mp->start_write("build/test/DCP/dcp_test2/video.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW); + auto picture_writer = mp->start_write("build/test/DCP/dcp_test2/video.mxf", dcp::Behaviour::MAKE_NEW); dcp::ArrayData j2c ("test/data/flat_red.j2c"); for (int i = 0; i < 24; ++i) { /* Left */ @@ -203,10 +203,10 @@ test_rewriting_sound(string name, bool modify) dcp::DCP B ("build/test/" + name); auto reel = make_shared<dcp::Reel>(); - BOOST_REQUIRE (A_picture->mono_asset()); - BOOST_REQUIRE (A_picture->mono_asset()->file()); - copy_file (A_picture->mono_asset()->file().get(), path("build") / "test" / name / picture); - reel->add(make_shared<dcp::ReelMonoPictureAsset>(make_shared<dcp::MonoPictureAsset>(path("build") / "test" / name / picture), 0)); + BOOST_REQUIRE(A_picture->mono_j2k_asset()); + BOOST_REQUIRE(A_picture->mono_j2k_asset()->file()); + copy_file(A_picture->mono_j2k_asset()->file().get(), path("build") / "test" / name / picture); + reel->add(make_shared<dcp::ReelMonoPictureAsset>(make_shared<dcp::MonoJ2KPictureAsset>(path("build") / "test" / name / picture), 0)); auto reader = A_sound->asset()->start_read(); auto sound = make_shared<dcp::SoundAsset>(A_sound->asset()->edit_rate(), A_sound->asset()->sampling_rate(), A_sound->asset()->channels(), dcp::LanguageTag("en-US"), dcp::Standard::SMPTE); @@ -290,9 +290,9 @@ BOOST_AUTO_TEST_CASE (dcp_test5) cpl->set_issue_date ("2012-07-17T04:45:18+00:00"); cpl->set_annotation_text ("A Test DCP"); - auto mp = make_shared<dcp::MonoPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE); + auto mp = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE); mp->set_metadata (mxf_meta); - auto picture_writer = mp->start_write("build/test/DCP/dcp_test5/video.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW); + auto picture_writer = mp->start_write("build/test/DCP/dcp_test5/video.mxf", dcp::Behaviour::MAKE_NEW); dcp::ArrayData j2c ("test/data/flat_red.j2c"); for (int i = 0; i < 24; ++i) { picture_writer->write (j2c.data (), j2c.size ()); @@ -510,8 +510,8 @@ BOOST_AUTO_TEST_CASE(hashes_preserved_when_loading_corrupted_dcp) auto dcp = make_simple(dir / "1"); dcp->write_xml(); - auto asset_1_id = dcp::MonoPictureAsset(dir / "1" / "video.mxf").id(); - auto asset_1_hash = dcp::MonoPictureAsset(dir / "1" / "video.mxf").hash(); + auto asset_1_id = dcp::MonoJ2KPictureAsset(dir / "1" / "video.mxf").id(); + auto asset_1_hash = dcp::MonoJ2KPictureAsset(dir / "1" / "video.mxf").hash(); /* Replace the hash in the CPL (the one that corresponds to the actual file) * with an incorrect one new_hash. diff --git a/test/decryption_test.cc b/test/decryption_test.cc index 8f3dbff7..1aadc461 100644 --- a/test/decryption_test.cc +++ b/test/decryption_test.cc @@ -36,11 +36,11 @@ #include "dcp.h" #include "decrypted_kdm.h" #include "encrypted_kdm.h" -#include "mono_picture_asset.h" -#include "mono_picture_asset_reader.h" -#include "mono_picture_frame.h" +#include "mono_j2k_picture_asset.h" +#include "mono_j2k_picture_asset_reader.h" +#include "mono_j2k_picture_frame.h" #include "openjpeg_image.h" -#include "picture_asset_writer.h" +#include "j2k_picture_asset_writer.h" #include "reel.h" #include "reel_file_asset.h" #include "reel_mono_picture_asset.h" @@ -80,7 +80,7 @@ get_frame (dcp::DCP const & dcp) auto picture = reel->main_picture()->asset(); BOOST_CHECK (picture); - auto mono_picture = dynamic_pointer_cast<const dcp::MonoPictureAsset>(picture); + auto mono_picture = dynamic_pointer_cast<const dcp::MonoJ2KPictureAsset>(picture); auto reader = mono_picture->start_read(); auto j2k_frame = reader->get_frame(0); auto xyz = j2k_frame->xyz_image(); @@ -152,10 +152,10 @@ BOOST_AUTO_TEST_CASE (decryption_test2) auto context_id = dcp::make_uuid(); dcp::Key key; - auto picture_asset = std::make_shared<dcp::MonoPictureAsset>(dcp::Fraction(24, 1), dcp::Standard::SMPTE); + auto picture_asset = std::make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction(24, 1), dcp::Standard::SMPTE); picture_asset->set_key (key); picture_asset->set_context_id (context_id); - auto picture_writer = picture_asset->start_write(dir / "picture.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW); + auto picture_writer = picture_asset->start_write(dir / "picture.mxf", dcp::Behaviour::MAKE_NEW); dcp::ArrayData picture("test/data/flat_red.j2c"); for (int i = 0; i < 24; ++i) { picture_writer->write(picture); diff --git a/test/encryption_test.cc b/test/encryption_test.cc index 358a3fd9..a927a5df 100644 --- a/test/encryption_test.cc +++ b/test/encryption_test.cc @@ -37,8 +37,8 @@ #include "certificate_chain.h" #include "cpl.h" #include "filesystem.h" -#include "mono_picture_asset.h" -#include "picture_asset_writer.h" +#include "mono_j2k_picture_asset.h" +#include "j2k_picture_asset_writer.h" #include "sound_asset_writer.h" #include "sound_asset.h" #include "reel.h" @@ -90,11 +90,11 @@ BOOST_AUTO_TEST_CASE (encryption_test) dcp::Key key; - auto mp = make_shared<dcp::MonoPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE); + auto mp = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE); mp->set_metadata (mxf_metadata); mp->set_key (key); - auto writer = mp->start_write("build/test/DCP/encryption_test/video.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW); + auto writer = mp->start_write("build/test/DCP/encryption_test/video.mxf", dcp::Behaviour::MAKE_NEW); dcp::ArrayData j2c ("test/data/flat_red.j2c"); for (int i = 0; i < 24; ++i) { writer->write (j2c.data (), j2c.size ()); diff --git a/test/frame_info_hash_test.cc b/test/frame_info_hash_test.cc index c19172c6..331eabf1 100644 --- a/test/frame_info_hash_test.cc +++ b/test/frame_info_hash_test.cc @@ -33,8 +33,8 @@ #include "j2k_transcode.h" -#include "mono_picture_asset.h" -#include "mono_picture_asset_writer.h" +#include "mono_j2k_picture_asset.h" +#include "mono_j2k_picture_asset_writer.h" #include "openjpeg_image.h" #include <boost/random.hpp> #include <boost/test/unit_test.hpp> @@ -47,7 +47,7 @@ using std::string; static void -check (shared_ptr<dcp::PictureAssetWriter> writer, boost::random::uniform_int_distribution<>& dist, boost::random::mt19937& rng, string hash) +check (shared_ptr<dcp::J2KPictureAssetWriter> writer, boost::random::uniform_int_distribution<>& dist, boost::random::mt19937& rng, string hash) { auto xyz = make_shared<dcp::OpenJPEGImage>(dcp::Size(1998, 1080)); for (int c = 0; c < 3; ++c) { @@ -66,14 +66,14 @@ check (shared_ptr<dcp::PictureAssetWriter> writer, boost::random::uniform_int_di /** Test the hashing of data written to JPEG2000 MXFs with some random inputs */ BOOST_AUTO_TEST_CASE (frame_info_hash_test) { - auto mp = make_shared<dcp::MonoPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE); - auto writer = mp->start_write("build/test/frame_info_hash_test.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW); + auto mp = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE); + auto writer = mp->start_write("build/test/frame_info_hash_test.mxf", dcp::Behaviour::MAKE_NEW); boost::random::mt19937 rng(1); boost::random::uniform_int_distribution<> dist(0, 4095); /* Check a few random frames */ - check(writer, dist, rng, "a9e772602a2fd3135d940cfd727ab8ff"); - check(writer, dist, rng, "b075369922e42b23e1852a586ec43224"); - check(writer, dist, rng, "402395e76152db05b03c8f24ddfd7732"); + check(writer, dist, rng, "8f3dc7321d6dff3d5691011de31fc713"); + check(writer, dist, rng, "a305b83a40367fda1b5cf0efa096fd18"); + check(writer, dist, rng, "1abc71e011ced46d9928a4b2d22e20f6"); } diff --git a/test/kdm_test.cc b/test/kdm_test.cc index 6f06b4c9..75a6019e 100644 --- a/test/kdm_test.cc +++ b/test/kdm_test.cc @@ -36,8 +36,8 @@ #include "cpl.h" #include "decrypted_kdm.h" #include "encrypted_kdm.h" -#include "mono_picture_asset.h" -#include "picture_asset_writer.h" +#include "mono_j2k_picture_asset.h" +#include "j2k_picture_asset_writer.h" #include "reel.h" #include "reel_mono_picture_asset.h" #include "reel_sound_asset.h" @@ -256,9 +256,9 @@ BOOST_AUTO_TEST_CASE (validity_period_test1) auto signer = make_shared<dcp::CertificateChain>(dcp::file_to_string("test/data/certificate_chain")); signer->set_key(dcp::file_to_string("test/data/private.key")); - auto asset = make_shared<dcp::MonoPictureAsset>(dcp::Fraction(24, 1), dcp::Standard::SMPTE); + auto asset = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction(24, 1), dcp::Standard::SMPTE); asset->set_key (dcp::Key()); - auto writer = asset->start_write("build/test/validity_period_test1.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW); + auto writer = asset->start_write("build/test/validity_period_test1.mxf", dcp::Behaviour::MAKE_NEW); dcp::ArrayData frame ("test/data/flat_red.j2c"); writer->write (frame.data(), frame.size()); writer->finalize (); @@ -320,7 +320,7 @@ BOOST_AUTO_TEST_CASE (vf_kdm_test) ov->write_xml (); auto ov_reel = ov->cpls()[0]->reels()[0]; - auto ov_reel_picture = make_shared<dcp::ReelMonoPictureAsset>(dynamic_pointer_cast<dcp::ReelMonoPictureAsset>(ov_reel->main_picture())->mono_asset(), 0); + auto ov_reel_picture = make_shared<dcp::ReelMonoPictureAsset>(dynamic_pointer_cast<dcp::ReelMonoPictureAsset>(ov_reel->main_picture())->mono_j2k_asset(), 0); auto ov_reel_sound = make_shared<dcp::ReelSoundAsset>(ov_reel->main_sound()->asset(), 0); /* Make VF */ @@ -376,7 +376,7 @@ BOOST_AUTO_TEST_CASE (vf_kdm_test) BOOST_REQUIRE_EQUAL(reload_vf.cpls()[0]->reels().size(), 1U); BOOST_REQUIRE(reload_vf.cpls()[0]->reels()[0]->main_picture()); BOOST_REQUIRE(reload_vf.cpls()[0]->reels()[0]->main_picture()->asset()); - auto mono_asset = dynamic_pointer_cast<dcp::MonoPictureAsset>(reload_vf.cpls()[0]->reels()[0]->main_picture()->asset()); + auto mono_asset = dynamic_pointer_cast<dcp::MonoJ2KPictureAsset>(reload_vf.cpls()[0]->reels()[0]->main_picture()->asset()); BOOST_REQUIRE(mono_asset); auto reader = mono_asset->start_read(); reader->set_check_hmac(false); diff --git a/test/mca_test.cc b/test/mca_test.cc index bdfc9484..1cd95732 100644 --- a/test/mca_test.cc +++ b/test/mca_test.cc @@ -168,7 +168,8 @@ check_mca_descriptors(int suffix, vector<dcp::Channel> extra_active_channels, ve /* Check MXF */ - auto reader = new ASDCP::PCM::MXFReader(); + Kumu::FileReaderFactory factory; + auto reader = new ASDCP::PCM::MXFReader(factory); reader->OpenRead(boost::filesystem::path(dir / "mxf.mxf").string()); list<ASDCP::MXF::InterchangeObject*> channels; diff --git a/test/mono_mpeg2_picture_read_test.cc b/test/mono_mpeg2_picture_read_test.cc new file mode 100644 index 00000000..f0d4aac0 --- /dev/null +++ b/test/mono_mpeg2_picture_read_test.cc @@ -0,0 +1,62 @@ +/* + Copyright (C) 2023 Carl Hetherington <cth@carlh.net> + + This file is part of libdcp. + + libdcp is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + libdcp is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with libdcp. If not, see <http://www.gnu.org/licenses/>. + + In addition, as a special exception, the copyright holders give + permission to link the code of portions of this program with the + OpenSSL library under certain conditions as described in each + individual source file, and distribute linked combinations + including the two. + + You must obey the GNU General Public License in all respects + for all of the code used other than OpenSSL. If you modify + file(s) with this exception, you may extend this exception to your + version of the file(s), but you are not obligated to do so. If you + do not wish to do so, delete this exception statement from your + version. If you delete this exception statement from all source + files in the program, then also delete it here. +*/ + + +#include "mono_mpeg2_picture_asset.h" +#include "mpeg2_transcode.h" +#include "test.h" +#include <boost/test/unit_test.hpp> + +extern "C" { +#include <libavcodec/avcodec.h> +} + + +BOOST_AUTO_TEST_CASE(mpeg_mono_picture_read_test) +{ + dcp::MonoMPEG2PictureAsset asset(private_test / "data" / "mas" / "r2.mxf" ); + std::cout << "frame rate " << asset.frame_rate().numerator << "\n"; + std::cout << "duration " << asset.intrinsic_duration() << "\n"; + + auto reader = asset.start_read(); + + dcp::MPEG2Decompressor decompressor; + for (auto i = 0; i < asset.intrinsic_duration(); ++i) { + auto images = decompressor.decompress_frame(reader->get_frame(i)); + BOOST_CHECK_EQUAL(images.size(), i == 0 ? 0U : 1U); + } + + auto images = decompressor.flush(); + BOOST_CHECK_EQUAL(images.size(), 1U); +} + diff --git a/test/mono_mpeg2_picture_write_test.cc b/test/mono_mpeg2_picture_write_test.cc new file mode 100644 index 00000000..44ce5ae4 --- /dev/null +++ b/test/mono_mpeg2_picture_write_test.cc @@ -0,0 +1,101 @@ +/* + Copyright (C) 2023 Carl Hetherington <cth@carlh.net> + + This file is part of libdcp. + + libdcp is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + libdcp is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with libdcp. If not, see <http://www.gnu.org/licenses/>. + + In addition, as a special exception, the copyright holders give + permission to link the code of portions of this program with the + OpenSSL library under certain conditions as described in each + individual source file, and distribute linked combinations + including the two. + + You must obey the GNU General Public License in all respects + for all of the code used other than OpenSSL. If you modify + file(s) with this exception, you may extend this exception to your + version of the file(s), but you are not obligated to do so. If you + do not wish to do so, delete this exception statement from your + version. If you delete this exception statement from all source + files in the program, then also delete it here. +*/ + + +#include "mono_mpeg2_picture_asset.h" +#include "mpeg2_transcode.h" +#include "test.h" +#include <boost/test/unit_test.hpp> + +extern "C" { +#include <libavcodec/avcodec.h> +} + + +BOOST_AUTO_TEST_CASE(mpeg_mono_picture_write_test) +{ + boost::filesystem::path dir = "build/test/mpeg2_mono_picture_write_test"; + + boost::system::error_code ec; + boost::filesystem::remove_all(dir); + boost::filesystem::create_directories(dir); + + dcp::MonoMPEG2PictureAsset asset(dcp::Fraction{24, 1}); + auto writer = asset.start_write(dir / "test.mxf", dcp::Behaviour::MAKE_NEW); + + dcp::MPEG2Compressor compressor({1920, 1080}, 24, 50000000); + dcp::FFmpegImage image(int64_t(0)); + for (auto y = 0; y < 1080; ++y) { + uint8_t* py = image.y() + y * image.y_stride(); + for (auto x = 0; x < 1920; ++x) { + if (x < 640) { + *py++ = 76; + } else if (x < 1280) { + *py++ = 149; + } else { + *py++ = 29; + } + } + } + + for (auto y = 0; y < 540; ++y) { + uint8_t* pu = image.u() + y * image.u_stride(); + uint8_t* pv = image.v() + y * image.v_stride(); + for (auto x = 0; x < 960; ++x) { + if (x < 320) { + *pu++ = 84; + *pv++ = 255; + } else if (x < 640) { + *pu++ = 43; + *pv++ = 21; + } else { + *pu++ = 255; + *pv++ = 107; + } + } + } + + for (auto i = 0; i < 24; ++i) { + image.set_pts(int64_t(i)); + if (auto compressed = compressor.compress_frame(image)) { + writer->write(compressed->first->data(), compressed->first->size()); + } + } + + if (auto compressed = compressor.flush()) { + writer->write(compressed->first->data(), compressed->first->size()); + } + + writer->finalize(); +} + diff --git a/test/recovery_test.cc b/test/recovery_test.cc index eaf34f81..327c248a 100644 --- a/test/recovery_test.cc +++ b/test/recovery_test.cc @@ -32,8 +32,8 @@ */ -#include "mono_picture_asset_writer.h" -#include "mono_picture_asset.h" +#include "mono_j2k_picture_asset_writer.h" +#include "mono_j2k_picture_asset.h" #include "test.h" #include <asdcp/KM_util.h> #include <boost/filesystem.hpp> @@ -55,10 +55,10 @@ BOOST_AUTO_TEST_CASE (recovery) boost::filesystem::remove_all ("build/test/baz"); boost::filesystem::create_directories ("build/test/baz"); - auto mp = make_shared<dcp::MonoPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE); - auto writer = mp->start_write("build/test/baz/video1.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW); + auto mp = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE); + auto writer = mp->start_write("build/test/baz/video1.mxf", dcp::Behaviour::MAKE_NEW); - int written_size = 0; + uint64_t written_size = 0; for (int i = 0; i < 24; ++i) { auto info = writer->write (data.data(), data.size()); BOOST_CHECK_EQUAL (info.hash, "c3c9a3adec09baf2b0bcb65806fbeac8"); @@ -82,13 +82,13 @@ BOOST_AUTO_TEST_CASE (recovery) Kumu::ResetTestRNG (); - mp = make_shared<dcp::MonoPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE); - writer = mp->start_write("build/test/baz/video2.mxf", dcp::PictureAsset::Behaviour::OVERWRITE_EXISTING); + mp = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE); + writer = mp->start_write("build/test/baz/video2.mxf", dcp::Behaviour::OVERWRITE_EXISTING); writer->write (data.data(), data.size()); for (int i = 1; i < 4; ++i) { - writer->fake_write (written_size); + writer->fake_write(dcp::J2KFrameInfo{0, written_size, "xxx"}); } for (int i = 4; i < 24; ++i) { diff --git a/test/ref/DCP/dcp_test1/ASSETMAP.xml b/test/ref/DCP/dcp_test1/ASSETMAP.xml index 4e0d1e5a..dc811f79 100644 --- a/test/ref/DCP/dcp_test1/ASSETMAP.xml +++ b/test/ref/DCP/dcp_test1/ASSETMAP.xml @@ -37,7 +37,7 @@ <Path>video.mxf</Path> <VolumeIndex>1</VolumeIndex> <Offset>0</Offset> - <Length>49240</Length> + <Length>31648</Length> </Chunk> </ChunkList> </Asset> diff --git a/test/ref/DCP/dcp_test1/audio.mxf b/test/ref/DCP/dcp_test1/audio.mxf Binary files differindex 5e08f74f..1f5f7987 100644 --- a/test/ref/DCP/dcp_test1/audio.mxf +++ b/test/ref/DCP/dcp_test1/audio.mxf diff --git a/test/ref/DCP/dcp_test1/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml b/test/ref/DCP/dcp_test1/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml index 15cda9a1..26d41070 100644 --- a/test/ref/DCP/dcp_test1/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml +++ b/test/ref/DCP/dcp_test1/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml @@ -37,7 +37,7 @@ <IntrinsicDuration>24</IntrinsicDuration> <EntryPoint>0</EntryPoint> <Duration>24</Duration> - <Hash>wUmt8G+cFFKMGt0ueS9+F1S4uhc=</Hash> + <Hash>vsVjRV9vhTBPUWfE/TT1o2vdQsI=</Hash> <FrameRate>24 1</FrameRate> <ScreenAspectRatio>1998 1080</ScreenAspectRatio> </MainPicture> @@ -47,7 +47,7 @@ <IntrinsicDuration>24</IntrinsicDuration> <EntryPoint>0</EntryPoint> <Duration>24</Duration> - <Hash>KcJb7S2K5cNm8RG4kfQD5FTeS0A=</Hash> + <Hash>3M7YTgvFKXXMEGLkIbV4miC90FE=</Hash> </MainSound> <meta:CompositionMetadataAsset xmlns:meta="http://www.smpte-ra.org/schemas/429-16/2014/CPL-Metadata"> <Id>urn:uuid:dd015243-ab77-435c-a13d-690566885121</Id> diff --git a/test/ref/DCP/dcp_test1/pkl_d199d58b-5ef8-4d49-b270-07e590ccb280.xml b/test/ref/DCP/dcp_test1/pkl_d199d58b-5ef8-4d49-b270-07e590ccb280.xml index cedbb15b..6a1392f3 100644 --- a/test/ref/DCP/dcp_test1/pkl_d199d58b-5ef8-4d49-b270-07e590ccb280.xml +++ b/test/ref/DCP/dcp_test1/pkl_d199d58b-5ef8-4d49-b270-07e590ccb280.xml @@ -9,7 +9,7 @@ <Asset> <Id>urn:uuid:6affb8ee-0020-4dff-a53c-17652f6358ab</Id> <AnnotationText>6affb8ee-0020-4dff-a53c-17652f6358ab</AnnotationText> - <Hash>tfX1mVIKJCVr1m7Y32Nzxf0+Rpw=</Hash> + <Hash>skI+5b/9LA/y6h0mcyxysJYanxI=</Hash> <Size>8559</Size> <Type>text/xml</Type> <OriginalFileName>cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml</OriginalFileName> @@ -17,15 +17,15 @@ <Asset> <Id>urn:uuid:5407b210-4441-4e97-8b16-8bdc7c12da54</Id> <AnnotationText>5407b210-4441-4e97-8b16-8bdc7c12da54</AnnotationText> - <Hash>wUmt8G+cFFKMGt0ueS9+F1S4uhc=</Hash> - <Size>49240</Size> + <Hash>vsVjRV9vhTBPUWfE/TT1o2vdQsI=</Hash> + <Size>31648</Size> <Type>application/mxf</Type> <OriginalFileName>video.mxf</OriginalFileName> </Asset> <Asset> <Id>urn:uuid:97f0f352-5b77-48ee-a558-9df37717f4fa</Id> <AnnotationText>97f0f352-5b77-48ee-a558-9df37717f4fa</AnnotationText> - <Hash>KcJb7S2K5cNm8RG4kfQD5FTeS0A=</Hash> + <Hash>3M7YTgvFKXXMEGLkIbV4miC90FE=</Hash> <Size>881326</Size> <Type>application/mxf</Type> <OriginalFileName>audio.mxf</OriginalFileName> diff --git a/test/ref/DCP/dcp_test1/video.mxf b/test/ref/DCP/dcp_test1/video.mxf Binary files differindex 27ba41cf..cd0e43af 100644 --- a/test/ref/DCP/dcp_test1/video.mxf +++ b/test/ref/DCP/dcp_test1/video.mxf diff --git a/test/ref/DCP/dcp_test2/audio.mxf b/test/ref/DCP/dcp_test2/audio.mxf Binary files differindex e8bd446f..6a95baf3 100644 --- a/test/ref/DCP/dcp_test2/audio.mxf +++ b/test/ref/DCP/dcp_test2/audio.mxf diff --git a/test/ref/DCP/dcp_test2/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml b/test/ref/DCP/dcp_test2/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml index 52a7779a..0e233325 100644 --- a/test/ref/DCP/dcp_test2/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml +++ b/test/ref/DCP/dcp_test2/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml @@ -22,7 +22,7 @@ <IntrinsicDuration>24</IntrinsicDuration> <EntryPoint>0</EntryPoint> <Duration>24</Duration> - <Hash>NzWhEbTccUIh1sSXIbU+8POVui0=</Hash> + <Hash>X+4lOvviLTQeP28hyzhCOGjraiE=</Hash> </MainSound> <msp-cpl:MainStereoscopicPicture xmlns:msp-cpl="http://www.smpte-ra.org/schemas/429-10/2008/Main-Stereo-Picture-CPL"> <Id>urn:uuid:5407b210-4441-4e97-8b16-8bdc7c12da54</Id> @@ -30,7 +30,7 @@ <IntrinsicDuration>24</IntrinsicDuration> <EntryPoint>0</EntryPoint> <Duration>24</Duration> - <Hash>BUpeFS6X9j+X0z2TZWSsLMT4pE0=</Hash> + <Hash>dU+tcR6bZ5BQ/TXKtBY03ejjUmc=</Hash> <FrameRate>48 1</FrameRate> <ScreenAspectRatio>1998 1080</ScreenAspectRatio> </msp-cpl:MainStereoscopicPicture> diff --git a/test/ref/DCP/dcp_test2/pkl_8577c7c0-be29-4eb5-a449-1e3870a42bbd.xml b/test/ref/DCP/dcp_test2/pkl_8577c7c0-be29-4eb5-a449-1e3870a42bbd.xml index 061e8a6a..794cfb85 100644 --- a/test/ref/DCP/dcp_test2/pkl_8577c7c0-be29-4eb5-a449-1e3870a42bbd.xml +++ b/test/ref/DCP/dcp_test2/pkl_8577c7c0-be29-4eb5-a449-1e3870a42bbd.xml @@ -9,7 +9,7 @@ <Asset> <Id>urn:uuid:6affb8ee-0020-4dff-a53c-17652f6358ab</Id> <AnnotationText>6affb8ee-0020-4dff-a53c-17652f6358ab</AnnotationText> - <Hash>zaAcrAcv0oOzOa3etTP6xDfzQko=</Hash> + <Hash>2jp5+JDLOh5CqzQ8goZTzBEWsPo=</Hash> <Size>1686</Size> <Type>text/xml</Type> <OriginalFileName>cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml</OriginalFileName> @@ -17,7 +17,7 @@ <Asset> <Id>urn:uuid:5407b210-4441-4e97-8b16-8bdc7c12da54</Id> <AnnotationText>5407b210-4441-4e97-8b16-8bdc7c12da54</AnnotationText> - <Hash>BUpeFS6X9j+X0z2TZWSsLMT4pE0=</Hash> + <Hash>dU+tcR6bZ5BQ/TXKtBY03ejjUmc=</Hash> <Size>63160</Size> <Type>application/mxf</Type> <OriginalFileName>video.mxf</OriginalFileName> @@ -25,7 +25,7 @@ <Asset> <Id>urn:uuid:fc843acc-1ad9-4808-b9ed-33f5319e047d</Id> <AnnotationText>fc843acc-1ad9-4808-b9ed-33f5319e047d</AnnotationText> - <Hash>NzWhEbTccUIh1sSXIbU+8POVui0=</Hash> + <Hash>X+4lOvviLTQeP28hyzhCOGjraiE=</Hash> <Size>161326</Size> <Type>application/mxf</Type> <OriginalFileName>audio.mxf</OriginalFileName> diff --git a/test/ref/DCP/dcp_test2/video.mxf b/test/ref/DCP/dcp_test2/video.mxf Binary files differindex 3b670708..6200297c 100644 --- a/test/ref/DCP/dcp_test2/video.mxf +++ b/test/ref/DCP/dcp_test2/video.mxf diff --git a/test/ref/DCP/dcp_test5/audio.mxf b/test/ref/DCP/dcp_test5/audio.mxf Binary files differindex 947865e1..fc55b975 100644 --- a/test/ref/DCP/dcp_test5/audio.mxf +++ b/test/ref/DCP/dcp_test5/audio.mxf diff --git a/test/ref/DCP/dcp_test5/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml b/test/ref/DCP/dcp_test5/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml index 5fa3643b..0dbd0198 100644 --- a/test/ref/DCP/dcp_test5/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml +++ b/test/ref/DCP/dcp_test5/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml @@ -22,7 +22,7 @@ <IntrinsicDuration>24</IntrinsicDuration> <EntryPoint>0</EntryPoint> <Duration>24</Duration> - <Hash>o3VmpdFsNUgF11oadcaGJ/IfO0M=</Hash> + <Hash>w7xIWU3Q+QnEQMq7BcOhsWO+OU0=</Hash> <FrameRate>24 1</FrameRate> <ScreenAspectRatio>1998 1080</ScreenAspectRatio> </MainPicture> @@ -32,7 +32,7 @@ <IntrinsicDuration>24</IntrinsicDuration> <EntryPoint>0</EntryPoint> <Duration>24</Duration> - <Hash>l+XLgxe2fMZDgY+0QYzDfGhvTQM=</Hash> + <Hash>5ANfi1KoyGiZ8hQIhDHm5f/OvQY=</Hash> </MainSound> <axd:AuxData xmlns:axd="http://www.dolby.com/schemas/2012/AD"> <Id>urn:uuid:b68febcc-5ddf-489a-84a7-924f29fa2afd</Id> diff --git a/test/ref/DCP/dcp_test5/pkl_d76fdaaf-8316-42dc-a87e-1719ad6ca3ca.xml b/test/ref/DCP/dcp_test5/pkl_d76fdaaf-8316-42dc-a87e-1719ad6ca3ca.xml index 49fd579b..e9b1e802 100644 --- a/test/ref/DCP/dcp_test5/pkl_d76fdaaf-8316-42dc-a87e-1719ad6ca3ca.xml +++ b/test/ref/DCP/dcp_test5/pkl_d76fdaaf-8316-42dc-a87e-1719ad6ca3ca.xml @@ -9,7 +9,7 @@ <Asset> <Id>urn:uuid:6affb8ee-0020-4dff-a53c-17652f6358ab</Id> <AnnotationText>6affb8ee-0020-4dff-a53c-17652f6358ab</AnnotationText> - <Hash>eqEIVxSAbJL+SROmqrDHbr9sb+A=</Hash> + <Hash>4zHV3/AhGYo5WjNmyuxeRSPOVwk=</Hash> <Size>2024</Size> <Type>text/xml</Type> <OriginalFileName>cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml</OriginalFileName> @@ -17,7 +17,7 @@ <Asset> <Id>urn:uuid:5407b210-4441-4e97-8b16-8bdc7c12da54</Id> <AnnotationText>5407b210-4441-4e97-8b16-8bdc7c12da54</AnnotationText> - <Hash>o3VmpdFsNUgF11oadcaGJ/IfO0M=</Hash> + <Hash>w7xIWU3Q+QnEQMq7BcOhsWO+OU0=</Hash> <Size>40144</Size> <Type>application/mxf</Type> <OriginalFileName>video.mxf</OriginalFileName> @@ -25,7 +25,7 @@ <Asset> <Id>urn:uuid:97f0f352-5b77-48ee-a558-9df37717f4fa</Id> <AnnotationText>97f0f352-5b77-48ee-a558-9df37717f4fa</AnnotationText> - <Hash>l+XLgxe2fMZDgY+0QYzDfGhvTQM=</Hash> + <Hash>5ANfi1KoyGiZ8hQIhDHm5f/OvQY=</Hash> <Size>161326</Size> <Type>application/mxf</Type> <OriginalFileName>audio.mxf</OriginalFileName> diff --git a/test/ref/DCP/dcp_test5/video.mxf b/test/ref/DCP/dcp_test5/video.mxf Binary files differindex f3e7588b..3ec65a51 100644 --- a/test/ref/DCP/dcp_test5/video.mxf +++ b/test/ref/DCP/dcp_test5/video.mxf diff --git a/test/ref/DCP/dcp_test7/ASSETMAP b/test/ref/DCP/dcp_test7/ASSETMAP index 86a6ff6a..e52b4b11 100644 --- a/test/ref/DCP/dcp_test7/ASSETMAP +++ b/test/ref/DCP/dcp_test7/ASSETMAP @@ -37,7 +37,7 @@ <Path>video.mxf</Path> <VolumeIndex>1</VolumeIndex> <Offset>0</Offset> - <Length>49240</Length> + <Length>31648</Length> </Chunk> </ChunkList> </Asset> diff --git a/test/ref/DCP/dcp_test7/audio.mxf b/test/ref/DCP/dcp_test7/audio.mxf Binary files differindex 5e08f74f..1f5f7987 100644 --- a/test/ref/DCP/dcp_test7/audio.mxf +++ b/test/ref/DCP/dcp_test7/audio.mxf diff --git a/test/ref/DCP/dcp_test7/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml b/test/ref/DCP/dcp_test7/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml index b73ef84c..13aecd8a 100644 --- a/test/ref/DCP/dcp_test7/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml +++ b/test/ref/DCP/dcp_test7/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml @@ -37,7 +37,7 @@ <IntrinsicDuration>24</IntrinsicDuration> <EntryPoint>0</EntryPoint> <Duration>24</Duration> - <Hash>wUmt8G+cFFKMGt0ueS9+F1S4uhc=</Hash> + <Hash>vsVjRV9vhTBPUWfE/TT1o2vdQsI=</Hash> <FrameRate>24 1</FrameRate> <ScreenAspectRatio>1.85</ScreenAspectRatio> </MainPicture> @@ -47,7 +47,7 @@ <IntrinsicDuration>24</IntrinsicDuration> <EntryPoint>0</EntryPoint> <Duration>24</Duration> - <Hash>KcJb7S2K5cNm8RG4kfQD5FTeS0A=</Hash> + <Hash>3M7YTgvFKXXMEGLkIbV4miC90FE=</Hash> </MainSound> </AssetList> </Reel> diff --git a/test/ref/DCP/dcp_test7/pkl_d199d58b-5ef8-4d49-b270-07e590ccb280.xml b/test/ref/DCP/dcp_test7/pkl_d199d58b-5ef8-4d49-b270-07e590ccb280.xml index 4180eb8d..9d251109 100644 --- a/test/ref/DCP/dcp_test7/pkl_d199d58b-5ef8-4d49-b270-07e590ccb280.xml +++ b/test/ref/DCP/dcp_test7/pkl_d199d58b-5ef8-4d49-b270-07e590ccb280.xml @@ -9,7 +9,7 @@ <Asset> <Id>urn:uuid:6affb8ee-0020-4dff-a53c-17652f6358ab</Id> <AnnotationText>6affb8ee-0020-4dff-a53c-17652f6358ab</AnnotationText> - <Hash>Vsre14v3AhK6X2gUzeYF9G8GKo0=</Hash> + <Hash>SgCEvehTaji0MCWOJTVioOcNndY=</Hash> <Size>1965</Size> <Type>text/xml;asdcpKind=CPL</Type> <OriginalFileName>cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml</OriginalFileName> @@ -17,15 +17,15 @@ <Asset> <Id>urn:uuid:5407b210-4441-4e97-8b16-8bdc7c12da54</Id> <AnnotationText>5407b210-4441-4e97-8b16-8bdc7c12da54</AnnotationText> - <Hash>wUmt8G+cFFKMGt0ueS9+F1S4uhc=</Hash> - <Size>49240</Size> + <Hash>vsVjRV9vhTBPUWfE/TT1o2vdQsI=</Hash> + <Size>31648</Size> <Type>application/x-smpte-mxf;asdcpKind=Picture</Type> <OriginalFileName>video.mxf</OriginalFileName> </Asset> <Asset> <Id>urn:uuid:97f0f352-5b77-48ee-a558-9df37717f4fa</Id> <AnnotationText>97f0f352-5b77-48ee-a558-9df37717f4fa</AnnotationText> - <Hash>KcJb7S2K5cNm8RG4kfQD5FTeS0A=</Hash> + <Hash>3M7YTgvFKXXMEGLkIbV4miC90FE=</Hash> <Size>881326</Size> <Type>application/x-smpte-mxf;asdcpKind=Sound</Type> <OriginalFileName>audio.mxf</OriginalFileName> diff --git a/test/ref/DCP/dcp_test7/video.mxf b/test/ref/DCP/dcp_test7/video.mxf Binary files differindex 27ba41cf..cd0e43af 100644 --- a/test/ref/DCP/dcp_test7/video.mxf +++ b/test/ref/DCP/dcp_test7/video.mxf diff --git a/test/ref/DCP/encryption_test/audio.mxf b/test/ref/DCP/encryption_test/audio.mxf Binary files differindex a4f89ae9..505b7f13 100644 --- a/test/ref/DCP/encryption_test/audio.mxf +++ b/test/ref/DCP/encryption_test/audio.mxf diff --git a/test/ref/DCP/encryption_test/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml b/test/ref/DCP/encryption_test/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml index e8e24467..6203c884 100644 --- a/test/ref/DCP/encryption_test/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml +++ b/test/ref/DCP/encryption_test/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml @@ -23,7 +23,7 @@ <EntryPoint>0</EntryPoint> <Duration>24</Duration> <KeyId>urn:uuid:ac8d301c-e5d9-4343-b6f3-ba2668adbe56</KeyId> - <Hash>AVtX8wz76uG2Uw0Qbc9+DKnHUfw=</Hash> + <Hash>Q0GMntXvEqVQsiv+YkfhMrXdw0w=</Hash> <FrameRate>24 1</FrameRate> <ScreenAspectRatio>1998 1080</ScreenAspectRatio> </MainPicture> @@ -34,7 +34,7 @@ <EntryPoint>0</EntryPoint> <Duration>24</Duration> <KeyId>urn:uuid:7ab6c77b-6648-44b9-8549-a5290ada6238</KeyId> - <Hash>3o02UpYqrl6w0NQbFvrB2tKxaIk=</Hash> + <Hash>v0SCdh2xnKNzGC7Sk5pS2q5Q/wQ=</Hash> </MainSound> </AssetList> </Reel> @@ -57,15 +57,15 @@ <dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> </dsig:Transforms> <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> - <dsig:DigestValue>X3YkODMLyEJsAz5v3S/uT+xDD7c=</dsig:DigestValue> + <dsig:DigestValue>DBBENxFb5Qv377fb86n0KgUQ7go=</dsig:DigestValue> </dsig:Reference> </dsig:SignedInfo> - <dsig:SignatureValue>jH02vGxlTTi9T94KCIfMkafmdO0wluP9cvh+u5HyYoZo/D7O1Ki202t5uHRp0wcu -OfBFuu1Hw3Ooy/VEa2l4l/UDfE7lI+D79e0VfA8HwFB+c21GF7Q2FRV5ddu9ODgz -rk6kC5fZSLxc7cpK6jPNnT285O3nHfjk6MQ0fgGfNbvMefgeEWVKj8qcyFgN6H4e -wr1omcjbdw/HVQaOW84//pBRSRdMJGe1u2iUE2RwxBLzP4BepzkMv9Asm6uDo1YG -X1d60g2aCUdxAg9fjyTaOss1nRp1YdPlb3SHUhKXgTT/eAPkmmr7bs3jJtp2BN9U -4Izz2GR/3Uyf0NP20mZgNQ==</dsig:SignatureValue> + <dsig:SignatureValue>rhF1QacGUhxm1jfcgyBjAo2BmD4QxBl7c6Bzt8rjXXhR+NVT4ITeyxi39+94WwBx +Yp8iQhF46bE2QGZAr+HnZZJGVG3ajeaQ4uvPp2KRC8sHpBlZ2rGGtyjXAflYjepw +c1cLvRoAKbxOMW+ESxjyYOKgT0Bke0GhbzZ8+w+hGZLHxK9oTokIG9YDnRNUKN5W +n6avbxuaT8wtZgVwD4qfKzMeJlYW3yDFo/2apQA5K+oCj/gfrS1habYqBoNo9kO1 +fWkQ7LIeRrYuzNlr5K4e/LyIm7SHwb9EGcA7K8WbDrHKvaJmTs/T01QhU9f+huk2 +ZGJMMCGHhiwcbVtqVhgJSQ==</dsig:SignatureValue> <dsig:KeyInfo> <dsig:X509Data> <dsig:X509IssuerSerial> diff --git a/test/ref/DCP/encryption_test/pkl_5203f3d4-9d62-4062-8bf1-7a114eff99df.xml b/test/ref/DCP/encryption_test/pkl_5203f3d4-9d62-4062-8bf1-7a114eff99df.xml index 4d49b259..fb0313ab 100644 --- a/test/ref/DCP/encryption_test/pkl_5203f3d4-9d62-4062-8bf1-7a114eff99df.xml +++ b/test/ref/DCP/encryption_test/pkl_5203f3d4-9d62-4062-8bf1-7a114eff99df.xml @@ -9,7 +9,7 @@ <Asset> <Id>urn:uuid:6affb8ee-0020-4dff-a53c-17652f6358ab</Id> <AnnotationText>6affb8ee-0020-4dff-a53c-17652f6358ab</AnnotationText> - <Hash>Zd9zaFAGx/4W2B3vSZkAqTzcDZ0=</Hash> + <Hash>sLWF9OcgdkvBUH1VcNiwseLA3sA=</Hash> <Size>9226</Size> <Type>text/xml</Type> <OriginalFileName>cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml</OriginalFileName> @@ -17,7 +17,7 @@ <Asset> <Id>urn:uuid:9a7fbb03-4078-4944-90b1-0d8a21c9d793</Id> <AnnotationText>9a7fbb03-4078-4944-90b1-0d8a21c9d793</AnnotationText> - <Hash>AVtX8wz76uG2Uw0Qbc9+DKnHUfw=</Hash> + <Hash>Q0GMntXvEqVQsiv+YkfhMrXdw0w=</Hash> <Size>44008</Size> <Type>application/mxf</Type> <OriginalFileName>video.mxf</OriginalFileName> @@ -25,7 +25,7 @@ <Asset> <Id>urn:uuid:ce300880-a425-40a6-adac-eb1e3f5643fc</Id> <AnnotationText>ce300880-a425-40a6-adac-eb1e3f5643fc</AnnotationText> - <Hash>3o02UpYqrl6w0NQbFvrB2tKxaIk=</Hash> + <Hash>v0SCdh2xnKNzGC7Sk5pS2q5Q/wQ=</Hash> <Size>165454</Size> <Type>application/mxf</Type> <OriginalFileName>audio.mxf</OriginalFileName> @@ -49,15 +49,15 @@ <dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> </dsig:Transforms> <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> - <dsig:DigestValue>0F1ZXfoRDPIQHlRG0MC1uXkahG8=</dsig:DigestValue> + <dsig:DigestValue>OU1UpJxBmpxK8SE5yfe8aJsqoIw=</dsig:DigestValue> </dsig:Reference> </dsig:SignedInfo> - <dsig:SignatureValue>u98MLscN/Fn3YxGFMw6kP7fIWUj05FPxQvIYvsIpP68UP3FX9rdP6nh3Olyv194d -A1fQJu4ZamTcYN2O2E5vdGjxxHlPNXfFPckWc9Sy1i3V8u+EFdOggjMY4snvPot6 -kMyzAICuKzTJs4l+O/BzJAJSFSxrEtBCYEFxrtyKntDxSUE7ePSqPwcim6+5BzDO -QOsIp3wjJHlp7u4QqU3knIiaM7SibIXqtIBF7TOrChWZjFImKePNib9/DXvnE2WL -Y+5wJjGhImQR+2U2DDpSCLkl0kVgDrYfKcNg4lXUDZGEKo0Yqz0+1Rszz/DqsC+J -6mYxqMMvRXeh9pViSpgKaA==</dsig:SignatureValue> + <dsig:SignatureValue>ypg6tt5iJi7YEUJQfEQmZeigXzcm2xn/J59tqqYBqwmAch1ia//Khyo6m7/HpQJl +2Y5swUI8MtmzdV3gj3urd8WuQsDWFLflIHHiIanYE/XCdFZ8lV/nvyCkAaf/AH2V +W7bWD8/fYXJD2G9a2tRiWTjzfgpsTk+ox+C12Y/SebWAQ97sSLIMwwmQIYK2kTnh +nbKSuhk+v+V2ObpYl48zXu3za3Yt77rCdcGgPwYr/NUI47ascpnueNw48clDtjp+ +775jeA5ZG5lBR3VGTLwvoOXT3CH/FgG0DPSLmYbRnOzEShVUt7xFgbxMgNTYOGQJ +3ipS6qmHgWHjX3/fo6isgg==</dsig:SignatureValue> <dsig:KeyInfo> <dsig:X509Data> <dsig:X509IssuerSerial> diff --git a/test/ref/DCP/encryption_test/video.mxf b/test/ref/DCP/encryption_test/video.mxf Binary files differindex 2fbfacdd..e6ddbadb 100644 --- a/test/ref/DCP/encryption_test/video.mxf +++ b/test/ref/DCP/encryption_test/video.mxf diff --git a/test/round_trip_test.cc b/test/round_trip_test.cc index 028accbe..ffba5cbd 100644 --- a/test/round_trip_test.cc +++ b/test/round_trip_test.cc @@ -35,15 +35,15 @@ #include "decrypted_kdm.h" #include "encrypted_kdm.h" #include "certificate_chain.h" -#include "mono_picture_asset.h" +#include "mono_j2k_picture_asset.h" #include "sound_asset.h" #include "reel.h" #include "test.h" #include "cpl.h" -#include "mono_picture_frame.h" +#include "mono_j2k_picture_frame.h" #include "certificate_chain.h" -#include "mono_picture_asset_writer.h" -#include "mono_picture_asset_reader.h" +#include "mono_j2k_picture_asset_writer.h" +#include "mono_j2k_picture_asset_reader.h" #include "reel_picture_asset.h" #include "reel_mono_picture_asset.h" #include "openjpeg_image.h" @@ -70,8 +70,8 @@ BOOST_AUTO_TEST_CASE (round_trip_test) boost::filesystem::path work_dir = "build/test/round_trip_test"; boost::filesystem::create_directory (work_dir); - auto asset_A = make_shared<dcp::MonoPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE); - auto writer = asset_A->start_write(work_dir / "video.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW); + auto asset_A = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE); + auto writer = asset_A->start_write(work_dir / "video.mxf", dcp::Behaviour::MAKE_NEW); dcp::ArrayData j2c ("test/data/flat_red.j2c"); for (int i = 0; i < 24; ++i) { writer->write (j2c.data (), j2c.size ()); @@ -123,7 +123,7 @@ BOOST_AUTO_TEST_CASE (round_trip_test) } /* Reload the picture asset */ - auto asset_B = make_shared<dcp::MonoPictureAsset>(work_dir / "video.mxf"); + auto asset_B = make_shared<dcp::MonoJ2KPictureAsset>(work_dir / "video.mxf"); BOOST_CHECK (!kdm_B.keys().empty ()); asset_B->set_key (kdm_B.keys().front().key()); diff --git a/test/shared_subtitle_test.cc b/test/shared_subtitle_test.cc index 7ac20e10..22ee7177 100644 --- a/test/shared_subtitle_test.cc +++ b/test/shared_subtitle_test.cc @@ -175,13 +175,13 @@ BOOST_AUTO_TEST_CASE (format_xml_test1) { xmlpp::Document doc; auto root = doc.create_root_node("Foo"); - root->add_child("Empty"); - root->add_child("Text")->add_child_text("Hello world"); - root->add_child("Font")->add_child("Text")->add_child_text("Say what"); - auto fred = root->add_child("Text")->add_child("Font"); + cxml::add_child(root, "Empty"); + cxml::add_text_child(root, "Text", "Hello world"); + cxml::add_text_child(cxml::add_child(root, "Font"), "Text", "Say what"); + auto fred = cxml::add_child(cxml::add_child(root, "Text"), "Font"); fred->set_attribute("bob", "job"); fred->add_child_text("Fred"); - fred->add_child("Text")->add_child_text("Jim"); + cxml::add_text_child(fred, "Text", "Jim"); fred->add_child_text("Sheila"); BOOST_REQUIRE_EQUAL (dcp::SubtitleAsset::format_xml(doc, make_pair(string{}, string{"fred"})), "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" @@ -210,7 +210,7 @@ BOOST_AUTO_TEST_CASE (format_xml_entities_test) { xmlpp::Document doc; auto root = doc.create_root_node("Foo"); - root->add_child("Bar")->add_child_text("Don't panic & xml \"is\" 'great' & < > —"); + cxml::add_text_child(root, "Bar", "Don't panic & xml \"is\" 'great' & < > —"); BOOST_REQUIRE_EQUAL(dcp::SubtitleAsset::format_xml(doc, {}), "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" "<Foo>\n" diff --git a/test/stream_operators.cc b/test/stream_operators.cc index 0ed0d05f..348abd2f 100644 --- a/test/stream_operators.cc +++ b/test/stream_operators.cc @@ -214,6 +214,9 @@ ostream& dcp::operator<< (ostream& s, VerificationNote::Type t) { switch (t) { + case VerificationNote::Type::OK: + s << "check"; + break; case VerificationNote::Type::ERROR: s << "error"; break; diff --git a/test/test.cc b/test/test.cc index d384bdfa..51a631d2 100644 --- a/test/test.cc +++ b/test/test.cc @@ -39,11 +39,11 @@ #include "interop_subtitle_asset.h" #include "file.h" #include "j2k_transcode.h" -#include "mono_picture_asset.h" -#include "mono_picture_asset.h" +#include "mono_j2k_picture_asset.h" +#include "mono_j2k_picture_asset.h" #include "openjpeg_image.h" -#include "picture_asset_writer.h" -#include "picture_asset_writer.h" +#include "j2k_picture_asset_writer.h" +#include "j2k_picture_asset_writer.h" #include "reel.h" #include "reel_asset.h" #include "reel_interop_closed_caption_asset.h" @@ -122,7 +122,7 @@ check_xml (xmlpp::Element* ref, xmlpp::Element* test, vector<string> ignore_tags BOOST_CHECK_EQUAL (ref->get_name (), test->get_name ()); BOOST_CHECK_EQUAL (ref->get_namespace_prefix (), test->get_namespace_prefix ()); - if (find(ignore_tags.begin(), ignore_tags.end(), ref->get_name()) != ignore_tags.end()) { + if (find(ignore_tags.begin(), ignore_tags.end(), std::string(ref->get_name())) != ignore_tags.end()) { return; } @@ -260,18 +260,18 @@ check_file (boost::filesystem::path ref, boost::filesystem::path check) RNGFixer::RNGFixer () { - Kumu::cth_test = true; + Kumu::dcpomatic_test = true; Kumu::FortunaRNG().Reset(); } RNGFixer::~RNGFixer () { - Kumu::cth_test = false; + Kumu::dcpomatic_test = false; } -shared_ptr<dcp::MonoPictureAsset> +shared_ptr<dcp::MonoJ2KPictureAsset> simple_picture (boost::filesystem::path path, string suffix, int frames, optional<dcp::Key> key) { dcp::MXFMetadata mxf_meta; @@ -279,12 +279,12 @@ simple_picture (boost::filesystem::path path, string suffix, int frames, optiona mxf_meta.product_name = "OpenDCP"; mxf_meta.product_version = "0.0.25"; - auto mp = make_shared<dcp::MonoPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE); + auto mp = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE); mp->set_metadata (mxf_meta); if (key) { mp->set_key (*key); } - auto picture_writer = mp->start_write(path / dcp::String::compose("video%1.mxf", suffix), dcp::PictureAsset::Behaviour::MAKE_NEW); + auto picture_writer = mp->start_write(path / dcp::String::compose("video%1.mxf", suffix), dcp::Behaviour::MAKE_NEW); dcp::Size const size (1998, 1080); auto image = make_shared<dcp::OpenJPEGImage>(size); @@ -530,10 +530,10 @@ black_picture_asset (boost::filesystem::path dir, int frames) auto frame = dcp::compress_j2k (image, 100000000, 24, false, false); BOOST_REQUIRE (frame.size() < 230000000 / (24 * 8)); - auto asset = make_shared<dcp::MonoPictureAsset>(dcp::Fraction(24, 1), dcp::Standard::SMPTE); + auto asset = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction(24, 1), dcp::Standard::SMPTE); asset->set_metadata (dcp::MXFMetadata("libdcp", "libdcp", "1.6.4devel")); boost::filesystem::create_directories (dir); - auto writer = asset->start_write(dir / "pic.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW); + auto writer = asset->start_write(dir / "pic.mxf", dcp::Behaviour::MAKE_NEW); for (int i = 0; i < frames; ++i) { writer->write (frame.data(), frame.size()); } @@ -567,7 +567,11 @@ Editor::Editor(boost::filesystem::path path) Editor::~Editor() { - auto f = fopen(_path.string().c_str(), "w"); + /* Open this binary so that text files are re-written with Unix endings even on Windows, + * so that if we subsequently get hashes of edited files the hashes are the same on + * all platforms. + */ + auto f = fopen(_path.string().c_str(), "wb"); BOOST_REQUIRE (f); fwrite (_content.c_str(), _content.length(), 1, f); fclose (f); diff --git a/test/test.h b/test/test.h index bacb9311..d3fded87 100644 --- a/test/test.h +++ b/test/test.h @@ -34,7 +34,7 @@ namespace xmlpp { namespace dcp { class DCP; - class MonoPictureAsset; + class MonoJ2KPictureAsset; class SoundAsset; } @@ -44,7 +44,7 @@ extern boost::filesystem::path xsd_test; extern void check_xml (xmlpp::Element* ref, xmlpp::Element* test, std::vector<std::string> ignore_tags, bool ignore_whitespace = false); extern void check_xml (std::string ref, std::string test, std::vector<std::string> ignore, bool ignore_whitespace = false); extern void check_file (boost::filesystem::path ref, boost::filesystem::path check); -extern std::shared_ptr<dcp::MonoPictureAsset> simple_picture ( +extern std::shared_ptr<dcp::MonoJ2KPictureAsset> simple_picture ( boost::filesystem::path path, std::string suffix, int frames = 24, diff --git a/test/verify_report_test.cc b/test/verify_report_test.cc new file mode 100644 index 00000000..6b288891 --- /dev/null +++ b/test/verify_report_test.cc @@ -0,0 +1,67 @@ +/* + Copyright (C) 2022 Carl Hetherington <cth@carlh.net> + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>. + +*/ + + +#include "verify.h" +#include "verify_report.h" +#include <boost/test/unit_test.hpp> +#include "test.h" + + +BOOST_AUTO_TEST_CASE(verify_report_basically_ok) +{ + dcp::HTMLFormatter formatter("build/test/verify_report_basically_ok.html"); + dcp::verify_report( + dcp::verify( + { private_test / "TONEPLATES-SMPTE-PLAINTEXT_TST_F_XX-XX_ITL-TD_51-XX_2K_WOE_20111001_WOE_OV" }, + {}, + [](std::string, boost::optional<boost::filesystem::path>) {}, + [](float) {}, + {}, + xsd_test + ), + formatter + ); +} + + +BOOST_AUTO_TEST_CASE(text_formatter) +{ + { + dcp::TextFormatter fmt("build/test/text_formatter.txt"); + + fmt.heading("Heading"); + fmt.subheading("Subheading"); + auto A = fmt.unordered_list(); + fmt.list_item("Foo"); + fmt.list_item("Bar"); + auto B = fmt.unordered_list(); + fmt.list_item("Fred"); + fmt.list_item("Jim"); + fmt.list_item("Sheila"); + } + +#ifdef LIBDCP_WINDOWS + check_file("test/data/text_formatter_windows.txt", "build/test/text_formatter.txt"); +#else + check_file("test/data/text_formatter.txt", "build/test/text_formatter.txt"); +#endif +} + diff --git a/test/verify_test.cc b/test/verify_test.cc index eab50b59..3f551790 100644 --- a/test/verify_test.cc +++ b/test/verify_test.cc @@ -38,8 +38,8 @@ #include "file.h" #include "interop_subtitle_asset.h" #include "j2k_transcode.h" -#include "mono_picture_asset.h" -#include "mono_picture_asset_writer.h" +#include "mono_j2k_picture_asset.h" +#include "mono_j2k_picture_asset_writer.h" #include "openjpeg_image.h" #include "raw_convert.h" #include "reel.h" @@ -52,7 +52,7 @@ #include "reel_smpte_closed_caption_asset.h" #include "reel_smpte_subtitle_asset.h" #include "smpte_subtitle_asset.h" -#include "stereo_picture_asset.h" +#include "stereo_j2k_picture_asset.h" #include "stream_operators.h" #include "test.h" #include "util.h" @@ -63,6 +63,7 @@ #include <boost/test/unit_test.hpp> #include <cstdio> #include <iostream> +#include <tuple> using std::list; @@ -148,6 +149,43 @@ prepare_directory (path path) } +static +path +find_prefix(path dir, string prefix) +{ + auto iter = std::find_if(directory_iterator(dir), directory_iterator(), [prefix](path const& p) { + return boost::starts_with(p.filename().string(), prefix); + }); + + BOOST_REQUIRE(iter != directory_iterator()); + return iter->path(); +} + + +static +path +find_cpl(path dir) +{ + return find_prefix(dir, "cpl_"); +} + + +static +path +find_pkl(path dir) +{ + return find_prefix(dir, "pkl_"); +} + + +static +path +find_asset_map(path dir) +{ + return find_prefix(dir, "ASSETMAP"); +} + + /** Copy dcp_test{reference_number} to build/test/verify_test{verify_test_suffix} * to make a new sacrificial test DCP. */ @@ -196,53 +234,85 @@ LIBDCP_ENABLE_WARNINGS static +string +to_string(dcp::VerificationNote const& note) +{ + string s = note_to_string(note) + dcp::String::compose( + "\n [%1 %2 %3 %4 %5 %6 ", + static_cast<int>(note.type()), + static_cast<int>(note.code()), + note.note().get_value_or("<none>"), + note.file().get_value_or("<none>"), + note.line().get_value_or(0), + note.frame().get_value_or(0) + ); + + s += dcp::String::compose( + "%1 %2 %3 %4 %5]\n", + note.id().get_value_or("<none>"), + note.other_id().get_value_or("<none>"), + note.cpl_id().get_value_or("<none>"), + note.reference_hash().get_value_or("<none>"), + note.calculated_hash().get_value_or("<none>") + ); + + return s; +} + + +static void -check_verify_result(vector<path> dir, vector<dcp::DecryptedKDM> kdm, vector<dcp::VerificationNote> test_notes) +check_verify_result(vector<dcp::VerificationNote> notes, vector<dcp::VerificationNote> test_notes) { - auto notes = dcp::verify({dir}, kdm, &stage, &progress, {}, xsd_test); - std::sort (notes.begin(), notes.end()); - std::sort (test_notes.begin(), test_notes.end()); + std::sort(notes.begin(), notes.end()); + std::sort(test_notes.begin(), test_notes.end()); - string message = "\nVerification notes from test:\n"; - for (auto i: notes) { - message += " " + note_to_string(i) + "\n"; - message += dcp::String::compose( - " [%1 %2 %3 %4 %5 %6 %7]\n", - static_cast<int>(i.type()), - static_cast<int>(i.code()), - i.note().get_value_or("<none>"), - i.file().get_value_or("<none>"), - i.line().get_value_or(0), - i.reference_hash().get_value_or("<none>"), - i.calculated_hash().get_value_or("<none>") - ); + string message = "\n"; + + vector<dcp::VerificationNote> not_expected; + for (auto note: notes) { + auto iter = std::find_if(test_notes.begin(), test_notes.end(), [note](dcp::VerificationNote const& n) { return note.type() == n.type() && note.code() == n.code(); }); + if (iter != test_notes.end() && *iter != note) { + message += "Wrong details:\n --seen " + to_string(note) + " --expected " + to_string(*iter) + "\n"; + } else if (iter == test_notes.end()) { + not_expected.push_back(note); + } } - message += "Expected:\n"; - for (auto i: test_notes) { - message += " " + note_to_string(i) + "\n"; - message += dcp::String::compose( - " [%1 %2 %3 %4 %5 %6 %7]\n", - static_cast<int>(i.type()), - static_cast<int>(i.code()), - i.note().get_value_or("<none>"), - i.file().get_value_or("<none>"), - i.line().get_value_or(0), - i.reference_hash().get_value_or("<none>"), - i.calculated_hash().get_value_or("<none>") - ); + + vector<dcp::VerificationNote> not_seen; + for (auto note: test_notes) { + auto iter = std::find_if(notes.begin(), notes.end(), [note](dcp::VerificationNote const& n) { return note.type() == n.type() && note.code() == n.code(); }); + if (iter == notes.end()) { + not_seen.push_back(note); + } + } + + for (auto note: not_expected) { + message += "Not expected:\n" + to_string(note) + "\n"; + } + + for (auto note: not_seen) { + message += "Not seen:\n" + to_string(note) + "\n"; } - BOOST_REQUIRE_MESSAGE (notes == test_notes, message); + BOOST_REQUIRE_MESSAGE(notes == test_notes, message); +} + + +static +void +check_verify_result(vector<path> dir, vector<dcp::DecryptedKDM> kdm, vector<dcp::VerificationNote> test_notes) +{ + check_verify_result(dcp::verify({dir}, kdm, &stage, &progress, {}, xsd_test).notes, test_notes); } /* Copy dcp_test1 to build/test/verify_test{suffix} then edit a file found by the functor 'file', - * replacing from with to. Verify the resulting DCP and check that the results match the given - * list of codes. + * replacing from with to. */ static void -check_verify_result_after_replace (string suffix, boost::function<path (string)> file, string from, string to, vector<dcp::VerificationNote::Code> codes) +replace(string suffix, boost::function<path (string)> file, string from, string to) { auto dir = setup (1, suffix); @@ -250,17 +320,6 @@ check_verify_result_after_replace (string suffix, boost::function<path (string)> Editor e (file(suffix)); e.replace (from, to); } - - auto notes = dcp::verify({dir}, {}, &stage, &progress, {}, xsd_test); - - BOOST_REQUIRE_EQUAL (notes.size(), codes.size()); - auto i = notes.begin(); - auto j = codes.begin(); - while (i != notes.end()) { - BOOST_CHECK_EQUAL (i->code(), *j); - ++i; - ++j; - } } @@ -295,11 +354,44 @@ private: }; +static +dcp::VerificationNote +ok(dcp::VerificationNote::Code code, shared_ptr<const dcp::CPL> cpl) +{ + return dcp::VerificationNote(dcp::VerificationNote::Type::OK, code).set_cpl_id(cpl->id()); +} + + +static +dcp::VerificationNote +ok(dcp::VerificationNote::Code code, string note, shared_ptr<const dcp::CPL> cpl) +{ + return dcp::VerificationNote(dcp::VerificationNote::Type::OK, code, note).set_cpl_id(cpl->id()); +} + + +static +dcp::VerificationNote +ok(dcp::VerificationNote::Code code, boost::filesystem::path path, shared_ptr<const dcp::CPL> cpl) +{ + return dcp::VerificationNote(dcp::VerificationNote::Type::OK, code, path).set_cpl_id(cpl->id()); +} + + +void +add(vector<dcp::VerificationNote>& notes, vector<dcp::VerificationNote> const& add) +{ + for (auto i: add) { + notes.push_back(i); + } +} + + BOOST_AUTO_TEST_CASE (verify_no_error) { stages.clear (); auto dir = setup (1, "no_error"); - auto notes = dcp::verify({dir}, {}, &stage, &progress, {}, xsd_test); + auto notes = dcp::verify({dir}, {}, &stage, &progress, {}, xsd_test).notes; path const cpl_file = dir / dcp_test1_cpl(); path const pkl_file = dir / dcp_test1_pkl(); @@ -342,7 +434,9 @@ BOOST_AUTO_TEST_CASE (verify_no_error) ++st; BOOST_REQUIRE (st == stages.end()); - BOOST_CHECK_EQUAL (notes.size(), 0U); + for (auto note: notes) { + BOOST_CHECK(note.type() == dcp::VerificationNote::Type::OK); + } } @@ -351,21 +445,22 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_picture_sound_hash) using namespace boost::filesystem; auto dir = setup (1, "incorrect_picture_sound_hash"); + auto cpl = make_shared<dcp::CPL>(find_cpl(dir)); auto video_path = path(dir / "video.mxf"); HashCalculator video_calc(video_path); auto mod = fopen(video_path.string().c_str(), "r+b"); BOOST_REQUIRE (mod); - fseek (mod, 4096, SEEK_SET); + BOOST_REQUIRE_EQUAL(fseek(mod, -16, SEEK_END), 0); int x = 42; - fwrite (&x, sizeof(x), 1, mod); + BOOST_REQUIRE(fwrite(&x, sizeof(x), 1, mod) == 1); fclose (mod); auto audio_path = path(dir / "audio.mxf"); HashCalculator audio_calc(audio_path); mod = fopen(audio_path.string().c_str(), "r+b"); BOOST_REQUIRE (mod); - BOOST_REQUIRE_EQUAL (fseek(mod, -64, SEEK_END), 0); + BOOST_REQUIRE_EQUAL(fseek(mod, 0, SEEK_END), 0); BOOST_REQUIRE (fwrite (&x, sizeof(x), 1, mod) == 1); fclose (mod); @@ -374,12 +469,25 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_picture_sound_hash) { dir }, {}, { + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + canonical(cpl->file().get()) + ).set_cpl_id(dcp_test1_cpl_id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), dcp::VerificationNote( dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INCORRECT_PICTURE_HASH, canonical(video_path) - ).set_reference_hash(video_calc.old_hash()).set_calculated_hash(video_calc.new_hash()), + ).set_cpl_id(dcp_test1_cpl_id()).set_reference_hash(video_calc.old_hash()).set_calculated_hash(video_calc.new_hash()), dcp::VerificationNote( dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INCORRECT_SOUND_HASH, canonical(audio_path) - ).set_reference_hash(audio_calc.old_hash()).set_calculated_hash(audio_calc.new_hash()), + ).set_cpl_id(dcp_test1_cpl_id()).set_reference_hash(audio_calc.old_hash()).set_calculated_hash(audio_calc.new_hash()), }); } @@ -389,6 +497,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_picture_sound_hashes) using namespace boost::filesystem; auto dir = setup (1, "mismatched_picture_sound_hashes"); + auto cpl = make_shared<dcp::CPL>(find_cpl(dir)); HashCalculator calc(dir / dcp_test1_cpl()); @@ -401,14 +510,30 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_picture_sound_hashes) { dir }, {}, { + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), dcp::VerificationNote( - dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, dcp_test1_cpl_id(), canonical(dir / dcp_test1_cpl()) - ).set_reference_hash("x" + calc.old_hash()).set_calculated_hash(calc.old_hash()), - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_PICTURE_HASHES, canonical(dir / "video.mxf") }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_SOUND_HASHES, canonical(dir / "audio.mxf") }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, "value 'xKcJb7S2K5cNm8RG4kfQD5FTeS0A=' is invalid Base64-encoded binary", canonical(dir / dcp_test1_pkl()), 28 }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, "value 'xtfX1mVIKJCVr1m7Y32Nzxf0+Rpw=' is invalid Base64-encoded binary", canonical(dir / dcp_test1_pkl()), 12 }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, "value 'xwUmt8G+cFFKMGt0ueS9+F1S4uhc=' is invalid Base64-encoded binary", canonical(dir / dcp_test1_pkl()), 20 }, + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + canonical(cpl->file().get()) + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(dir / dcp_test1_cpl()) + ).set_cpl_id(dcp_test1_cpl_id()).set_reference_hash("x" + calc.old_hash()).set_calculated_hash(calc.old_hash()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_PICTURE_HASHES, canonical(dir / "video.mxf") + ).set_cpl_id(dcp_test1_cpl_id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_SOUND_HASHES, canonical(dir / "audio.mxf") + ).set_cpl_id(dcp_test1_cpl_id()), + { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, "value 'x3M7YTgvFKXXMEGLkIbV4miC90FE=' is invalid Base64-encoded binary", canonical(dir / dcp_test1_pkl()), 28 }, + { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, "value 'xskI+5b/9LA/y6h0mcyxysJYanxI=' is invalid Base64-encoded binary", canonical(dir / dcp_test1_pkl()), 12 }, + { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, "value 'xvsVjRV9vhTBPUWfE/TT1o2vdQsI=' is invalid Base64-encoded binary", canonical(dir / dcp_test1_pkl()), 20 }, }); } @@ -424,21 +549,37 @@ BOOST_AUTO_TEST_CASE (verify_failed_read_content_kind) e.replace ("<ContentKind>", "<ContentKind>x"); } + auto cpl = std::make_shared<dcp::CPL>(find_cpl(dir)); + check_verify_result ( { dir }, {}, { + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), dcp::VerificationNote( - dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, dcp_test1_cpl_id(), canonical(dir / dcp_test1_cpl()) - ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_CONTENT_KIND, string("xtrailer") } + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + canonical(cpl->file().get()) + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(dir / dcp_test1_cpl()) + ).set_cpl_id(dcp_test1_cpl_id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_CONTENT_KIND, string("xtrailer") + ).set_cpl_id(dcp_test1_cpl_id()) }); } static path -cpl (string suffix) +dcp_test1_cpl_path(string suffix) { return dcp::String::compose("build/test/verify_test%1/%2", suffix, dcp_test1_cpl()); } @@ -446,7 +587,7 @@ cpl (string suffix) static path -pkl (string suffix) +dcp_test1_pkl_path(string suffix) { return dcp::String::compose("build/test/verify_test%1/%2", suffix, dcp_test1_pkl()); } @@ -462,22 +603,64 @@ asset_map (string suffix) BOOST_AUTO_TEST_CASE (verify_invalid_picture_frame_rate) { - check_verify_result_after_replace ( - "invalid_picture_frame_rate", &cpl, - "<FrameRate>24 1", "<FrameRate>99 1", - { dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, - dcp::VerificationNote::Code::INVALID_PICTURE_FRAME_RATE } - ); + auto const suffix = "invalid_picture_frame_rate"; + + replace(suffix, &dcp_test1_cpl_path, "<FrameRate>24 1", "<FrameRate>99 1"); + + auto const dir = dcp::String::compose("build/test/verify_test%1", suffix); + auto const cpl_path = find_cpl(dir); + auto cpl = std::make_shared<dcp::CPL>(cpl_path); + + std::vector<dcp::VerificationNote> expected = + { + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + canonical(cpl->file().get()) + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(cpl_path) + ).set_cpl_id(cpl->id()).set_calculated_hash("7n7GQ2TbxQbmHYuAR8ml7XDOep8=").set_reference_hash("skI+5b/9LA/y6h0mcyxysJYanxI="), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_PICTURE_FRAME_RATE, string{"99/1"} + ).set_cpl_id(cpl->id()) + }; + + check_verify_result(dcp::verify({dir}, {}, &stage, &progress, {}, xsd_test).notes, expected); } + BOOST_AUTO_TEST_CASE (verify_missing_asset) { auto dir = setup (1, "missing_asset"); remove (dir / "video.mxf"); + + auto cpl = std::make_shared<dcp::CPL>(find_cpl(dir)); + check_verify_result ( { dir }, {}, { + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + canonical(cpl->file().get()) + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_ASSET, canonical(dir) / "video.mxf" } }); } @@ -485,71 +668,236 @@ BOOST_AUTO_TEST_CASE (verify_missing_asset) BOOST_AUTO_TEST_CASE (verify_empty_asset_path) { - check_verify_result_after_replace ( - "empty_asset_path", &asset_map, - "<Path>video.mxf</Path>", "<Path></Path>", - { dcp::VerificationNote::Code::EMPTY_ASSET_PATH } - ); + auto const suffix = "empty_asset_path"; + + replace("empty_asset_path", &asset_map, "<Path>video.mxf</Path>", "<Path></Path>"); + + auto const dir = dcp::String::compose("build/test/verify_test%1", suffix); + auto const cpl_path = find_cpl(dir); + auto cpl = std::make_shared<dcp::CPL>(cpl_path); + + std::vector<dcp::VerificationNote> expected = { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + canonical(cpl->file().get()) + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EMPTY_ASSET_PATH } + }; + + check_verify_result(dcp::verify({dir}, {}, &stage, &progress, {}, xsd_test).notes, expected); } BOOST_AUTO_TEST_CASE (verify_mismatched_standard) { - check_verify_result_after_replace ( - "mismatched_standard", &cpl, - "http://www.smpte-ra.org/schemas/429-7/2006/CPL", "http://www.digicine.com/PROTO-ASDCP-CPL-20040511#", - { dcp::VerificationNote::Code::MISMATCHED_STANDARD, - dcp::VerificationNote::Code::INVALID_XML, - dcp::VerificationNote::Code::INVALID_XML, - dcp::VerificationNote::Code::INVALID_XML, - dcp::VerificationNote::Code::INVALID_XML, - dcp::VerificationNote::Code::INVALID_XML, - dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES } - ); + auto const suffix = "mismatched_standard"; + + replace(suffix, &dcp_test1_cpl_path, "http://www.smpte-ra.org/schemas/429-7/2006/CPL", "http://www.digicine.com/PROTO-ASDCP-CPL-20040511#"); + + auto const dir = dcp::String::compose("build/test/verify_test%1", suffix); + auto const cpl_path = find_cpl(dir); + auto cpl = std::make_shared<dcp::CPL>(cpl_path); + + std::vector<dcp::VerificationNote> expected = { + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + canonical(cpl->file().get()) + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_STANDARD }, + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, "invalid character encountered", canonical(cpl_path), 42 + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, "no declaration found for element 'Id'", canonical(cpl_path), 53 + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, "no declaration found for element 'EditRate'", canonical(cpl_path), 54 + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, "no declaration found for element 'IntrinsicDuration'", canonical(cpl_path), 55 + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, + "element 'Id' is not allowed for content model '(Id,AnnotationText?,EditRate,IntrinsicDuration," + "EntryPoint?,Duration?,FullContentTitleText,ReleaseTerritory?,VersionNumber?,Chain?,Distributor?," + "Facility?,AlternateContentVersionList?,Luminance?,MainSoundConfiguration,MainSoundSampleRate," + "MainPictureStoredArea,MainPictureActiveArea,MainSubtitleLanguageList?,ExtensionMetadataList?,)'", + canonical(cpl_path), 149 + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(cpl_path) + ).set_cpl_id(cpl->id()).set_reference_hash("skI+5b/9LA/y6h0mcyxysJYanxI=").set_calculated_hash("FZ9E7L/pOuJ6aZfbiaANTv8BFOo=") + }; + + check_verify_result(dcp::verify({dir}, {}, &stage, &progress, {}, xsd_test).notes, expected); } BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_id) { + auto const suffix = "invalid_xml_cpl_id"; + /* There's no MISMATCHED_CPL_HASHES error here because it can't find the correct hash by ID (since the ID is wrong) */ - check_verify_result_after_replace ( - "invalid_xml_cpl_id", &cpl, - "<Id>urn:uuid:6affb8ee-0020-4dff-a53c-17652f6358ab", "<Id>urn:uuid:6affb8ee-0020-4dff-a53c-17652f6358a", - { dcp::VerificationNote::Code::INVALID_XML } - ); + replace("invalid_xml_cpl_id", &dcp_test1_cpl_path, "<Id>urn:uuid:6affb8ee-0020-4dff-a53c-17652f6358ab", "<Id>urn:uuid:6affb8ee-0020-4dff-a53c-17652f6358a"); + + auto const dir = dcp::String::compose("build/test/verify_test%1", suffix); + auto const cpl_path = find_cpl(dir); + auto cpl = std::make_shared<dcp::CPL>(cpl_path); + + std::vector<dcp::VerificationNote> expected = { + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + canonical(cpl->file().get()) + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, + "value 'urn:uuid:6affb8ee-0020-4dff-a53c-17652f6358a' does not match regular expression " + "facet 'urn:uuid:[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}'", canonical(cpl_path), 3 + ).set_cpl_id(cpl->id()) + }; + + check_verify_result(dcp::verify({dir}, {}, &stage, &progress, {}, xsd_test).notes, expected); } BOOST_AUTO_TEST_CASE (verify_invalid_xml_issue_date) { - check_verify_result_after_replace ( - "invalid_xml_issue_date", &cpl, - "<IssueDate>", "<IssueDate>x", - { dcp::VerificationNote::Code::INVALID_XML, - dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES } - ); + auto const suffix = "invalid_xml_issue_date"; + + replace("invalid_xml_issue_date", &dcp_test1_cpl_path, "<IssueDate>", "<IssueDate>x"); + + auto const dir = dcp::String::compose("build/test/verify_test%1", suffix); + auto const cpl_path = find_cpl(dir); + auto cpl = std::make_shared<dcp::CPL>(cpl_path); + + std::vector<dcp::VerificationNote> expected = { + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + canonical(cpl->file().get()) + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(cpl_path) + ).set_cpl_id(cpl->id()).set_reference_hash("skI+5b/9LA/y6h0mcyxysJYanxI=").set_calculated_hash("sz3BeIugJ567q3HMnA62JeRw4TE="), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, + "invalid character encountered", + canonical(cpl_path), 5 + ).set_cpl_id(cpl->id()), + }; + + check_verify_result(dcp::verify({dir}, {}, &stage, &progress, {}, xsd_test).notes, expected); } BOOST_AUTO_TEST_CASE (verify_invalid_xml_pkl_id) { - check_verify_result_after_replace ( - "invalid_xml_pkl_id", &pkl, - "<Id>urn:uuid:" + dcp_test1_pkl_id().substr(0, 3), - "<Id>urn:uuid:x" + dcp_test1_pkl_id().substr(1, 2), - { dcp::VerificationNote::Code::INVALID_XML } - ); + auto const suffix = "invalid_xml_pkl_id"; + + replace("invalid_xml_pkl_id", &dcp_test1_pkl_path, "<Id>urn:uuid:" + dcp_test1_pkl_id().substr(0, 3), "<Id>urn:uuid:x" + dcp_test1_pkl_id().substr(1, 2)); + + auto const dir = dcp::String::compose("build/test/verify_test%1", suffix); + auto const pkl_path = find_pkl(dir); + auto const cpl_path = find_cpl(dir); + auto cpl = std::make_shared<dcp::CPL>(cpl_path); + + std::vector<dcp::VerificationNote> expected = { + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + canonical(cpl->file().get()) + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, + "value 'urn:uuid:x199d58b-5ef8-4d49-b270-07e590ccb280' does not match regular " + "expression facet 'urn:uuid:[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}'", + canonical(pkl_path), 3 + ), + }; + + check_verify_result(dcp::verify({dir}, {}, &stage, &progress, {}, xsd_test).notes, expected); } BOOST_AUTO_TEST_CASE (verify_invalid_xml_asset_map_id) { - check_verify_result_after_replace ( - "invalid_xml_asset_map_id", &asset_map, - "<Id>urn:uuid:" + dcp_test1_asset_map_id.substr(0, 3), - "<Id>urn:uuid:x" + dcp_test1_asset_map_id.substr(1, 2), - { dcp::VerificationNote::Code::INVALID_XML } - ); + auto const suffix = "invalid_xml_asset_map_id"; + + replace("invalid_xml_asset_map_id", &asset_map, "<Id>urn:uuid:" + dcp_test1_asset_map_id.substr(0, 3), "<Id>urn:uuid:x" + dcp_test1_asset_map_id.substr(1, 2)); + + auto const dir = dcp::String::compose("build/test/verify_test%1", suffix); + auto const cpl_path = find_cpl(dir); + auto const asset_map_path = find_asset_map(dir); + auto cpl = std::make_shared<dcp::CPL>(cpl_path); + + std::vector<dcp::VerificationNote> expected = { + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + canonical(cpl->file().get()) + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, + "value 'urn:uuid:x17b3de4-6dda-408d-b19b-6711354b0bc3' does not match regular " + "expression facet 'urn:uuid:[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}'", + canonical(asset_map_path), 3 + ), + }; + + check_verify_result(dcp::verify({dir}, {}, &stage, &progress, {}, xsd_test).notes, expected); } @@ -557,11 +905,12 @@ BOOST_AUTO_TEST_CASE (verify_invalid_standard) { stages.clear (); auto dir = setup (3, "verify_invalid_standard"); - auto notes = dcp::verify({dir}, {}, &stage, &progress, {}, xsd_test); + auto notes = dcp::verify({dir}, {}, &stage, &progress, {}, xsd_test).notes; path const cpl_file = dir / "cpl_cbfd2bc0-21cf-4a8f-95d8-9cddcbe51296.xml"; path const pkl_file = dir / "pkl_d87a950c-bd6f-41f6-90cc-56ccd673e131.xml"; path const assetmap_file = dir / "ASSETMAP"; + auto cpl = std::make_shared<dcp::CPL>(cpl_file); auto st = stages.begin(); BOOST_CHECK_EQUAL (st->first, "Checking DCP"); @@ -601,13 +950,26 @@ BOOST_AUTO_TEST_CASE (verify_invalid_standard) ++st; BOOST_REQUIRE (st == stages.end()); - BOOST_REQUIRE_EQUAL (notes.size(), 2U); - auto i = notes.begin (); - BOOST_CHECK_EQUAL (i->type(), dcp::VerificationNote::Type::BV21_ERROR); - BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::Code::INVALID_STANDARD); - ++i; - BOOST_CHECK_EQUAL (i->type(), dcp::VerificationNote::Type::BV21_ERROR); - BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::Code::INVALID_JPEG2000_GUARD_BITS_FOR_2K); + vector<dcp::VerificationNote> expected = { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD }, + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"feature"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "j2c_c6035f97-b07d-4e1c-944d-603fc2ddc242.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "j2c_c6035f97-b07d-4e1c-944d-603fc2ddc242.mxf"), cpl) + }; + + for (int j = 0; j < 24; ++j) { + expected.push_back( + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_JPEG2000_GUARD_BITS_FOR_2K, string("2") + ).set_cpl_id(cpl->id()) + ); + } + + check_verify_result(notes, expected); } /* DCP with a short asset */ @@ -620,22 +982,42 @@ BOOST_AUTO_TEST_CASE (verify_invalid_duration) BOOST_REQUIRE(dcp.cpls().size() == 1); auto cpl = dcp.cpls()[0]; - check_verify_result ( - { dir }, - {}, - { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_DURATION, string("d7576dcb-a361-4139-96b8-267f5f8d7f91") }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_INTRINSIC_DURATION, string("d7576dcb-a361-4139-96b8-267f5f8d7f91") }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_DURATION, string("a2a87f5d-b749-4a7e-8d0c-9d48a4abf626") }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_INTRINSIC_DURATION, string("a2a87f5d-b749-4a7e-8d0c-9d48a4abf626") }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_JPEG2000_GUARD_BITS_FOR_2K, string("2") }, + vector<dcp::VerificationNote> expected = { + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"feature"}, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "j2c_d7576dcb-a361-4139-96b8-267f5f8d7f91.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "j2c_d7576dcb-a361-4139-96b8-267f5f8d7f91.mxf"), cpl), + { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD }, + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_DURATION, string("d7576dcb-a361-4139-96b8-267f5f8d7f91") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_INTRINSIC_DURATION, string("d7576dcb-a361-4139-96b8-267f5f8d7f91") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_DURATION, string("a2a87f5d-b749-4a7e-8d0c-9d48a4abf626") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_INTRINSIC_DURATION, string("a2a87f5d-b749-4a7e-8d0c-9d48a4abf626") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, + dcp::VerificationNote::Code::EMPTY_CONTENT_VERSION_LABEL_TEXT, + cpl->file().get() + ).set_cpl_id(cpl->id()) + }; + + for (int i = 0; i < 23; ++i) { + expected.push_back( dcp::VerificationNote( - dcp::VerificationNote::Type::WARNING, - dcp::VerificationNote::Code::EMPTY_CONTENT_VERSION_LABEL_TEXT, - cpl->file().get() - ).set_id("d74fda30-d5f4-4c5f-870f-ebc089d97eb7") - }); + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_JPEG2000_GUARD_BITS_FOR_2K, string("2") + ).set_cpl_id(cpl->id()) + ); + } + + check_verify_result({ dir }, {}, expected); } @@ -643,9 +1025,9 @@ static shared_ptr<dcp::CPL> dcp_from_frame (dcp::ArrayData const& frame, path dir) { - auto asset = make_shared<dcp::MonoPictureAsset>(dcp::Fraction(24, 1), dcp::Standard::SMPTE); + auto asset = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction(24, 1), dcp::Standard::SMPTE); create_directories (dir); - auto writer = asset->start_write(dir / "pic.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW); + auto writer = asset->start_write(dir / "pic.mxf", dcp::Behaviour::MAKE_NEW); for (int i = 0; i < 24; ++i) { writer->write (frame.data(), frame.size()); } @@ -674,12 +1056,21 @@ BOOST_AUTO_TEST_CASE (verify_invalid_picture_frame_size_in_bytes) prepare_directory (dir); auto cpl = dcp_from_frame (oversized_frame, dir); - vector<dcp::VerificationNote> expected; + vector<dcp::VerificationNote> expected = { + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "pic.mxf"), cpl), + }; + for (auto i = 0; i < 24; ++i) { expected.push_back( dcp::VerificationNote( dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_JPEG2000_CODESTREAM, string("missing marker start byte") - ).set_frame(i).set_frame_rate(24) + ).set_frame(i).set_frame_rate(24).set_cpl_id(cpl->id()) ); } @@ -687,13 +1078,15 @@ BOOST_AUTO_TEST_CASE (verify_invalid_picture_frame_size_in_bytes) expected.push_back( dcp::VerificationNote( dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_PICTURE_FRAME_SIZE_IN_BYTES, canonical(dir / "pic.mxf") - ).set_frame(i).set_frame_rate(24) + ).set_frame(i).set_frame_rate(24).set_cpl_id(cpl->id()) ); } expected.push_back( - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } - ); + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) + ); check_verify_result({ dir }, {}, expected); } @@ -717,13 +1110,21 @@ BOOST_AUTO_TEST_CASE (verify_nearly_invalid_picture_frame_size_in_bytes) prepare_directory (dir); auto cpl = dcp_from_frame (oversized_frame, dir); - vector<dcp::VerificationNote> expected; + vector<dcp::VerificationNote> expected = { + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "pic.mxf"), cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + }; for (auto i = 0; i < 24; ++i) { expected.push_back( dcp::VerificationNote( dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_JPEG2000_CODESTREAM, string("missing marker start byte") - ).set_frame(i).set_frame_rate(24) + ).set_frame(i).set_frame_rate(24).set_cpl_id(cpl->id()) ); } @@ -731,13 +1132,15 @@ BOOST_AUTO_TEST_CASE (verify_nearly_invalid_picture_frame_size_in_bytes) expected.push_back( dcp::VerificationNote( dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::NEARLY_INVALID_PICTURE_FRAME_SIZE_IN_BYTES, canonical(dir / "pic.mxf") - ).set_frame(i).set_frame_rate(24) + ).set_frame(i).set_frame_rate(24).set_cpl_id(cpl->id()) ); } expected.push_back( - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } - ); + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) + ); check_verify_result ({ dir }, {}, expected); } @@ -754,7 +1157,20 @@ BOOST_AUTO_TEST_CASE (verify_valid_picture_frame_size_in_bytes) prepare_directory (dir); auto cpl = dcp_from_frame (frame, dir); - check_verify_result({ dir }, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }}); + check_verify_result( + { dir }, + {}, + { + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "pic.mxf"), cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "pic.mxf"), cpl), + dcp::VerificationNote(dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()).set_cpl_id(cpl->id()) + }); } @@ -765,14 +1181,21 @@ BOOST_AUTO_TEST_CASE (verify_valid_interop_subtitles) copy_file ("test/data/subs1.xml", dir / "subs.xml"); auto asset = make_shared<dcp::InteropSubtitleAsset>(dir / "subs.xml"); auto reel_asset = make_shared<dcp::ReelInteropSubtitleAsset>(asset, dcp::Fraction(24, 1), 16 * 24, 0); - write_dcp_with_single_asset (dir, reel_asset, dcp::Standard::INTEROP); + auto cpl = write_dcp_with_single_asset(dir, reel_asset, dcp::Standard::INTEROP); check_verify_result ( {dir}, {}, { + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"theFontId"} } + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"theFontId"} + ).set_cpl_id(cpl->id()) }); } @@ -784,14 +1207,21 @@ BOOST_AUTO_TEST_CASE(verify_catch_missing_font_file_with_interop_ccap) copy_file("test/data/subs1.xml", dir / "ccap.xml"); auto asset = make_shared<dcp::InteropSubtitleAsset>(dir / "ccap.xml"); auto reel_asset = make_shared<dcp::ReelInteropClosedCaptionAsset>(asset, dcp::Fraction(24, 1), 16 * 24, 0); - write_dcp_with_single_asset(dir, reel_asset, dcp::Standard::INTEROP); + auto cpl = write_dcp_with_single_asset(dir, reel_asset, dcp::Standard::INTEROP); check_verify_result ( {dir}, {}, { + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"theFontId"} } + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"theFontId"} + ).set_cpl_id(cpl->id()) }); } @@ -805,7 +1235,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_interop_subtitles) copy_file ("test/data/subs1.xml", dir / "subs.xml"); auto asset = make_shared<dcp::InteropSubtitleAsset>(dir / "subs.xml"); auto reel_asset = make_shared<dcp::ReelInteropSubtitleAsset>(asset, dcp::Fraction(24, 1), 16 * 24, 0); - write_dcp_with_single_asset (dir, reel_asset, dcp::Standard::INTEROP); + auto cpl = write_dcp_with_single_asset(dir, reel_asset, dcp::Standard::INTEROP); { Editor e (dir / "subs.xml"); @@ -816,16 +1246,25 @@ BOOST_AUTO_TEST_CASE (verify_invalid_interop_subtitles) { dir }, {}, { + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'Foo'"), path(), 5 }, - { + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'Foo'"), path(), 5 + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("element 'Foo' is not allowed for content model '(SubtitleID,MovieTitle,ReelNumber,Language,LoadFont*,Font*,Subtitle*)'"), path(), 29 - }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"theFontId"} } + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"theFontId"} + ).set_cpl_id(cpl->id()) }); } @@ -837,15 +1276,24 @@ BOOST_AUTO_TEST_CASE(verify_interop_subtitle_asset_with_no_subtitles) copy_file("test/data/subs4.xml", dir / "subs.xml"); auto asset = make_shared<dcp::InteropSubtitleAsset>(dir / "subs.xml"); auto reel_asset = make_shared<dcp::ReelInteropSubtitleAsset>(asset, dcp::Fraction(24, 1), 16 * 24, 0); - write_dcp_with_single_asset(dir, reel_asset, dcp::Standard::INTEROP); + auto cpl = write_dcp_with_single_asset(dir, reel_asset, dcp::Standard::INTEROP); check_verify_result ( { dir }, {}, { + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE, asset->id(), boost::filesystem::canonical(asset->file().get()) }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"theFontId"} } + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE, asset->id(), boost::filesystem::canonical(asset->file().get()) + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"theFontId"} + ).set_cpl_id(cpl->id()) }); } @@ -858,14 +1306,21 @@ BOOST_AUTO_TEST_CASE(verify_interop_subtitle_asset_with_single_space_subtitle) copy_file("test/data/subs5.xml", dir / "subs.xml"); auto asset = make_shared<dcp::InteropSubtitleAsset>(dir / "subs.xml"); auto reel_asset = make_shared<dcp::ReelInteropSubtitleAsset>(asset, dcp::Fraction(24, 1), 16 * 24, 0); - write_dcp_with_single_asset(dir, reel_asset, dcp::Standard::INTEROP); + auto cpl = write_dcp_with_single_asset(dir, reel_asset, dcp::Standard::INTEROP); check_verify_result ( { dir }, {}, { + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"Arial"} } + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"Arial"} + ).set_cpl_id(cpl->id()) }); } @@ -884,9 +1339,21 @@ BOOST_AUTO_TEST_CASE (verify_valid_smpte_subtitles) {dir}, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }, - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_ISSUE_DATE, string{"2021-04-14T13:19:14.000+02:00"} }, - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INCORRECT_SUBTITLE_NAMESPACE_COUNT, asset->id() } + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_ISSUE_DATE, string{"2021-04-14T13:19:14.000+02:00"} + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INCORRECT_SUBTITLE_NAMESPACE_COUNT, asset->id() + ).set_cpl_id(cpl->id()), }); } @@ -907,18 +1374,34 @@ BOOST_AUTO_TEST_CASE (verify_invalid_smpte_subtitles) { dir }, {}, { - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'Foo'"), path(), 2 }, - { + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'Foo'"), path(), 2 + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("element 'Foo' is not allowed for content model '(Id,ContentTitleText,AnnotationText?,IssueDate,ReelNumber?,Language?,EditRate,TimeCodeRate,StartTime?,DisplayType?,LoadFont*,SubtitleList)'"), path(), 2 - }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(dir / "subs.mxf") }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }, - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_ISSUE_DATE, string{"2020-05-09T00:29:21.000+02:00"} }, - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INCORRECT_SUBTITLE_NAMESPACE_COUNT, asset->id() } + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(dir / "subs.mxf") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_ISSUE_DATE, string{"2020-05-09T00:29:21.000+02:00"} + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INCORRECT_SUBTITLE_NAMESPACE_COUNT, asset->id() + ).set_cpl_id(cpl->id()), }); } @@ -936,12 +1419,30 @@ BOOST_AUTO_TEST_CASE (verify_empty_text_node_in_subtitles) { dir }, {}, { - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EMPTY_TEXT }, - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_LANGUAGE, canonical(dir / "subs.mxf") }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }, - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_ISSUE_DATE, string{"2021-08-09T18:34:46.000+02:00"} }, - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INCORRECT_SUBTITLE_NAMESPACE_COUNT, asset->id() } + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EMPTY_TEXT + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_LANGUAGE, canonical(dir / "subs.mxf") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_ISSUE_DATE, string{"2021-08-09T18:34:46.000+02:00"} + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INCORRECT_SUBTITLE_NAMESPACE_COUNT, asset->id() + ).set_cpl_id(cpl->id()) }); } @@ -960,8 +1461,15 @@ BOOST_AUTO_TEST_CASE (verify_empty_text_node_in_subtitles_with_child_nodes) { dir }, {}, { + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"font0"} } + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"font0"} + ).set_cpl_id(cpl->id()) }); } @@ -980,10 +1488,21 @@ BOOST_AUTO_TEST_CASE (verify_empty_text_node_in_subtitles_with_empty_child_nodes { dir }, {}, { - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE, asset->id(), boost::filesystem::canonical(asset->file().get()) }, + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE, asset->id(), boost::filesystem::canonical(asset->file().get()) + ).set_cpl_id(cpl->id()), { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD }, - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EMPTY_TEXT }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"font0"} }, + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EMPTY_TEXT + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"font0"} + ).set_cpl_id(cpl->id()) }); } @@ -1011,8 +1530,16 @@ BOOST_AUTO_TEST_CASE (verify_external_asset) { vf_dir }, {}, { + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EXTERNAL_ASSET, picture->asset()->id() }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -1047,38 +1574,6 @@ BOOST_AUTO_TEST_CASE (verify_valid_cpl_metadata) } -path -find_prefix(path dir, string prefix) -{ - auto iter = std::find_if(directory_iterator(dir), directory_iterator(), [prefix](path const& p) { - return boost::starts_with(p.filename().string(), prefix); - }); - - BOOST_REQUIRE(iter != directory_iterator()); - return iter->path(); -} - - -path find_cpl (path dir) -{ - return find_prefix(dir, "cpl_"); -} - - -path -find_pkl(path dir) -{ - return find_prefix(dir, "pkl_"); -} - - -path -find_asset_map(path dir) -{ - return find_prefix(dir, "ASSETMAP"); -} - - /* DCP with invalid CompositionMetadataAsset */ BOOST_AUTO_TEST_CASE (verify_invalid_cpl_metadata_bad_tag) { @@ -1115,9 +1610,26 @@ BOOST_AUTO_TEST_CASE (verify_invalid_cpl_metadata_bad_tag) { dir }, {}, { - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'meta:MainSoundXConfiguration'"), canonical(cpl->file().get()), 50 }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'meta:MainSoundXSampleRate'"), canonical(cpl->file().get()), 51 }, - { + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "pic.mxf"), cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1440x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "pic.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'meta:MainSoundXConfiguration'"), canonical(cpl->file().get()), 50 + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'meta:MainSoundXSampleRate'"), canonical(cpl->file().get()), 51 + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("element 'meta:MainSoundXConfiguration' is not allowed for content model " @@ -1127,11 +1639,10 @@ BOOST_AUTO_TEST_CASE (verify_invalid_cpl_metadata_bad_tag) "MainSoundSampleRate,MainPictureStoredArea,MainPictureActiveArea,MainSubtitleLanguageList?," "ExtensionMetadataList?,)'"), canonical(cpl->file().get()), - 71 - }, + 71).set_cpl_id(cpl->id()), dcp::VerificationNote( - dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->id(), canonical(cpl->file().get()) - ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()) + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(cpl->file().get()) + ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()) }); } @@ -1185,9 +1696,21 @@ BOOST_AUTO_TEST_CASE (verify_invalid_language1) { dir }, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("badlang") }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("wrong-andbad") }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }, + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("badlang") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("wrong-andbad") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -1209,9 +1732,21 @@ BOOST_AUTO_TEST_CASE (verify_invalid_language2) {dir}, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("badlang") }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("wrong-andbad") }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("badlang") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("wrong-andbad") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -1252,16 +1787,38 @@ BOOST_AUTO_TEST_CASE (verify_invalid_language3) { dir }, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("this-is-wrong") }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("andso-is-this") }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("fred-jim") }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("frobozz") }, + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "videofoo.mxf"), cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1440x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "videofoo.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("this-is-wrong") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("andso-is-this") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("fred-jim") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("frobozz") + ).set_cpl_id(cpl->id()), }); } static -vector<dcp::VerificationNote> +std::tuple<vector<dcp::VerificationNote>, shared_ptr<dcp::CPL>, boost::filesystem::path> check_picture_size (int width, int height, int frame_rate, bool three_d) { using namespace boost::filesystem; @@ -1269,13 +1826,13 @@ check_picture_size (int width, int height, int frame_rate, bool three_d) path dcp_path = "build/test/verify_picture_test"; prepare_directory (dcp_path); - shared_ptr<dcp::PictureAsset> mp; + shared_ptr<dcp::J2KPictureAsset> mp; if (three_d) { - mp = make_shared<dcp::StereoPictureAsset>(dcp::Fraction(frame_rate, 1), dcp::Standard::SMPTE); + mp = make_shared<dcp::StereoJ2KPictureAsset>(dcp::Fraction(frame_rate, 1), dcp::Standard::SMPTE); } else { - mp = make_shared<dcp::MonoPictureAsset>(dcp::Fraction(frame_rate, 1), dcp::Standard::SMPTE); + mp = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction(frame_rate, 1), dcp::Standard::SMPTE); } - auto picture_writer = mp->start_write(dcp_path / "video.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW); + auto picture_writer = mp->start_write(dcp_path / "video.mxf", dcp::Behaviour::MAKE_NEW); auto image = black_image (dcp::Size(width, height)); auto j2c = dcp::compress_j2k (image, 100000000, frame_rate, three_d, width > 2048); @@ -1298,9 +1855,9 @@ check_picture_size (int width, int height, int frame_rate, bool three_d) auto reel = make_shared<dcp::Reel>(); if (three_d) { - reel->add (make_shared<dcp::ReelStereoPictureAsset>(std::dynamic_pointer_cast<dcp::StereoPictureAsset>(mp), 0)); + reel->add (make_shared<dcp::ReelStereoPictureAsset>(std::dynamic_pointer_cast<dcp::StereoJ2KPictureAsset>(mp), 0)); } else { - reel->add (make_shared<dcp::ReelMonoPictureAsset>(std::dynamic_pointer_cast<dcp::MonoPictureAsset>(mp), 0)); + reel->add (make_shared<dcp::ReelMonoPictureAsset>(std::dynamic_pointer_cast<dcp::MonoJ2KPictureAsset>(mp), 0)); } reel->add (simple_markers(frame_rate)); @@ -1311,7 +1868,8 @@ check_picture_size (int width, int height, int frame_rate, bool three_d) d->set_annotation_text("A Test DCP"); d->write_xml(); - return dcp::verify({dcp_path}, {}, &stage, &progress, {}, xsd_test); + /* It seems that for the Ubuntu 16.04 compiler we can't use an initializer list here */ + return std::tuple<vector<dcp::VerificationNote>, shared_ptr<dcp::CPL>, boost::filesystem::path>{ dcp::verify({dcp_path}, {}, &stage, &progress, {}, xsd_test).notes, cpl, dcp_path }; } @@ -1319,8 +1877,28 @@ static void check_picture_size_ok (int width, int height, int frame_rate, bool three_d) { - auto notes = check_picture_size(width, height, frame_rate, three_d); - BOOST_CHECK_EQUAL (notes.size(), 0U); + vector<dcp::VerificationNote> notes; + shared_ptr<dcp::CPL> cpl; + boost::filesystem::path dir; + std::tie(notes, cpl, dir) = check_picture_size(width, height, frame_rate, three_d); + + std::vector<dcp::VerificationNote> expected = { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + dcp::String::compose("%1x%2", width, height), + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl) + }; + check_verify_result(notes, expected); } @@ -1328,10 +1906,31 @@ static void check_picture_size_bad_frame_size (int width, int height, int frame_rate, bool three_d) { - auto notes = check_picture_size(width, height, frame_rate, three_d); - BOOST_REQUIRE_EQUAL (notes.size(), 1U); - BOOST_CHECK_EQUAL (notes.front().type(), dcp::VerificationNote::Type::BV21_ERROR); - BOOST_CHECK_EQUAL (notes.front().code(), dcp::VerificationNote::Code::INVALID_PICTURE_SIZE_IN_PIXELS); + vector<dcp::VerificationNote> notes; + shared_ptr<dcp::CPL> cpl; + boost::filesystem::path dir; + std::tie(notes, cpl, dir) = check_picture_size(width, height, frame_rate, three_d); + + std::vector<dcp::VerificationNote> expected = { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + dcp::String::compose("%1x%2", width, height), + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_PICTURE_SIZE_IN_PIXELS, dcp::String::compose("%1x%2", width, height), canonical(dir / "video.mxf") + ).set_cpl_id(cpl->id()) + }; + check_verify_result(notes, expected); } @@ -1339,10 +1938,35 @@ static void check_picture_size_bad_2k_frame_rate (int width, int height, int frame_rate, bool three_d) { - auto notes = check_picture_size(width, height, frame_rate, three_d); - BOOST_REQUIRE_EQUAL (notes.size(), 2U); - BOOST_CHECK_EQUAL (notes.back().type(), dcp::VerificationNote::Type::BV21_ERROR); - BOOST_CHECK_EQUAL (notes.back().code(), dcp::VerificationNote::Code::INVALID_PICTURE_FRAME_RATE_FOR_2K); + vector<dcp::VerificationNote> notes; + shared_ptr<dcp::CPL> cpl; + boost::filesystem::path dir; + std::tie(notes, cpl, dir) = check_picture_size(width, height, frame_rate, three_d); + + std::vector<dcp::VerificationNote> expected = { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + dcp::String::compose("%1x%2", width, height), + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_PICTURE_FRAME_RATE, dcp::String::compose("%1/1", frame_rate * (three_d ? 2 : 1)) + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_PICTURE_FRAME_RATE_FOR_2K, dcp::String::compose("%1/1", frame_rate), canonical(dir / "video.mxf") + ).set_cpl_id(cpl->id()) + }; + + check_verify_result(notes, expected); } @@ -1350,10 +1974,32 @@ static void check_picture_size_bad_4k_frame_rate (int width, int height, int frame_rate, bool three_d) { - auto notes = check_picture_size(width, height, frame_rate, three_d); - BOOST_REQUIRE_EQUAL (notes.size(), 1U); - BOOST_CHECK_EQUAL (notes.front().type(), dcp::VerificationNote::Type::BV21_ERROR); - BOOST_CHECK_EQUAL (notes.front().code(), dcp::VerificationNote::Code::INVALID_PICTURE_FRAME_RATE_FOR_4K); + vector<dcp::VerificationNote> notes; + shared_ptr<dcp::CPL> cpl; + boost::filesystem::path dir; + std::tie(notes, cpl, dir) = check_picture_size(width, height, frame_rate, three_d); + + std::vector<dcp::VerificationNote> expected = { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + dcp::String::compose("%1x%2", width, height), + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_PICTURE_FRAME_RATE_FOR_4K, dcp::String::compose("%1/1", frame_rate), canonical(dir / "video.mxf") + ).set_cpl_id(cpl->id()) + }; + + check_verify_result(notes, expected); } @@ -1399,10 +2045,28 @@ BOOST_AUTO_TEST_CASE (verify_picture_size) check_picture_size_bad_4k_frame_rate (3996, 2160, 48, false); /* No 4K 3D */ - auto notes = check_picture_size(3996, 2160, 24, true); - BOOST_REQUIRE_EQUAL (notes.size(), 1U); - BOOST_CHECK_EQUAL (notes.front().type(), dcp::VerificationNote::Type::BV21_ERROR); - BOOST_CHECK_EQUAL (notes.front().code(), dcp::VerificationNote::Code::INVALID_PICTURE_ASSET_RESOLUTION_FOR_3D); + vector<dcp::VerificationNote> notes; + shared_ptr<dcp::CPL> cpl; + boost::filesystem::path dir; + std::tie(notes, cpl, dir) = check_picture_size(3996, 2160, 24, true); + + std::vector<dcp::VerificationNote> expected = { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"3996x2160"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_PICTURE_ASSET_RESOLUTION_FOR_3D }, + }; } @@ -1458,15 +2122,27 @@ BOOST_AUTO_TEST_CASE (verify_invalid_closed_caption_xml_size_in_bytes) { dir }, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(dir / "subs.mxf") }, - { + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(dir / "subs.mxf") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_CLOSED_CAPTION_XML_SIZE_IN_BYTES, string("419371"), canonical(dir / "subs.mxf") - }, - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }, + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -1503,11 +2179,30 @@ verify_timed_text_asset_too_large (string name) { dir }, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_TIMED_TEXT_SIZE_IN_BYTES, string("121695488"), canonical(dir / "subs.mxf") }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_TIMED_TEXT_FONT_SIZE_IN_BYTES, string("121634816"), canonical(dir / "subs.mxf") }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(dir / "subs.mxf") }, - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }, + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_TIMED_TEXT_SIZE_IN_BYTES, string("121698284"), canonical(dir / "subs.mxf") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, + dcp::VerificationNote::Code::INVALID_TIMED_TEXT_FONT_SIZE_IN_BYTES, + dcp::raw_convert<string>(121634816), + canonical(dir / "subs.mxf") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(dir / "subs.mxf") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -1554,15 +2249,34 @@ BOOST_AUTO_TEST_CASE (verify_missing_subtitle_language) subs->write (dir / "subs.mxf"); auto reel_subs = make_shared<dcp::ReelSMPTESubtitleAsset>(subs, dcp::Fraction(24, 1), 106, 0); - dcp->cpls()[0]->reels()[0]->add(reel_subs); + auto cpl = dcp->cpls()[0]; + cpl->reels()[0]->add(reel_subs); dcp->write_xml(); check_verify_result ( { dir }, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_LANGUAGE, canonical(dir / "subs.mxf") }, - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME } + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_LANGUAGE, canonical(dir / "subs.mxf") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME + ).set_cpl_id(cpl->id()) }); } @@ -1600,9 +2314,31 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_subtitle_languages) { path }, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(path / "subs1.mxf") }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(path / "subs2.mxf") }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_SUBTITLE_LANGUAGES } + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "video0.mxf"), cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "video1.mxf"), cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(path / "video0.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(path / "video1.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(path / "subs1.mxf") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(path / "subs2.mxf") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_SUBTITLE_LANGUAGES + ).set_cpl_id(cpl->id()), }); } @@ -1640,8 +2376,28 @@ BOOST_AUTO_TEST_CASE (verify_multiple_closed_caption_languages_allowed) { path }, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(path / "subs1.mxf") }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(path / "subs2.mxf") } + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "video0.mxf"), cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "video1.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(path / "video0.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(path / "video1.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(path / "subs1.mxf") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(path / "subs2.mxf") + ).set_cpl_id(cpl->id()) }); } @@ -1681,15 +2437,34 @@ BOOST_AUTO_TEST_CASE (verify_missing_subtitle_start_time) subs->write (dir / "subs.mxf"); auto reel_subs = make_shared<dcp::ReelSMPTESubtitleAsset>(subs, dcp::Fraction(24, 1), 106, 0); - dcp->cpls()[0]->reels()[0]->add(reel_subs); + auto cpl = dcp->cpls()[0]; + cpl->reels()[0]->add(reel_subs); dcp->write_xml(); check_verify_result ( { dir }, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(dir / "subs.mxf") }, - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME } + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(dir / "subs.mxf") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME + ).set_cpl_id(cpl->id()) }); } @@ -1730,15 +2505,34 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_start_time) subs->write (dir / "subs.mxf"); auto reel_subs = make_shared<dcp::ReelSMPTESubtitleAsset>(subs, dcp::Fraction(24, 1), 106, 0); - dcp->cpls().front()->reels().front()->add(reel_subs); + auto cpl = dcp->cpls()[0]; + cpl->reels().front()->add(reel_subs); dcp->write_xml(); check_verify_result ( { dir }, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_SUBTITLE_START_TIME, canonical(dir / "subs.mxf") }, - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME } + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_SUBTITLE_START_TIME, canonical(dir / "subs.mxf") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME + ).set_cpl_id(cpl->id()) }); } @@ -1831,8 +2625,18 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_first_text_time) { dir }, {}, { - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -1843,7 +2647,20 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_first_text_time) auto const dir = path("build/test/verify_valid_subtitle_first_text_time"); /* Just late enough */ auto cpl = dcp_with_text<dcp::ReelSMPTESubtitleAsset> (dir, {{ 4 * 24, 5 * 24 }}); - check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }}); + check_verify_result( + {dir}, + {}, + { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) + }); } @@ -1888,7 +2705,20 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_first_text_time_on_second_reel) dcp->set_annotation_text("hello"); dcp->write_xml(); - check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }}); + check_verify_result( + {dir}, + {}, + { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) + }); } @@ -1905,8 +2735,18 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_spacing) {dir}, {}, { - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_SPACING }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_SPACING + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -1920,7 +2760,21 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_spacing) { 4 * 24, 5 * 24 }, { 5 * 24 + 16, 8 * 24 }, }); - check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }}); + + check_verify_result( + {dir}, + {}, + { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) + }); } @@ -1932,8 +2786,18 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_duration) {dir}, {}, { - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_DURATION }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_DURATION + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -1942,7 +2806,21 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_duration) { auto const dir = path("build/test/verify_valid_subtitle_duration"); auto cpl = dcp_with_text<dcp::ReelSMPTESubtitleAsset> (dir, {{ 4 * 24, 4 * 24 + 17 }}); - check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }}); + + check_verify_result( + {dir}, + {}, + { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) + }); } @@ -1963,10 +2841,24 @@ BOOST_AUTO_TEST_CASE (verify_subtitle_overlapping_reel_boundary) {dir}, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_TIMED_TEXT_DURATION , "72 96", boost::filesystem::canonical(asset->file().get()) }, - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::SUBTITLE_OVERLAPS_REEL_BOUNDARY }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_TIMED_TEXT_DURATION , "72 96", boost::filesystem::canonical(asset->file().get()) + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::SUBTITLE_OVERLAPS_REEL_BOUNDARY + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -1987,8 +2879,18 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_line_count1) {dir}, {}, { - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_LINE_COUNT }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_LINE_COUNT + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -2003,7 +2905,21 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_line_count1) { 96, 200, 0.1, dcp::VAlign::CENTER, "have" }, { 96, 200, 0.2, dcp::VAlign::CENTER, "four" }, }); - check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }}); + + check_verify_result( + {dir}, + {}, + { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) + }); } @@ -2022,8 +2938,18 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_line_count2) {dir}, {}, { - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_LINE_COUNT }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_LINE_COUNT + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -2039,7 +2965,21 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_line_count2) { 150, 180, 0.2, dcp::VAlign::CENTER, "four" }, { 190, 250, 0.3, dcp::VAlign::CENTER, "lines" } }); - check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }}); + + check_verify_result( + {dir}, + {}, + { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) + }); } @@ -2055,8 +2995,18 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_line_length1) {dir}, {}, { - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::NEARLY_INVALID_SUBTITLE_LINE_LENGTH }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::NEARLY_INVALID_SUBTITLE_LINE_LENGTH + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -2073,8 +3023,18 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_line_length2) {dir}, {}, { - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_LINE_LENGTH }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_LINE_LENGTH + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -2094,8 +3054,18 @@ BOOST_AUTO_TEST_CASE (verify_valid_closed_caption_line_count1) {dir}, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_CLOSED_CAPTION_LINE_COUNT}, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_CLOSED_CAPTION_LINE_COUNT + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -2110,7 +3080,21 @@ BOOST_AUTO_TEST_CASE (verify_valid_closed_caption_line_count2) { 96, 200, 0.1, dcp::VAlign::CENTER, "have" }, { 96, 200, 0.2, dcp::VAlign::CENTER, "four" }, }); - check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }}); + + check_verify_result( + {dir}, + {}, + { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) + }); } @@ -2129,8 +3113,18 @@ BOOST_AUTO_TEST_CASE (verify_invalid_closed_caption_line_count3) {dir}, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_CLOSED_CAPTION_LINE_COUNT}, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_CLOSED_CAPTION_LINE_COUNT + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -2146,7 +3140,21 @@ BOOST_AUTO_TEST_CASE (verify_valid_closed_caption_line_count4) { 150, 180, 0.2, dcp::VAlign::CENTER, "four" }, { 190, 250, 0.3, dcp::VAlign::CENTER, "lines" } }); - check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }}); + + check_verify_result( + {dir}, + {}, + { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) + }); } @@ -2158,11 +3166,20 @@ BOOST_AUTO_TEST_CASE (verify_valid_closed_caption_line_length) { { 96, 300, 0.0, dcp::VAlign::CENTER, "01234567890123456789012345678901" } }); + check_verify_result ( {dir}, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -2179,8 +3196,18 @@ BOOST_AUTO_TEST_CASE (verify_invalid_closed_caption_line_length) {dir}, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_CLOSED_CAPTION_LINE_LENGTH }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_CLOSED_CAPTION_LINE_LENGTH + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -2199,7 +3226,15 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_closed_caption_valign1) {dir}, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -2218,8 +3253,18 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_closed_caption_valign2) {dir}, {}, { - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CLOSED_CAPTION_VALIGN }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CLOSED_CAPTION_VALIGN + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -2234,11 +3279,20 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_closed_caption_ordering1) { 96, 300, 0.1, dcp::VAlign::TOP, "is" }, { 96, 300, 0.2, dcp::VAlign::TOP, "fine" }, }); - check_verify_result ( + + check_verify_result( {dir}, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -2253,11 +3307,20 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_closed_caption_ordering2) { 96, 300, 0.1, dcp::VAlign::BOTTOM, "is" }, { 96, 300, 0.0, dcp::VAlign::BOTTOM, "also fine" }, }); - check_verify_result ( + + check_verify_result( {dir}, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -2270,8 +3333,18 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_closed_caption_ordering3) {dir}, {}, { - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INCORRECT_CLOSED_CAPTION_ORDERING }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INCORRECT_CLOSED_CAPTION_ORDERING + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -2280,11 +3353,20 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_closed_caption_ordering4) { auto const dir = path ("build/test/verify_incorrect_closed_caption_ordering4"); auto cpl = dcp_with_text_from_file<dcp::ReelSMPTEClosedCaptionAsset> (dir, "test/data/verify_incorrect_closed_caption_ordering4.xml"); - check_verify_result ( + + check_verify_result( {dir}, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -2314,8 +3396,20 @@ BOOST_AUTO_TEST_CASE (verify_invalid_sound_frame_rate) {dir}, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_SOUND_FRAME_RATE, string("96000"), canonical(dir / "audiofoo.mxf") }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }, + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "videofoo.mxf"), cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "videofoo.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_SOUND_FRAME_RATE, string("96000"), canonical(dir / "audiofoo.mxf") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -2342,10 +3436,24 @@ BOOST_AUTO_TEST_CASE (verify_missing_cpl_annotation_text) {dir}, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_ANNOTATION_TEXT, cpl->id(), canonical(cpl->file().get()) }, + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), dcp::VerificationNote( - dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->id(), canonical(cpl->file().get()) - ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()) + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_ANNOTATION_TEXT, canonical(cpl->file().get()) + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(cpl->file().get()) + ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()) }); } @@ -2371,10 +3479,24 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_cpl_annotation_text) {dir}, {}, { - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISMATCHED_CPL_ANNOTATION_TEXT, cpl->id(), canonical(cpl->file().get()) }, + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), dcp::VerificationNote( - dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->id(), canonical(cpl->file().get()) - ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()) + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISMATCHED_CPL_ANNOTATION_TEXT, canonical(cpl->file().get()) + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(cpl->file().get()) + ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()).set_cpl_id(cpl->id()) }); } @@ -2386,7 +3508,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_asset_duration) shared_ptr<dcp::DCP> dcp (new dcp::DCP(dir)); auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::TRAILER, dcp::Standard::SMPTE); - shared_ptr<dcp::MonoPictureAsset> mp = simple_picture (dir, "", 24); + shared_ptr<dcp::MonoJ2KPictureAsset> mp = simple_picture (dir, "", 24); shared_ptr<dcp::SoundAsset> ms = simple_sound (dir, "", dcp::MXFMetadata(), "en-US", 25); auto reel = make_shared<dcp::Reel>( @@ -2405,8 +3527,20 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_asset_duration) {dir}, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_ASSET_DURATION }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), canonical(cpl->file().get()) } + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_ASSET_DURATION + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, canonical(cpl->file().get()) + ).set_cpl_id(cpl->id()) }); } @@ -2477,8 +3611,22 @@ BOOST_AUTO_TEST_CASE (verify_missing_main_subtitle_from_some_reels) { dir }, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_MAIN_SUBTITLE_FROM_SOME_REELS }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }, + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video1.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video2.mxf"), cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video1.mxf"), cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video2.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_MAIN_SUBTITLE_FROM_SOME_REELS + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -2486,13 +3634,47 @@ BOOST_AUTO_TEST_CASE (verify_missing_main_subtitle_from_some_reels) { path dir ("build/test/verify_subtitles_must_be_in_all_reels2"); auto cpl = verify_subtitles_must_be_in_all_reels_check (dir, true, true); - check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }}); + check_verify_result( + {dir}, + {}, + { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video1.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video2.mxf"), cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video1.mxf"), cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video2.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) + }); } { path dir ("build/test/verify_subtitles_must_be_in_all_reels1"); auto cpl = verify_subtitles_must_be_in_all_reels_check (dir, false, false); - check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }}); + check_verify_result( + {dir}, + {}, + { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video1.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video2.mxf"), cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video1.mxf"), cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video2.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) + }); } } @@ -2561,21 +3743,69 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_closed_caption_asset_counts) {dir}, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_CLOSED_CAPTION_ASSET_COUNTS }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video1.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video2.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video1.mxf"), cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video2.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_CLOSED_CAPTION_ASSET_COUNTS + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } { path dir ("build/test/verify_closed_captions_must_be_in_all_reels2"); auto cpl = verify_closed_captions_must_be_in_all_reels_check (dir, 4, 4); - check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }}); + check_verify_result( + {dir}, + {}, + { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video1.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video2.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video1.mxf"), cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video2.mxf"), cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) + }); } { path dir ("build/test/verify_closed_captions_must_be_in_all_reels3"); auto cpl = verify_closed_captions_must_be_in_all_reels_check (dir, 0, 0); - check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }}); + check_verify_result( + {dir}, + {}, + { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video1.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video2.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video1.mxf"), cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video2.mxf"), cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) + }); } } @@ -2618,8 +3848,20 @@ verify_text_entry_point_check (path dir, dcp::VerificationNote::Code code, boost {dir}, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, code, subs->id() }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }, + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, code, subs->id() + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -2686,10 +3928,25 @@ BOOST_AUTO_TEST_CASE (verify_missing_hash) {dir}, {}, { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->file().get() + ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), dcp::VerificationNote( - dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get() - ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_HASH, asset_id } + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_HASH, asset_id + ).set_cpl_id(cpl->id()) }); } @@ -2703,14 +3960,36 @@ verify_markers_test ( ) { auto dcp = make_simple (dir); - dcp->cpls()[0]->set_content_kind (dcp::ContentKind::FEATURE); + auto cpl = dcp->cpls()[0]; + cpl->set_content_kind(dcp::ContentKind::FEATURE); auto markers_asset = make_shared<dcp::ReelMarkersAsset>(dcp::Fraction(24, 1), 24); for (auto const& i: markers) { markers_asset->set (i.first, i.second); } - dcp->cpls()[0]->reels()[0]->add(markers_asset); + cpl->reels()[0]->add(markers_asset); dcp->write_xml(); + for (auto& note: test_notes) { + note.set_cpl_id(cpl->id()); + } + + test_notes.push_back(ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl)); + test_notes.push_back(ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl)); + test_notes.push_back(ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl)); + test_notes.push_back(ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl)); + test_notes.push_back( + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()) + ); + test_notes.push_back(ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"feature"}, cpl)); + test_notes.push_back(ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl)); + test_notes.push_back(ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl)); + test_notes.push_back(ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl)); + check_verify_result({dir}, {}, test_notes); } @@ -2807,7 +4086,28 @@ BOOST_AUTO_TEST_CASE (verify_missing_cpl_metadata_version_number) cpl->unset_version_number(); dcp->write_xml(); - check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA_VERSION_NUMBER, cpl->id(), cpl->file().get() }}); + check_verify_result( + {dir}, + {}, + { + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA_VERSION_NUMBER, cpl->file().get() + ).set_cpl_id(cpl->id()) + }); } @@ -2831,10 +4131,25 @@ BOOST_AUTO_TEST_CASE (verify_missing_extension_metadata1) {dir}, {}, { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->file().get() + ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), dcp::VerificationNote( - dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get() - ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_EXTENSION_METADATA, cpl->id(), cpl->file().get() } + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_EXTENSION_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -2858,10 +4173,25 @@ BOOST_AUTO_TEST_CASE (verify_missing_extension_metadata2) {dir}, {}, { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->file().get() + ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), dcp::VerificationNote( - dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get() - ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_EXTENSION_METADATA, cpl->id(), cpl->file().get() } + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_EXTENSION_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -2886,11 +4216,27 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata3) {dir}, {}, { - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'meta:NameX'"), cpl->file().get(), 70 }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("element 'meta:NameX' is not allowed for content model '(Name,PropertyList?,)'"), cpl->file().get(), 77 }, + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), dcp::VerificationNote( - dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get() - ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'meta:NameX'"), cpl->file().get(), 70 + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("element 'meta:NameX' is not allowed for content model '(Name,PropertyList?,)'"), cpl->file().get(), 77).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->file().get() + ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), }); } @@ -2914,10 +4260,25 @@ BOOST_AUTO_TEST_CASE (verify_invalid_extension_metadata1) {dir}, {}, { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), dcp::VerificationNote( - dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get() - ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_EXTENSION_METADATA, string("<Name> should be 'Application'"), cpl->file().get() }, + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->file().get() + ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_EXTENSION_METADATA, string("<Name> should be 'Application'"), cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -2941,10 +4302,25 @@ BOOST_AUTO_TEST_CASE (verify_invalid_extension_metadata2) {dir}, {}, { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->file().get() + ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), dcp::VerificationNote( - dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get() - ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_EXTENSION_METADATA, string("<Name> property should be 'DCP Constraints Profile'"), cpl->file().get() }, + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_EXTENSION_METADATA, string("<Name> property should be 'DCP Constraints Profile'"), cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -2969,11 +4345,28 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata6) {dir}, {}, { - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'meta:ValueX'"), cpl->file().get(), 74 }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("element 'meta:ValueX' is not allowed for content model '(Name,Value)'"), cpl->file().get(), 75 }, + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'meta:ValueX'"), cpl->file().get(), 74 + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("element 'meta:ValueX' is not allowed for content model '(Name,Value)'"), cpl->file().get(), 75 + ).set_cpl_id(cpl->id()), dcp::VerificationNote( - dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get() - ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->file().get() + ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()) }); } @@ -2997,10 +4390,25 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata7) {dir}, {}, { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), dcp::VerificationNote( - dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get() - ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_EXTENSION_METADATA, string("<Value> property should be 'SMPTE-RDD-52:2020-Bv2.1'"), cpl->file().get() }, + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->file().get() + ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_EXTENSION_METADATA, string("<Value> property should be 'SMPTE-RDD-52:2020-Bv2.1'"), cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -3025,11 +4433,27 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata8) {dir}, {}, { - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'meta:PropertyX'"), cpl->file().get(), 72 }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("element 'meta:PropertyX' is not allowed for content model '(Property+)'"), cpl->file().get(), 76 }, + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), dcp::VerificationNote( - dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get() - ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'meta:PropertyX'"), cpl->file().get(), 72 + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("element 'meta:PropertyX' is not allowed for content model '(Property+)'"), cpl->file().get(), 76).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->file().get() + ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), }); } @@ -3054,11 +4478,28 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata9) {dir}, {}, { - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'meta:PropertyListX'"), cpl->file().get(), 71 }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("element 'meta:PropertyListX' is not allowed for content model '(Name,PropertyList?,)'"), cpl->file().get(), 77 }, + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'meta:PropertyListX'"), cpl->file().get(), 71 + ).set_cpl_id(cpl->id()), dcp::VerificationNote( - dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get() - ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("element 'meta:PropertyListX' is not allowed for content model '(Name,PropertyList?,)'"), cpl->file().get(), 77 + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->file().get() + ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), }); } @@ -3066,36 +4507,58 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata9) BOOST_AUTO_TEST_CASE (verify_unsigned_cpl_with_encrypted_content) { - path dir = "build/test/verify_unsigned_cpl_with_encrypted_content"; + path const dir = "build/test/verify_unsigned_cpl_with_encrypted_content"; prepare_directory (dir); for (auto i: directory_iterator("test/ref/DCP/encryption_test")) { copy_file (i.path(), dir / i.path().filename()); } - path const pkl = dir / ( "pkl_" + encryption_test_pkl_id() + ".xml" ); - path const cpl = dir / ( "cpl_" + encryption_test_cpl_id() + ".xml"); + path const pkl = dir / ( "pkl_" + encryption_test_pkl_id() + ".xml"); + path const cpl_path = dir / ( "cpl_" + encryption_test_cpl_id() + ".xml"); - HashCalculator calc(cpl); + HashCalculator calc(cpl_path); { - Editor e (cpl); + Editor e(cpl_path); e.delete_lines ("<dsig:Signature", "</dsig:Signature>"); } + auto cpl = std::make_shared<dcp::CPL>(cpl_path); + check_verify_result ( {dir}, {}, { + ok(dcp::VerificationNote::Code::ALL_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"feature"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(cpl_path) + ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL, encryption_test_pkl_id(), canonical(pkl) + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFEC_IN_FEATURE + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFMC_IN_FEATURE + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_FFOC + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_LFOC + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, canonical(cpl_path) + ).set_cpl_id(cpl->id()), dcp::VerificationNote( - dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, encryption_test_cpl_id(), canonical(cpl) - ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL, encryption_test_pkl_id(), canonical(pkl), }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFEC_IN_FEATURE }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFMC_IN_FEATURE }, - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_FFOC }, - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_LFOC }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, encryption_test_cpl_id(), canonical(cpl) }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::UNSIGNED_CPL_WITH_ENCRYPTED_CONTENT, encryption_test_cpl_id(), canonical(cpl) } + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::UNSIGNED_CPL_WITH_ENCRYPTED_CONTENT, canonical(cpl_path) + ).set_cpl_id(cpl->id()) }); } @@ -3108,24 +4571,47 @@ BOOST_AUTO_TEST_CASE (verify_unsigned_pkl_with_encrypted_content) copy_file (i.path(), dir / i.path().filename()); } - path const cpl = dir / ("cpl_" + encryption_test_cpl_id() + ".xml"); + path const cpl_path = dir / ("cpl_" + encryption_test_cpl_id() + ".xml"); path const pkl = dir / ("pkl_" + encryption_test_pkl_id() + ".xml"); { Editor e (pkl); e.delete_lines ("<dsig:Signature", "</dsig:Signature>"); } + auto cpl = std::make_shared<dcp::CPL>(cpl_path); + check_verify_result ( {dir}, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL, encryption_test_pkl_id(), canonical(pkl) }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFEC_IN_FEATURE }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFMC_IN_FEATURE }, - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_FFOC }, - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_LFOC }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, encryption_test_cpl_id(), canonical(cpl) }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::UNSIGNED_PKL_WITH_ENCRYPTED_CONTENT, encryption_test_pkl_id(), canonical(pkl) }, + ok(dcp::VerificationNote::Code::ALL_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"feature"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL, encryption_test_pkl_id(), canonical(pkl) + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFEC_IN_FEATURE + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFMC_IN_FEATURE + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_FFOC + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_LFOC + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, canonical(cpl_path) + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::UNSIGNED_PKL_WITH_ENCRYPTED_CONTENT, encryption_test_pkl_id(), canonical(pkl) + ) }); } @@ -3143,7 +4629,27 @@ BOOST_AUTO_TEST_CASE (verify_unsigned_pkl_with_unencrypted_content) e.delete_lines ("<dsig:Signature", "</dsig:Signature>"); } - check_verify_result({dir}, {}, {}); + auto cpl = make_shared<dcp::CPL>(find_cpl(dir)); + + check_verify_result( + {dir}, + {}, + { + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + canonical(cpl->file().get()) + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + }); } @@ -3164,10 +4670,10 @@ BOOST_AUTO_TEST_CASE (verify_partially_encrypted) dcp::Key key; - auto mp = make_shared<dcp::MonoPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE); + auto mp = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE); mp->set_key (key); - auto writer = mp->start_write(dir / "video.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW); + auto writer = mp->start_write(dir / "video.mxf", dcp::Behaviour::MAKE_NEW); dcp::ArrayData j2c ("test/data/flat_red.j2c"); for (int i = 0; i < 24; ++i) { writer->write (j2c.data(), j2c.size()); @@ -3210,7 +4716,22 @@ BOOST_AUTO_TEST_CASE (verify_partially_encrypted) {dir}, {}, { - {dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::PARTIALLY_ENCRYPTED}, + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1440x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::PARTIALLY_ENCRYPTED + ).set_cpl_id(cpl->id()) }); } @@ -3218,22 +4739,22 @@ BOOST_AUTO_TEST_CASE (verify_partially_encrypted) BOOST_AUTO_TEST_CASE (verify_jpeg2000_codestream_2k) { vector<dcp::VerificationNote> notes; - dcp::MonoPictureAsset picture (find_file(private_test / "data" / "JourneyToJah_TLR-1_F_EN-DE-FR_CH_51_2K_LOK_20140225_DGL_SMPTE_OV", "j2c.mxf")); + dcp::MonoJ2KPictureAsset picture (find_file(private_test / "data" / "JourneyToJah_TLR-1_F_EN-DE-FR_CH_51_2K_LOK_20140225_DGL_SMPTE_OV", "j2c.mxf")); auto reader = picture.start_read (); auto frame = reader->get_frame (0); verify_j2k(frame, 0, 0, 24, notes); - BOOST_REQUIRE_EQUAL (notes.size(), 0U); + BOOST_CHECK(notes.empty()); } BOOST_AUTO_TEST_CASE (verify_jpeg2000_codestream_4k) { vector<dcp::VerificationNote> notes; - dcp::MonoPictureAsset picture (find_file(private_test / "data" / "sul", "TLR")); + dcp::MonoJ2KPictureAsset picture (find_file(private_test / "data" / "sul", "TLR")); auto reader = picture.start_read (); auto frame = reader->get_frame (0); verify_j2k(frame, 0, 0, 24, notes); - BOOST_REQUIRE_EQUAL (notes.size(), 0U); + BOOST_CHECK(notes.empty()); } @@ -3244,11 +4765,11 @@ BOOST_AUTO_TEST_CASE (verify_jpeg2000_codestream_libdcp) auto dcp = make_simple (dir); dcp->write_xml (); vector<dcp::VerificationNote> notes; - dcp::MonoPictureAsset picture (find_file(dir, "video")); + dcp::MonoJ2KPictureAsset picture (find_file(dir, "video")); auto reader = picture.start_read (); auto frame = reader->get_frame (0); verify_j2k(frame, 0, 0, 24, notes); - BOOST_REQUIRE_EQUAL (notes.size(), 0U); + BOOST_CHECK(notes.empty()); } @@ -3310,10 +4831,24 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_subtitle_resource_id) { dir }, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_TIMED_TEXT_DURATION , "240 0", boost::filesystem::canonical(subs_mxf) }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_TIMED_TEXT_RESOURCE_ID }, - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_TIMED_TEXT_DURATION , "240 0", boost::filesystem::canonical(subs_mxf) + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_TIMED_TEXT_RESOURCE_ID + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()) }); } @@ -3376,11 +4911,27 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_timed_text_id) { dir }, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_TIMED_TEXT_DURATION , "240 0", boost::filesystem::canonical(subs_mxf) }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INCORRECT_TIMED_TEXT_ASSET_ID }, - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }, - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_ISSUE_DATE, string{"2018-10-02T12:25:14+02:00"} } + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_TIMED_TEXT_DURATION , "240 0", boost::filesystem::canonical(subs_mxf) + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INCORRECT_TIMED_TEXT_ASSET_ID + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get() + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_ISSUE_DATE, string{"2018-10-02T12:25:14+02:00"} + ).set_cpl_id(cpl->id()) }); } @@ -3388,18 +4939,29 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_timed_text_id) /** Check a DCP with a 3D asset marked as 2D */ BOOST_AUTO_TEST_CASE (verify_threed_marked_as_twod) { + auto const path = private_test / "data" / "xm"; + + auto cpl = std::make_shared<dcp::CPL>(find_prefix(path, "CPL_")); + BOOST_REQUIRE(cpl); + check_verify_result ( - { private_test / "data" / "xm" }, + { path }, {}, { - { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "0d6f57e6-adac-4e1d-bfbe-d162bf13e2cd_j2c.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(path / "0d6f57e6-adac-4e1d-bfbe-d162bf13e2cd_j2c.mxf"), cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + dcp::VerificationNote( dcp::VerificationNote::Type::WARNING, - dcp::VerificationNote::Code::THREED_ASSET_MARKED_AS_TWOD, boost::filesystem::canonical(find_file(private_test / "data" / "xm", "j2c")) - }, - { + dcp::VerificationNote::Code::THREED_ASSET_MARKED_AS_TWOD, boost::filesystem::canonical(find_file(path, "j2c")) + ), + dcp::VerificationNote( dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD - }, + ) }); } @@ -3422,17 +4984,34 @@ BOOST_AUTO_TEST_CASE (verify_unexpected_things_in_main_markers) ); } - dcp::CPL cpl (find_cpl(dir)); + auto cpl = make_shared<dcp::CPL>(find_cpl(dir)); check_verify_result ( { dir }, {}, { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + canonical(cpl->file().get()) + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(find_cpl(dir)) + ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::UNEXPECTED_ENTRY_POINT + ).set_cpl_id(cpl->id()), dcp::VerificationNote( - dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl.id(), canonical(find_cpl(dir)) - ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::UNEXPECTED_ENTRY_POINT }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::UNEXPECTED_DURATION }, + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::UNEXPECTED_DURATION + ).set_cpl_id(cpl->id()) }); } @@ -3451,16 +5030,30 @@ BOOST_AUTO_TEST_CASE(verify_invalid_content_kind) e.replace("trailer", "trip"); } - dcp::CPL cpl (find_cpl(dir)); + auto cpl = std::make_shared<dcp::CPL>(find_cpl(dir)); check_verify_result ( { dir }, {}, { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), dcp::VerificationNote( - dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl.id(), canonical(find_cpl(dir)) - ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_CONTENT_KIND, string("trip") } + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + canonical(cpl->file().get()) + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(find_cpl(dir)) + ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_CONTENT_KIND, string("trip") + ).set_cpl_id(cpl->id()), }); } @@ -3480,17 +5073,28 @@ BOOST_AUTO_TEST_CASE(verify_valid_content_kind) e.replace("<ContentKind>trailer</ContentKind>", "<ContentKind scope=\"http://bobs.contents/\">trip</ContentKind>"); } - dcp::CPL cpl (find_cpl(dir)); + auto cpl = std::make_shared<dcp::CPL>(find_cpl(dir)); check_verify_result ( { dir }, {}, { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + canonical(cpl->file().get()) + ).set_cpl_id(cpl->id()), dcp::VerificationNote( - dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl.id(), canonical(find_cpl(dir)) - ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(find_cpl(dir)) + ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), }); - } @@ -3513,17 +5117,28 @@ BOOST_AUTO_TEST_CASE(verify_invalid_main_picture_active_area_1) } dcp::PKL pkl(find_pkl(dir)); - dcp::CPL cpl(find_cpl(dir)); + auto cpl = std::make_shared<dcp::CPL>(find_cpl(dir)); check_verify_result( { dir }, {}, { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(find_cpl(dir)) + ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), dcp::VerificationNote( - dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl.id(), canonical(find_cpl(dir)) - ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "width 1997 is not a multiple of 2", canonical(find_cpl(dir)) }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "height 4080 is bigger than the asset height 1080", canonical(find_cpl(dir)) }, + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "width 1997 is not a multiple of 2", canonical(find_cpl(dir)) + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "height 4080 is bigger than the asset height 1080", canonical(find_cpl(dir)) + ).set_cpl_id(cpl->id()), }); } @@ -3547,18 +5162,31 @@ BOOST_AUTO_TEST_CASE(verify_invalid_main_picture_active_area_2) } dcp::PKL pkl(find_pkl(dir)); - dcp::CPL cpl(find_cpl(dir)); + auto cpl = std::make_shared<dcp::CPL>(find_cpl(dir)); check_verify_result( { dir }, {}, { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(find_cpl(dir)) + ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "height 5125 is not a multiple of 2", canonical(find_cpl(dir)) + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "width 9900 is bigger than the asset width 1998", canonical(find_cpl(dir)) + ).set_cpl_id(cpl->id()), dcp::VerificationNote( - dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl.id(), canonical(find_cpl(dir)) - ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()), - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "height 5125 is not a multiple of 2", canonical(find_cpl(dir)) }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "width 9900 is bigger than the asset width 1998", canonical(find_cpl(dir)) }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "height 5125 is bigger than the asset height 1080", canonical(find_cpl(dir)) }, + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "height 5125 is bigger than the asset height 1080", canonical(find_cpl(dir)) + ).set_cpl_id(cpl->id()) }); } @@ -3578,11 +5206,24 @@ BOOST_AUTO_TEST_CASE(verify_duplicate_pkl_asset_ids) } dcp::PKL pkl(find_pkl(dir)); + auto cpl = std::make_shared<dcp::CPL>(find_cpl(dir)); check_verify_result( { dir }, {}, { + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + canonical(cpl->file().get()) + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::DUPLICATE_ASSET_ID_IN_PKL, pkl.id(), canonical(find_pkl(dir)) }, }); } @@ -3604,13 +5245,30 @@ BOOST_AUTO_TEST_CASE(verify_duplicate_assetmap_asset_ids) dcp::PKL pkl(find_pkl(dir)); dcp::AssetMap asset_map(find_asset_map(dir)); + auto cpl = make_shared<dcp::CPL>(find_cpl(dir)); check_verify_result( { dir }, {}, { - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::DUPLICATE_ASSET_ID_IN_ASSETMAP, asset_map.id(), canonical(find_asset_map(dir)) }, - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EXTERNAL_ASSET, string("5407b210-4441-4e97-8b16-8bdc7c12da54") }, + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + canonical(cpl->file().get()) + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::DUPLICATE_ASSET_ID_IN_ASSETMAP, asset_map.id(), canonical(find_asset_map(dir)) + ), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EXTERNAL_ASSET, string("5407b210-4441-4e97-8b16-8bdc7c12da54") + ) }); } @@ -3683,7 +5341,25 @@ BOOST_AUTO_TEST_CASE(verify_mismatched_sound_channel_counts) { path }, {}, { - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_SOUND_CHANNEL_COUNTS, canonical(find_file(path, "audio2")) }, + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "video1.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(path / "video1.mxf"), cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "video2.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(path / "video2.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_SOUND_CHANNEL_COUNTS, canonical(find_file(path, "audio2")) + ).set_cpl_id(cpl->id()) }); } @@ -3734,7 +5410,23 @@ BOOST_AUTO_TEST_CASE(verify_invalid_main_sound_configuration) { path }, {}, { - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_SOUND_CONFIGURATION, std::string{"MainSoundConfiguration has 6 channels but sound assets have 2"}, canonical(find_cpl(path)) }, + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "video1.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(path / "video1.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_SOUND_CONFIGURATION, std::string{"MainSoundConfiguration has 6 channels but sound assets have 2"}, canonical(find_cpl(path)) + ).set_cpl_id(cpl->id()) }); } @@ -3748,8 +5440,8 @@ BOOST_AUTO_TEST_CASE(verify_invalid_tile_part_size) boost::filesystem::remove_all(path); boost::filesystem::create_directories(path); - auto mp = make_shared<dcp::MonoPictureAsset>(dcp::Fraction(24, 1), dcp::Standard::SMPTE); - auto picture_writer = mp->start_write(path / "video.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW); + auto mp = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction(24, 1), dcp::Standard::SMPTE); + auto picture_writer = mp->start_write(path / "video.mxf", dcp::Behaviour::MAKE_NEW); dcp::Size const size(1998, 1080); auto image = make_shared<dcp::OpenJPEGImage>(size); @@ -3789,20 +5481,40 @@ BOOST_AUTO_TEST_CASE(verify_invalid_tile_part_size) dcp->set_annotation_text("A Test DCP"); dcp->write_xml(); - vector<dcp::VerificationNote> expected; + vector<dcp::VerificationNote> expected = { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_FFOC + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_LFOC + ).set_cpl_id(cpl->id()) + }; for (auto frame = 0; frame < 24; frame++) { expected.push_back( dcp::VerificationNote( dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_PICTURE_FRAME_SIZE_IN_BYTES, canonical(path / "video.mxf") - ).set_frame(frame).set_frame_rate(24) + ).set_frame(frame).set_frame_rate(24).set_cpl_id(cpl->id()) ); } int component_sizes[] = { - 1321721, - 1294364, - 1289952, + 1321816, + 1294414, + 1289881, }; for (auto frame = 0; frame < 24; frame++) { @@ -3810,19 +5522,11 @@ BOOST_AUTO_TEST_CASE(verify_invalid_tile_part_size) expected.push_back( dcp::VerificationNote( dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_JPEG2000_TILE_PART_SIZE - ).set_frame(frame).set_component(component).set_size(component_sizes[component]) + ).set_frame(frame).set_component(component).set_size(component_sizes[component]).set_cpl_id(cpl->id()) ); } } - expected.push_back( - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_FFOC } - ); - - expected.push_back( - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_LFOC } - ); - check_verify_result({ path }, {}, expected); } @@ -3830,16 +5534,41 @@ BOOST_AUTO_TEST_CASE(verify_invalid_tile_part_size) BOOST_AUTO_TEST_CASE(verify_too_many_subtitle_namespaces) { boost::filesystem::path const dir = "test/ref/DCP/subtitle_namespace_test"; + dcp::DCP dcp(dir); + dcp.read(); + BOOST_REQUIRE(!dcp.cpls().empty()); + auto cpl = dcp.cpls()[0]; + check_verify_result( { dir }, {}, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFEC_IN_FEATURE }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFMC_IN_FEATURE }, - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_LANGUAGE, canonical(find_file(dir, "sub_")) }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, "fc815694-7977-4a27-a8b3-32b9d4075e4c", canonical(find_file(dir, "cpl_")) }, - { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INCORRECT_SUBTITLE_NAMESPACE_COUNT, std::string{"315de731-1173-484c-9a35-bdacf5a9d99d"} } + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"feature"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"Dcp_FTR-1_F_XX-XX_MOS_2K_20230407_SMPTE_OV"}, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "j2c_42b34dcd-caa5-4c7b-aa0f-66a590947ba1.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "j2c_42b34dcd-caa5-4c7b-aa0f-66a590947ba1.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFEC_IN_FEATURE + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFMC_IN_FEATURE + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_LANGUAGE, canonical(find_file(dir, "sub_")) + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, canonical(find_file(dir, "cpl_")) + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INCORRECT_SUBTITLE_NAMESPACE_COUNT, std::string{"315de731-1173-484c-9a35-bdacf5a9d99d"} + ).set_cpl_id(cpl->id()), }); } @@ -3855,14 +5584,19 @@ BOOST_AUTO_TEST_CASE(verify_missing_load_font_for_font) } auto asset = make_shared<dcp::InteropSubtitleAsset>(dir / "subs.xml"); auto reel_asset = make_shared<dcp::ReelInteropSubtitleAsset>(asset, dcp::Fraction(24, 1), 16 * 24, 0); - write_dcp_with_single_asset (dir, reel_asset, dcp::Standard::INTEROP); + auto cpl = write_dcp_with_single_asset(dir, reel_asset, dcp::Standard::INTEROP); check_verify_result ( {dir}, {}, { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD }, - dcp::VerificationNote(dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_LOAD_FONT_FOR_FONT).set_id("theFontId") + dcp::VerificationNote(dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_LOAD_FONT_FOR_FONT).set_id("theFontId").set_cpl_id(cpl->id()) }); } @@ -3903,14 +5637,29 @@ BOOST_AUTO_TEST_CASE(verify_missing_load_font) subs->write(dir / "subs.mxf"); auto reel_subs = make_shared<dcp::ReelSMPTESubtitleAsset>(subs, dcp::Fraction(24, 1), 202, 0); - dcp->cpls()[0]->reels()[0]->add(reel_subs); + auto cpl = dcp->cpls()[0]; + cpl->reels()[0]->add(reel_subs); dcp->write_xml(); check_verify_result ( { dir }, {}, { - dcp::VerificationNote(dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_LOAD_FONT).set_id(reel_subs->id()) + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote(dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_LOAD_FONT).set_id(reel_subs->id()).set_cpl_id(cpl->id()) }); } @@ -3922,12 +5671,13 @@ BOOST_AUTO_TEST_CASE(verify_spots_wrong_asset) auto dcp1 = make_simple(dir / "1"); dcp1->write_xml(); + auto cpl = dcp1->cpls()[0]; - auto const asset_1 = dcp::MonoPictureAsset(dir / "1" / "video.mxf").id(); + auto const asset_1 = dcp::MonoJ2KPictureAsset(dir / "1" / "video.mxf").id(); auto dcp2 = make_simple(dir / "2"); dcp2->write_xml(); - auto const asset_2 = dcp::MonoPictureAsset(dir / "2" / "video.mxf").id(); + auto const asset_2 = dcp::MonoJ2KPictureAsset(dir / "2" / "video.mxf").id(); boost::filesystem::remove(dir / "1" / "video.mxf"); boost::filesystem::copy_file(dir / "2" / "video.mxf", dir / "1" / "video.mxf"); @@ -3936,6 +5686,18 @@ BOOST_AUTO_TEST_CASE(verify_spots_wrong_asset) {dir / "1"}, {}, { + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), dcp::VerificationNote(dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_ASSET_MAP_ID).set_id(asset_1).set_other_id(asset_2) }); } @@ -3956,7 +5718,20 @@ BOOST_AUTO_TEST_CASE(verify_cpl_content_version_label_text_empty) {dir}, {}, { - dcp::VerificationNote(dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EMPTY_CONTENT_VERSION_LABEL_TEXT, cpl->file().get()).set_id(cpl->id()) + dcp::VerificationNote( + dcp::VerificationNote::Type::OK, + dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA, + string{"1998x1080"}, + cpl->file().get() + ).set_cpl_id(cpl->id()), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl), + dcp::VerificationNote(dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EMPTY_CONTENT_VERSION_LABEL_TEXT, cpl->file().get()).set_cpl_id(cpl->id()) }); } @@ -3979,13 +5754,72 @@ BOOST_AUTO_TEST_CASE(verify_encrypted_smpte_dcp) { dir }, { kdm }, { - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), canonical(cpl_file) }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::UNSIGNED_CPL_WITH_ENCRYPTED_CONTENT, cpl->id(), canonical(cpl_file) }, - { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::UNSIGNED_PKL_WITH_ENCRYPTED_CONTENT, filename_to_id(pkl_file.filename()), canonical(pkl_file) } + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl), + ok(dcp::VerificationNote::Code::ALL_ENCRYPTED, cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, canonical(cpl_file) + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::UNSIGNED_CPL_WITH_ENCRYPTED_CONTENT, canonical(cpl_file) + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::UNSIGNED_PKL_WITH_ENCRYPTED_CONTENT, filename_to_id(pkl_file.filename()), canonical(pkl_file) + ) }); } +BOOST_AUTO_TEST_CASE(verify_invalid_sound_bit_depth) +{ + auto const dir = private_test / "data" / "16_bit_audio"; + + auto cpl = make_shared<dcp::CPL>(find_prefix(dir, "CPL_")); + + vector<dcp::VerificationNote> notes = { + ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl), + ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"Advertisement"}, cpl), + ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl), + ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"204794_Kitex_Scoobee_Day_Bags_30_Sec_Malayalam_220524_RADQR"}, cpl), + ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl), + ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "Video.mxf"), cpl), + ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "Video.mxf"), cpl), + dcp::VerificationNote( + dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_SOUND_BIT_DEPTH, "16", canonical(dir / "Audio.mxf") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_HASH, string("fd4796c2-9c84-454c-91f4-13ad127cea8a") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_HASH, string("9d5e8bc4-676b-4306-a86d-03f70c73b457") + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, canonical(cpl->file().get()) + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_FFOC + ).set_cpl_id(cpl->id()), + dcp::VerificationNote( + dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_LFOC + ).set_cpl_id(cpl->id()), + }; + + for (auto i = 0; i < 792; ++i) { + notes.push_back( + dcp::VerificationNote( + dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_JPEG2000_GUARD_BITS_FOR_2K, string("2") + ).set_cpl_id(cpl->id()) + ); + } + + check_verify_result({ dir }, {}, notes); +} + + BOOST_AUTO_TEST_CASE(overlapping_subtitles) { auto asset = make_shared<dcp::InteropSubtitleAsset>(); diff --git a/test/wscript b/test/wscript index d2cac0b3..64b3ed59 100644 --- a/test/wscript +++ b/test/wscript @@ -53,7 +53,7 @@ def configure(conf): def build(bld): obj = bld(features='cxx cxxprogram') obj.name = 'tests' - obj.uselib = 'BOOST_TEST BOOST_FILESYSTEM BOOST_DATETIME OPENJPEG CXML XMLSEC1 SNDFILE OPENMP ASDCPLIB_CTH LIBXML++ OPENSSL XERCES DL' + obj.uselib = 'BOOST_TEST BOOST_FILESYSTEM BOOST_DATETIME OPENJPEG CXML XMLSEC1 SNDFILE OPENMP ASDCPLIB_DCPOMATIC LIBXML++ OPENSSL XERCES DL AVCODEC AVUTIL' obj.cppflags = ['-fno-inline', '-fno-elide-constructors', '-g', '-O0'] if bld.env['CXX_NAME'] == 'gcc': obj.cppflags.append('-fno-default-inline') @@ -94,6 +94,8 @@ def build(bld): make_digest_test.cc markers_test.cc mca_test.cc + mono_mpeg2_picture_read_test.cc + mono_mpeg2_picture_write_test.cc kdm_test.cc key_test.cc language_tag_test.cc @@ -117,13 +119,14 @@ def build(bld): utf8_test.cc v_align_test.cc verify_test.cc + verify_report_test.cc """ obj.target = 'tests' obj.install_path = '' obj = bld(features='cxx cxxprogram') obj.name = 'subs_in_out' - obj.uselib = 'BOOST_TEST BOOST_FILESYSTEM OPENJPEG CXML OPENMP ASDCPLIB_CTH XMLSEC1 OPENSSL DL LIBXML++' + obj.uselib = 'BOOST_TEST BOOST_FILESYSTEM OPENJPEG CXML OPENMP ASDCPLIB_DCPOMATIC XMLSEC1 OPENSSL DL LIBXML++ AVCODEC AVUTIL' obj.cppflags = ['-fno-inline', '-fno-elide-constructors', '-g', '-O0'] if bld.env['CXX_NAME'] == 'gcc': obj.cppflags.append('-fno-default-inline') @@ -140,7 +143,7 @@ def build(bld): obj = bld(features='cxx cxxprogram') obj.name = 'rewrite_subs' - obj.uselib = 'BOOST_TEST BOOST_FILESYSTEM OPENJPEG CXML OPENMP ASDCPLIB_CTH XMLSEC1 OPENSSL DL LIBXML++' + obj.uselib = 'BOOST_TEST BOOST_FILESYSTEM OPENJPEG CXML OPENMP ASDCPLIB_DCPOMATIC XMLSEC1 OPENSSL DL LIBXML++ AVCODEC AVUTIL' obj.cppflags = ['-fno-inline', '-fno-elide-constructors', '-g', '-O0'] if bld.env['CXX_NAME'] == 'gcc': obj.cppflags.append('-fno-default-inline') |
