Try to capture ffmpeg logs during tests.
[dcpomatic.git] / test / test.cc
index c91701e558ce1302c4fd32c60d54848c780f674d..402894cb17728f96f8640e4657384461c5ddbe7c 100644 (file)
@@ -45,6 +45,7 @@
 #include "test.h"
 #include <dcp/cpl.h>
 #include <dcp/dcp.h>
+#include <dcp/equality_options.h>
 #include <dcp/mono_picture_asset.h>
 #include <dcp/mono_picture_frame.h>
 #include <dcp/openjpeg_image.h>
@@ -121,6 +122,7 @@ setup_test_config ()
        Config::instance()->set_default_j2k_bandwidth (100000000);
        Config::instance()->set_default_interop (false);
        Config::instance()->set_default_still_length (10);
+       Config::instance()->set_default_dcp_audio_channels(8);
        Config::instance()->set_log_types (
                LogEntry::TYPE_GENERAL | LogEntry::TYPE_WARNING |
                LogEntry::TYPE_ERROR | LogEntry::TYPE_DISK
@@ -132,6 +134,7 @@ setup_test_config ()
        auto decryption = make_shared<dcp::CertificateChain>(dcp::file_to_string("test/data/decryption_chain"));
        decryption->set_key(dcp::file_to_string("test/data/decryption_key"));
        Config::instance()->set_decryption_chain (decryption);
+       Config::instance()->set_dcp_asset_filename_format(dcp::NameFormat("%t"));
 }
 
 
@@ -154,6 +157,7 @@ struct TestConfig
 
                dcpomatic_setup ();
                setup_test_config ();
+               capture_ffmpeg_logs();
 
                EncodeServerFinder::instance()->stop ();
 
@@ -282,6 +286,7 @@ check_mxf_audio_file (boost::filesystem::path ref, boost::filesystem::path check
        BOOST_REQUIRE (!ASDCP_FAILURE (check_reader.FillAudioDescriptor (check_desc)));
 
        BOOST_REQUIRE_EQUAL (ref_desc.ContainerDuration, check_desc.ContainerDuration);
+       BOOST_REQUIRE_MESSAGE(ref_desc.ChannelCount, check_desc.ChannelCount);
 
        ASDCP::PCM::FrameBuffer ref_buffer (Kumu::Megabyte);
        ASDCP::PCM::FrameBuffer check_buffer (Kumu::Megabyte);
@@ -542,7 +547,7 @@ check_dcp (boost::filesystem::path ref, shared_ptr<const Film> film)
 
 
 void
-check_dcp (boost::filesystem::path ref, boost::filesystem::path check)
+check_dcp(boost::filesystem::path ref, boost::filesystem::path check, bool sound_can_differ)
 {
        dcp::DCP ref_dcp (ref);
        ref_dcp.read ();
@@ -556,8 +561,10 @@ check_dcp (boost::filesystem::path ref, boost::filesystem::path check)
        options.cpl_annotation_texts_can_differ = true;
        options.reel_annotation_texts_can_differ = true;
        options.reel_hashes_can_differ = true;
+       options.asset_hashes_can_differ = true;
        options.issue_dates_can_differ = true;
        options.max_subtitle_vertical_position_error = 0.001;
+       options.sound_assets_can_differ = sound_can_differ;
 
        BOOST_CHECK (ref_dcp.equals (check_dcp, options, boost::bind (note, _1, _2)));
 }
@@ -937,12 +944,9 @@ void progress (float) {}
 
 
 void
-make_and_verify_dcp (shared_ptr<Film> film, vector<dcp::VerificationNote::Code> ignore)
+verify_dcp(boost::filesystem::path dir, vector<dcp::VerificationNote::Code> ignore)
 {
-       film->write_metadata ();
-       make_dcp (film, TranscodeJob::ChangedBehaviour::IGNORE);
-       BOOST_REQUIRE (!wait_for_jobs());
-       auto notes = dcp::verify({film->dir(film->dcp_name())}, &stage, &progress, {}, TestPaths::xsd());
+       auto notes = dcp::verify({dir}, &stage, &progress, {}, TestPaths::xsd());
        bool ok = true;
        for (auto i: notes) {
                if (find(ignore.begin(), ignore.end(), i.code()) == ignore.end()) {
@@ -954,6 +958,16 @@ make_and_verify_dcp (shared_ptr<Film> film, vector<dcp::VerificationNote::Code>
 }
 
 
+void
+make_and_verify_dcp (shared_ptr<Film> film, vector<dcp::VerificationNote::Code> ignore)
+{
+       film->write_metadata ();
+       make_dcp (film, TranscodeJob::ChangedBehaviour::IGNORE);
+       BOOST_REQUIRE (!wait_for_jobs());
+       verify_dcp({film->dir(film->dcp_name())}, ignore);
+}
+
+
 void
 check_int_close (int a, int b, int d)
 {
@@ -981,11 +995,11 @@ find_file (boost::filesystem::path dir, string filename_part)
        boost::optional<boost::filesystem::path> found;
        for (auto i: boost::filesystem::directory_iterator(dir)) {
                if (i.path().filename().string().find(filename_part) != string::npos) {
-                       BOOST_REQUIRE (!found);
+                       BOOST_REQUIRE_MESSAGE(!found, "File " << filename_part << " found more than once in " << dir);
                        found = i;
                }
        }
-       BOOST_REQUIRE (found);
+       BOOST_REQUIRE_MESSAGE(found, "Could not find " << filename_part << " in " << dir);
        return *found;
 }