/*
- Copyright (C) 2020 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2020-2021 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
using std::string;
using std::vector;
+using std::make_shared;
using boost::optional;
using std::shared_ptr;
BOOST_AUTO_TEST_CASE (atmos_passthrough_test)
{
- shared_ptr<Film> film = new_test_film2 ("atmos_passthrough_test");
- boost::filesystem::path ref = TestPaths::private_data() / "atmos_asset.mxf";
- shared_ptr<Content> content = content_factory (TestPaths::private_data() / "atmos_asset.mxf").front();
+ Cleanup cl;
+
+ auto film = new_test_film2 ("atmos_passthrough_test", &cl);
+ auto ref = TestPaths::private_data() / "atmos_asset.mxf";
+ auto content = content_factory (TestPaths::private_data() / "atmos_asset.mxf").front();
film->examine_and_add_content (content);
BOOST_REQUIRE (!wait_for_jobs());
BOOST_REQUIRE (!wait_for_jobs());
BOOST_REQUIRE (mxf_atmos_files_same(ref, dcp_file(film, "atmos"), true));
+
+ cl.run ();
}
BOOST_AUTO_TEST_CASE (atmos_encrypted_passthrough_test)
{
- shared_ptr<Film> film = new_test_film2 ("atmos_encrypted_passthrough_test");
- boost::filesystem::path ref = TestPaths::private_data() / "atmos_asset.mxf";
- shared_ptr<Content> content = content_factory (TestPaths::private_data() / "atmos_asset.mxf").front();
+ Cleanup cl;
+
+ auto film = new_test_film2 ("atmos_encrypted_passthrough_test", &cl);
+ auto ref = TestPaths::private_data() / "atmos_asset.mxf";
+ auto content = content_factory (TestPaths::private_data() / "atmos_asset.mxf").front();
film->examine_and_add_content (content);
BOOST_REQUIRE (!wait_for_jobs());
BOOST_REQUIRE (!mxf_atmos_files_same(ref, dcp_file(film, "atmos")));
- dcp::EncryptedKDM kdm = film->make_kdm (
+ auto kdm = film->make_kdm (
Config::instance()->decryption_chain()->leaf(),
vector<string>(),
dcp_file(film, "cpl"),
optional<int>()
);
- shared_ptr<Film> film2 = new_test_film2 ("atmos_encrypted_passthrough_test2");
- shared_ptr<DCPContent> content2 (new DCPContent(film->dir(film->dcp_name())));
+ auto film2 = new_test_film2 ("atmos_encrypted_passthrough_test2", &cl);
+ auto content2 = make_shared<DCPContent>(film->dir(film->dcp_name()));
content2->add_kdm (kdm);
film2->examine_and_add_content (content2);
BOOST_REQUIRE (!wait_for_jobs());
BOOST_REQUIRE (!wait_for_jobs());
BOOST_CHECK (mxf_atmos_files_same(ref, dcp_file(film2, "atmos"), true));
+
+ cl.run ();
}
/*
- Copyright (C) 2018 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2018-2021 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
#include <boost/test/unit_test.hpp>
using std::list;
+using std::make_shared;
using std::shared_ptr;
/** Basic test that Interop closed captions are written */
BOOST_AUTO_TEST_CASE (closed_caption_test1)
{
- shared_ptr<Film> film = new_test_film2 ("closed_caption_test1");
- shared_ptr<StringTextFileContent> content (new StringTextFileContent("test/data/subrip.srt"));
+ Cleanup cl;
+
+ auto film = new_test_film2 ("closed_caption_test1", &cl);
+ auto content = make_shared<StringTextFileContent>("test/data/subrip.srt");
film->examine_and_add_content (content);
BOOST_REQUIRE (!wait_for_jobs ());
BOOST_REQUIRE_EQUAL (check.cpls().size(), 1U);
BOOST_REQUIRE_EQUAL (check.cpls().front()->reels().size(), 1U);
BOOST_REQUIRE (!check.cpls().front()->reels().front()->closed_captions().empty());
+
+ cl.run ();
}
/** Test multiple closed captions */
BOOST_AUTO_TEST_CASE (closed_caption_test2)
{
- shared_ptr<Film> film = new_test_film2 ("closed_caption_test2");
- shared_ptr<StringTextFileContent> content1 (new StringTextFileContent("test/data/subrip.srt"));
+ Cleanup cl;
+
+ auto film = new_test_film2 ("closed_caption_test2", &cl);
+ auto content1 = make_shared<StringTextFileContent>("test/data/subrip.srt");
film->examine_and_add_content (content1);
- shared_ptr<StringTextFileContent> content2 (new StringTextFileContent("test/data/subrip2.srt"));
+ auto content2 = make_shared<StringTextFileContent>("test/data/subrip2.srt");
film->examine_and_add_content (content2);
- shared_ptr<StringTextFileContent> content3 (new StringTextFileContent("test/data/subrip3.srt"));
+ auto content3 = make_shared<StringTextFileContent>("test/data/subrip3.srt");
film->examine_and_add_content (content3);
BOOST_REQUIRE (!wait_for_jobs ());
BOOST_CHECK_EQUAL ((*i)->annotation_text(), "Third track");
BOOST_REQUIRE (static_cast<bool>((*i)->language()));
BOOST_CHECK_EQUAL ((*i)->language().get(), "it-IT");
+
+ cl.run ();
}
/** Sync error #1833 */
BOOST_AUTO_TEST_CASE (content_test6)
{
- shared_ptr<Film> film = new_test_film2 ("content_test6");
+ Cleanup cl;
+
+ auto film = new_test_film2 ("content_test6", &cl);
film->examine_and_add_content (content_factory(TestPaths::private_data() / "fha.mkv").front());
BOOST_REQUIRE (!wait_for_jobs());
film->make_dcp ();
BOOST_REQUIRE (!wait_for_jobs());
check_dcp (TestPaths::private_data() / "fha", film);
+
+ cl.run ();
}
/*
- Copyright (C) 2017-2019 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2017-2021 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
using std::string;
using std::shared_ptr;
+using std::make_shared;
using boost::optional;
using namespace dcpomatic;
static void
ffmpeg_content_test (int number, boost::filesystem::path content, ExportFormat format)
{
+ Cleanup cl;
+
string name = "ffmpeg_encoder_";
string extension;
switch (format) {
name = String::compose("%1_test%2", name, number);
- shared_ptr<Film> film = new_test_film (name);
+ shared_ptr<Film> film = new_test_film2 (name, &cl);
film->set_name (name);
- shared_ptr<FFmpegContent> c (new FFmpegContent(content));
- film->set_container (Ratio::from_id ("185"));
+ auto c = make_shared<FFmpegContent>(content);
film->set_audio_channels (6);
film->examine_and_add_content (c);
BOOST_REQUIRE (!wait_for_jobs ());
film->write_metadata ();
- shared_ptr<Job> job (new TranscodeJob (film));
- FFmpegEncoder encoder (film, job, String::compose("build/test/%1.%2", name, extension), format, false, false, false, 23);
+ auto job = make_shared<TranscodeJob>(film);
+ auto file = boost::filesystem::path("build") / "test" / String::compose("%1.%2", name, extension);
+ cl.add (file);
+ FFmpegEncoder encoder (film, job, file, format, false, false, false, 23);
encoder.go ();
+
+ cl.run ();
}
/** Red / green / blue MP4 -> Prores */
/** Still image -> Prores */
BOOST_AUTO_TEST_CASE (ffmpeg_encoder_prores_test5)
{
- shared_ptr<Film> film = new_test_film ("ffmpeg_encoder_prores_test5");
+ auto film = new_test_film ("ffmpeg_encoder_prores_test5");
film->set_name ("ffmpeg_encoder_prores_test5");
shared_ptr<ImageContent> c (new ImageContent(TestPaths::private_data() / "bbc405.png"));
film->set_container (Ratio::from_id ("185"));
/*
- Copyright (C) 2014-2020 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2014-2021 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
*/
+
/** @file test/import_dcp_test.cc
* @brief Test import of encrypted DCPs.
* @ingroup feature
*/
+
#include "test.h"
#include "lib/film.h"
#include "lib/screen.h"
#include <dcp/cpl.h>
#include <boost/test/unit_test.hpp>
+
using std::vector;
using std::string;
using std::map;
using std::shared_ptr;
using std::dynamic_pointer_cast;
+using std::make_shared;
+
/** Make an encrypted DCP, import it and make a new unencrypted DCP */
BOOST_AUTO_TEST_CASE (import_dcp_test)
{
- shared_ptr<Film> A = new_test_film ("import_dcp_test");
+ auto A = new_test_film ("import_dcp_test");
A->set_container (Ratio::from_id ("185"));
A->set_dcp_content_type (DCPContentType::from_isdcf_name ("TLR"));
A->set_name ("frobozz");
A->set_interop (false);
- shared_ptr<FFmpegContent> c (new FFmpegContent("test/data/test.mp4"));
+ auto c = make_shared<FFmpegContent>("test/data/test.mp4");
A->examine_and_add_content (c);
A->set_encrypted (true);
BOOST_CHECK (!wait_for_jobs ());
dcp::DCP A_dcp ("build/test/import_dcp_test/" + A->dcp_name());
A_dcp.read ();
- Config::instance()->set_decryption_chain (shared_ptr<dcp::CertificateChain> (new dcp::CertificateChain (openssl_path ())));
+ Config::instance()->set_decryption_chain (make_shared<dcp::CertificateChain>(openssl_path()));
/* Dear future-carl: I suck! I thought you wouldn't still be running these tests in 2030! Sorry! */
- dcp::EncryptedKDM kdm = A->make_kdm (
+ auto kdm = A->make_kdm (
Config::instance()->decryption_chain()->leaf (),
vector<string>(),
A_dcp.cpls().front()->file().get(),
true, 0
);
- shared_ptr<Film> B = new_test_film ("import_dcp_test2");
+ auto B = new_test_film ("import_dcp_test2");
B->set_container (Ratio::from_id ("185"));
B->set_dcp_content_type (DCPContentType::from_isdcf_name ("TLR"));
B->set_name ("frobozz");
B->set_interop (false);
- shared_ptr<DCPContent> d (new DCPContent("build/test/import_dcp_test/" + A->dcp_name()));
+ auto d = make_shared<DCPContent>("build/test/import_dcp_test/" + A->dcp_name());
B->examine_and_add_content (d);
BOOST_CHECK (!wait_for_jobs ());
d->add_kdm (kdm);
- JobManager::instance()->add (shared_ptr<Job> (new ExamineContentJob (B, d)));
+ JobManager::instance()->add (make_shared<ExamineContentJob>(B, d));
BOOST_CHECK (!wait_for_jobs ());
B->make_dcp ();
/** Check that DCP markers are imported correctly */
BOOST_AUTO_TEST_CASE (import_dcp_markers_test)
{
+ Cleanup cl;
+
/* Make a DCP with some markers */
- shared_ptr<Film> film = new_test_film2 ("import_dcp_markers_test");
- shared_ptr<Content> content = content_factory("test/data/flat_red.png").front();
+ auto film = new_test_film2 ("import_dcp_markers_test", &cl);
+ auto content = content_factory("test/data/flat_red.png").front();
film->examine_and_add_content (content);
BOOST_REQUIRE (!wait_for_jobs());
BOOST_REQUIRE (!wait_for_jobs());
/* Import the DCP to a new film and check the markers */
- shared_ptr<Film> film2 = new_test_film2 ("import_dcp_markers_test2");
- shared_ptr<DCPContent> imported (new DCPContent(film->dir(film->dcp_name())));
+ auto film2 = new_test_film2 ("import_dcp_markers_test2", &cl);
+ auto imported = make_shared<DCPContent>(film->dir(film->dcp_name()));
film2->examine_and_add_content (imported);
BOOST_REQUIRE (!wait_for_jobs());
film2->write_metadata ();
*/
BOOST_CHECK_EQUAL (imported->markers().size(), 4U);
- map<dcp::Marker, dcpomatic::ContentTime> markers = imported->markers();
+ auto markers = imported->markers();
BOOST_REQUIRE(markers.find(dcp::Marker::FFOC) != markers.end());
BOOST_CHECK(markers[dcp::Marker::FFOC] == dcpomatic::ContentTime(184000));
BOOST_REQUIRE(markers.find(dcp::Marker::FFMC) != markers.end());
BOOST_CHECK(markers[dcp::Marker::LFMC] == dcpomatic::ContentTime(960000));
/* Load that film and check that the markers have been loaded */
- shared_ptr<Film> film3(new Film(boost::filesystem::path("build/test/import_dcp_markers_test2")));
+ auto film3 = make_shared<Film>(boost::filesystem::path("build/test/import_dcp_markers_test2"));
film3->read_metadata ();
BOOST_REQUIRE_EQUAL (film3->content().size(), 1U);
shared_ptr<DCPContent> reloaded = dynamic_pointer_cast<DCPContent>(film3->content().front());
BOOST_CHECK(markers[dcp::Marker::FFMC] == dcpomatic::ContentTime(904000));
BOOST_REQUIRE(markers.find(dcp::Marker::LFMC) != markers.end());
BOOST_CHECK(markers[dcp::Marker::LFMC] == dcpomatic::ContentTime(960000));
+
+ cl.run ();
}
BOOST_AUTO_TEST_CASE (import_dcp_metadata_test)
{
/* Make a DCP with some ratings and a content version */
- shared_ptr<Film> film = new_test_film2 ("import_dcp_metadata_test");
- shared_ptr<Content> content = content_factory("test/data/flat_red.png").front();
+ auto film = new_test_film2 ("import_dcp_metadata_test");
+ auto content = content_factory("test/data/flat_red.png").front();
film->examine_and_add_content (content);
BOOST_REQUIRE (!wait_for_jobs());
content->video->set_length (10);
- std::vector<dcp::Rating> ratings;
- ratings.push_back (dcp::Rating("BBFC", "15"));
- ratings.push_back (dcp::Rating("MPAA", "NC-17"));
+ vector<dcp::Rating> ratings = { {"BBFC", "15"}, {"MPAA", "NC-17"} };
film->set_ratings (ratings);
- vector<string> cv;
- cv.push_back ("Fred");
+ vector<string> cv = { "Fred "};
film->set_content_versions (cv);
film->make_dcp ();
BOOST_REQUIRE (!wait_for_jobs());
/* Import the DCP to a new film and check the metadata */
- shared_ptr<Film> film2 = new_test_film2 ("import_dcp_metadata_test2");
- shared_ptr<DCPContent> imported (new DCPContent(film->dir(film->dcp_name())));
+ auto film2 = new_test_film2 ("import_dcp_metadata_test2");
+ auto imported = make_shared<DCPContent>(film->dir(film->dcp_name()));
film2->examine_and_add_content (imported);
BOOST_REQUIRE (!wait_for_jobs());
film2->write_metadata ();
BOOST_CHECK (imported->content_versions() == cv);
/* Load that film and check that the metadata has been loaded */
- shared_ptr<Film> film3(new Film(boost::filesystem::path("build/test/import_dcp_metadata_test2")));
+ auto film3 = make_shared<Film>(boost::filesystem::path("build/test/import_dcp_metadata_test2"));
film3->read_metadata ();
BOOST_REQUIRE_EQUAL (film3->content().size(), 1U);
- shared_ptr<DCPContent> reloaded = dynamic_pointer_cast<DCPContent>(film3->content().front());
+ auto reloaded = dynamic_pointer_cast<DCPContent>(film3->content().front());
BOOST_REQUIRE (reloaded);
BOOST_CHECK (reloaded->ratings() == ratings);
BOOST_AUTO_TEST_CASE (silence_padding_test2)
{
- auto film = new_test_film2 ("silence_padding_test2");
+ Cleanup cl;
+
+ auto film = new_test_film2 ("silence_padding_test2", &cl);
auto content = make_shared<FFmpegContent>(TestPaths::private_data() / "cars.mov");
film->examine_and_add_content (content);
BOOST_REQUIRE (!wait_for_jobs());
film->make_dcp ();
BOOST_REQUIRE (!wait_for_jobs());
+
+ cl.run ();
}
/** Make another DCP with a longer .srt file */
BOOST_AUTO_TEST_CASE (srt_subtitle_test3)
{
- shared_ptr<Film> film = new_test_film ("srt_subtitle_test3");
+ Cleanup cl;
+
+ shared_ptr<Film> film = new_test_film2 ("srt_subtitle_test3", &cl);
film->set_container (Ratio::from_id ("185"));
- film->set_dcp_content_type (DCPContentType::from_isdcf_name ("TLR"));
film->set_name ("frobozz");
film->set_interop (true);
film->set_audio_channels (6);
BOOST_REQUIRE (!wait_for_jobs());
check_subtitle_file (film, TestPaths::private_data() / "Ankoemmling_short.xml");
+
+ cl.run ();
}
/** Build a small DCP with no picture and a single subtitle overlaid onto it */
/** Make a DCP with subs from a .ssa file */
BOOST_AUTO_TEST_CASE (ssa_subtitle_test1)
{
- shared_ptr<Film> film = new_test_film ("ssa_subtitle_test1");
+ Cleanup cl;
+
+ shared_ptr<Film> film = new_test_film2 ("ssa_subtitle_test1", &cl);
film->set_container (Ratio::from_id ("185"));
- film->set_dcp_content_type (DCPContentType::from_isdcf_name ("TLR"));
film->set_name ("frobozz");
film->set_interop (true);
shared_ptr<StringTextFileContent> content (new StringTextFileContent(TestPaths::private_data() / "DKH_UT_EN20160601def.ssa"));
list<string> ignore;
ignore.push_back ("SubtitleID");
check_xml (subtitle_file(film), TestPaths::private_data() / "DKH_UT_EN20160601def.xml", ignore);
+
+ cl.run ();
}
}
shared_ptr<Film>
-new_test_film2 (string name)
+new_test_film2 (string name, Cleanup* cleanup)
{
auto p = test_film_dir (name);
if (boost::filesystem::exists (p)) {
boost::filesystem::remove_all (p);
}
+ if (cleanup) {
+ cleanup->add (p);
+ }
auto film = make_shared<Film>(p);
film->set_dcp_content_type (DCPContentType::from_isdcf_name ("TST"));
return s;
}
+
+void
+Cleanup::add (boost::filesystem::path path)
+{
+ _paths.push_back (path);
+}
+
+
+void
+Cleanup::run ()
+{
+ boost::system::error_code ec;
+ for (auto i: _paths) {
+ boost::filesystem::remove_all (i, ec);
+ }
+}
static boost::filesystem::path xsd();
};
+
+class Cleanup
+{
+public:
+ void add (boost::filesystem::path path);
+
+ /* Remove everything passed to add(). We don't do this
+ * in a destructor so that results of failed tests aren't
+ * deleted.
+ */
+ void run ();
+
+private:
+ std::vector<boost::filesystem::path> _paths;
+};
+
+
extern bool wait_for_jobs ();
extern void setup_test_config ();
extern std::shared_ptr<Film> new_test_film (std::string);
-extern std::shared_ptr<Film> new_test_film2 (std::string);
+extern std::shared_ptr<Film> new_test_film2 (std::string, Cleanup* cleanup = nullptr);
extern void check_dcp (boost::filesystem::path, boost::filesystem::path);
extern void check_dcp (boost::filesystem::path, std::shared_ptr<const Film>);
extern void check_file (boost::filesystem::path ref, boost::filesystem::path check);
extern boost::filesystem::path subtitle_file (std::shared_ptr<Film> film);
extern void make_random_file (boost::filesystem::path path, size_t size);
+
class LogSwitcher
{
public: