Cleanup: replace some list with vector.
[dcpomatic.git] / test / kdm_naming_test.cc
index 35188d5e602c56cad17b5743e87f9f50599b4ff6..32500553e90e48065c6786064eaa94f5cf628e94 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    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.
 
 
 */
 
+
 #include "lib/cinema.h"
-#include "lib/screen.h"
 #include "lib/config.h"
 #include "lib/content_factory.h"
 #include "lib/film.h"
 #include "lib/kdm_with_metadata.h"
+#include "lib/screen.h"
 #include "test.h"
 #include <boost/test/unit_test.hpp>
-#include <boost/shared_ptr.hpp>
 
+
+using std::dynamic_pointer_cast;
 using std::list;
+using std::make_shared;
+using std::shared_ptr;
 using std::string;
 using std::vector;
-using boost::shared_ptr;
 using boost::optional;
-using boost::dynamic_pointer_cast;
+
 
 static
 bool
@@ -42,85 +45,90 @@ confirm_overwrite (boost::filesystem::path)
        return true;
 }
 
+
 static shared_ptr<dcpomatic::Screen> cinema_a_screen_1;
 static shared_ptr<dcpomatic::Screen> cinema_a_screen_2;
 static shared_ptr<dcpomatic::Screen> cinema_b_screen_x;
 static shared_ptr<dcpomatic::Screen> cinema_b_screen_y;
 static shared_ptr<dcpomatic::Screen> cinema_b_screen_z;
 
+
 BOOST_AUTO_TEST_CASE (single_kdm_naming_test)
 {
-       Config* c = Config::instance();
+       auto c = Config::instance();
 
-       dcp::Certificate cert = c->decryption_chain()->leaf();
+       auto crypt_cert = c->decryption_chain()->leaf();
 
        /* Cinema A: UTC +4:30 */
-       shared_ptr<Cinema> cinema_a (new Cinema("Cinema A", list<string>(), "", 4, 30));
-       cinema_a_screen_1.reset(new dcpomatic::Screen("Screen 1", "", cert, vector<TrustedDevice>()));
+       auto cinema_a = make_shared<Cinema>("Cinema A", vector<string>(), "", 4, 30);
+       cinema_a_screen_1 = std::make_shared<dcpomatic::Screen>("Screen 1", "", crypt_cert, boost::none, vector<TrustedDevice>());
        cinema_a->add_screen (cinema_a_screen_1);
-       cinema_a_screen_2.reset(new dcpomatic::Screen("Screen 2", "", cert, vector<TrustedDevice>()));
+       cinema_a_screen_2 = std::make_shared<dcpomatic::Screen>("Screen 2", "", crypt_cert, boost::none, vector<TrustedDevice>());
        cinema_a->add_screen (cinema_a_screen_2);
        c->add_cinema (cinema_a);
 
        /* Cinema B: UTC -1:00 */
-       shared_ptr<Cinema> cinema_b (new Cinema("Cinema B", list<string>(), "", -1, 0));
-       cinema_b_screen_x.reset(new dcpomatic::Screen("Screen X", "", cert, vector<TrustedDevice>()));
+       auto cinema_b = make_shared<Cinema>("Cinema B", vector<string>(), "", -1, 0);
+       cinema_b_screen_x = std::make_shared<dcpomatic::Screen>("Screen X", "", crypt_cert, boost::none, vector<TrustedDevice>());
        cinema_b->add_screen (cinema_b_screen_x);
-       cinema_b_screen_y.reset(new dcpomatic::Screen("Screen Y", "", cert, vector<TrustedDevice>()));
+       cinema_b_screen_y = std::make_shared<dcpomatic::Screen>("Screen Y", "", crypt_cert, boost::none, vector<TrustedDevice>());
        cinema_b->add_screen (cinema_b_screen_y);
-       cinema_b_screen_z.reset(new dcpomatic::Screen("Screen Z", "", cert, vector<TrustedDevice>()));
+       cinema_b_screen_z = std::make_shared<dcpomatic::Screen>("Screen Z", "", crypt_cert, boost::none, vector<TrustedDevice>());
        cinema_b->add_screen (cinema_b_screen_z);
        c->add_cinema (cinema_a);
 
        /* Film */
        boost::filesystem::remove_all ("build/test/single_kdm_naming_test");
-       shared_ptr<Film> film = new_test_film2 ("single_kdm_naming_test");
+       auto film = new_test_film2 ("single_kdm_naming_test");
        film->set_name ("my_great_film");
-       film->examine_and_add_content (content_factory("test/data/flat_black.png").front());
+       film->examine_and_add_content (content_factory("test/data/flat_black.png")[0]);
        BOOST_REQUIRE (!wait_for_jobs());
        film->set_encrypted (true);
-       film->make_dcp ();
-       BOOST_REQUIRE (!wait_for_jobs());
-       film->write_metadata ();
-       vector<CPLSummary> cpls = film->cpls ();
+       make_and_verify_dcp (film);
+       auto cpls = film->cpls ();
        BOOST_REQUIRE(cpls.size() == 1);
 
-       dcp::LocalTime from (cert.not_before());
+       auto sign_cert = c->signer_chain()->leaf();
+
+       dcp::LocalTime from (sign_cert.not_before());
        from.add_months (2);
-       dcp::LocalTime until (cert.not_after());
+       dcp::LocalTime until (sign_cert.not_after());
        until.add_months (-2);
 
-       string const from_string = from.date() + " " + from.time_of_day(true, false);
-       string const until_string = until.date() + " " + until.time_of_day(true, false);
+       auto const from_string = from.date() + " " + from.time_of_day(true, false);
+       auto const until_string = until.date() + " " + until.time_of_day(true, false);
+
+       std::vector<KDMCertificatePeriod> period_checks;
 
-       boost::filesystem::path cpl = cpls.front().cpl_file;
-       KDMWithMetadataPtr kdm = kdm_for_screen (
-                       film,
-                       cpls.front().cpl_file,
+       auto cpl = cpls.front().cpl_file;
+       std::function<dcp::DecryptedKDM (dcp::LocalTime, dcp::LocalTime)> make_kdm = [film, cpl](dcp::LocalTime begin, dcp::LocalTime end) {
+               return film->make_kdm(cpl, begin, end);
+       };
+       auto kdm = kdm_for_screen (
+                       make_kdm,
                        cinema_a_screen_1,
                        boost::posix_time::time_from_string(from_string),
                        boost::posix_time::time_from_string(until_string),
-                       dcp::MODIFIED_TRANSITIONAL_1,
+                       dcp::Formulation::MODIFIED_TRANSITIONAL_1,
                        false,
-                       optional<int>()
+                       optional<int>(),
+                       period_checks
                        );
 
-       list<KDMWithMetadataPtr> kdms;
-       kdms.push_back (kdm);
-
        write_files (
-               kdms,
+               { kdm },
                boost::filesystem::path("build/test/single_kdm_naming_test"),
                dcp::NameFormat("KDM %c - %s - %f - %b - %e"),
                &confirm_overwrite
                );
 
-       string from_time = from.time_of_day (true, false);
+       auto from_time = from.time_of_day (true, false);
        boost::algorithm::replace_all (from_time, ":", "-");
-       string until_time = until.time_of_day (true, false);
+       auto until_time = until.time_of_day (true, false);
        boost::algorithm::replace_all (until_time, ":", "-");
 
-       string const ref = String::compose("KDM_Cinema_A_-_Screen_1_-_my_great_film_-_%1_%2_-_%3_%4.xml", from.date(), from_time, until.date(), until_time);
+       auto const dcp_date = boost::gregorian::to_iso_string(film->isdcf_date());
+       auto const ref = String::compose("KDM_Cinema_A_-_Screen_1_-_MyGreatFilm_TST-1_F_XX-XX_MOS_2K_%1_SMPTE_OV_-_%2_%3_-_%4_%5.xml", dcp_date, from.date(), from_time, until.date(), until_time);
        BOOST_CHECK_MESSAGE (boost::filesystem::exists("build/test/single_kdm_naming_test/" + ref), "File " << ref << " not found");
 }
 
@@ -129,49 +137,53 @@ BOOST_AUTO_TEST_CASE (directory_kdm_naming_test, * boost::unit_test::depends_on(
 {
        using boost::filesystem::path;
 
-       dcp::Certificate cert = Config::instance()->decryption_chain()->leaf();
-
        /* Film */
        boost::filesystem::remove_all ("build/test/directory_kdm_naming_test");
-       shared_ptr<Film> film = new_test_film2 ("directory_kdm_naming_test");
+       auto film = new_test_film2 (
+               "directory_kdm_naming_test",
+               { content_factory("test/data/flat_black.png")[0] }
+               );
+
        film->set_name ("my_great_film");
-       film->examine_and_add_content (content_factory("test/data/flat_black.png").front());
-       BOOST_REQUIRE (!wait_for_jobs());
        film->set_encrypted (true);
-       film->make_dcp ();
-       BOOST_REQUIRE (!wait_for_jobs());
-       film->write_metadata ();
-       vector<CPLSummary> cpls = film->cpls ();
+       make_and_verify_dcp (film);
+       auto cpls = film->cpls ();
        BOOST_REQUIRE(cpls.size() == 1);
 
-       dcp::LocalTime from (cert.not_before());
+       auto sign_cert = Config::instance()->signer_chain()->leaf();
+
+       dcp::LocalTime from (sign_cert.not_before());
        from.add_months (2);
-       dcp::LocalTime until (cert.not_after());
+       dcp::LocalTime until (sign_cert.not_after());
        until.add_months (-2);
 
        string const from_string = from.date() + " " + from.time_of_day(true, false);
        string const until_string = until.date() + " " + until.time_of_day(true, false);
 
-       list<shared_ptr<dcpomatic::Screen> > screens;
-       screens.push_back (cinema_a_screen_2);
-       screens.push_back (cinema_b_screen_x);
-       screens.push_back (cinema_a_screen_1);
-       screens.push_back (cinema_b_screen_z);
+       vector<shared_ptr<dcpomatic::Screen>> screens = {
+               cinema_a_screen_2, cinema_b_screen_x, cinema_a_screen_1, (cinema_b_screen_z)
+       };
 
-       path const cpl = cpls.front().cpl_file;
-       string const cpl_id = cpls.front().cpl_id;
+       auto const cpl = cpls.front().cpl_file;
+       auto const cpl_id = cpls.front().cpl_id;
 
+       std::vector<KDMCertificatePeriod> period_checks;
        list<KDMWithMetadataPtr> kdms;
-       BOOST_FOREACH (shared_ptr<dcpomatic::Screen> i, screens) {
-               KDMWithMetadataPtr kdm = kdm_for_screen (
-                               film,
-                               cpls.front().cpl_file,
+
+       std::function<dcp::DecryptedKDM (dcp::LocalTime, dcp::LocalTime)> make_kdm = [film, cpls](dcp::LocalTime begin, dcp::LocalTime end) {
+               return film->make_kdm(cpls.front().cpl_file, begin, end);
+       };
+
+       for (auto i: screens) {
+               auto kdm = kdm_for_screen (
+                               make_kdm,
                                i,
                                boost::posix_time::time_from_string(from_string),
                                boost::posix_time::time_from_string(until_string),
-                               dcp::MODIFIED_TRANSITIONAL_1,
+                               dcp::Formulation::MODIFIED_TRANSITIONAL_1,
                                false,
-                               optional<int>()
+                               optional<int>(),
+                               period_checks
                                );
 
                kdms.push_back (kdm);
@@ -181,32 +193,57 @@ BOOST_AUTO_TEST_CASE (directory_kdm_naming_test, * boost::unit_test::depends_on(
                collect(kdms),
                path("build/test/directory_kdm_naming_test"),
                dcp::NameFormat("%c - %s - %f - %b - %e"),
+#ifdef DCPOMATIC_WINDOWS
+               /* Use a shorter name on Windows so that the paths aren't too long */
+               dcp::NameFormat("KDM %f"),
+#else
                dcp::NameFormat("KDM %c - %s - %f - %b - %e - %i"),
+#endif
                &confirm_overwrite
                );
 
-       string from_time = from.time_of_day (true, false);
+       auto from_time = from.time_of_day (true, false);
        boost::algorithm::replace_all (from_time, ":", "-");
-       string until_time = until.time_of_day (true, false);
+       auto until_time = until.time_of_day (true, false);
        boost::algorithm::replace_all (until_time, ":", "-");
 
+       auto const dcp_date = boost::gregorian::to_iso_string(film->isdcf_date());
+       auto const dcp_name = String::compose("MyGreatFilm_TST-1_F_XX-XX_MOS_2K_%1_SMPTE_OV", dcp_date);
+       auto const common = String::compose("%1_-_%2_%3_-_%4_%5", dcp_name, from.date(), from_time, until.date(), until_time);
+
        path const base = "build/test/directory_kdm_naming_test";
 
-       path dir_a = String::compose("Cinema_A_-_%s_-_my_great_film_-_%1_%2_-_%3_%4", from.date(), from_time, until.date(), until_time);
+       path dir_a = String::compose("Cinema_A_-_%s_-_%1", common);
        BOOST_CHECK_MESSAGE (boost::filesystem::exists(base / dir_a), "Directory " << dir_a << " not found");
-       path dir_b = String::compose("Cinema_B_-_%s_-_my_great_film_-_%1_%2_-_%3_%4", from.date(), from_time, until.date(), until_time);
+       path dir_b = String::compose("Cinema_B_-_%s_-_%1", common);
        BOOST_CHECK_MESSAGE (boost::filesystem::exists(base / dir_b), "Directory " << dir_b << " not found");
 
-       path ref = String::compose("KDM_Cinema_A_-_Screen_2_-_my_great_film_-_%1_%2_-_%3_%4_-_%5.xml", from.date(), from_time, until.date(), until_time, cpl_id);
+#ifdef DCPOMATIC_WINDOWS
+       path ref = String::compose("KDM_%1.xml", dcp_name);
+#else
+       path ref = String::compose("KDM_Cinema_A_-_Screen_2_-_%1_-_%2.xml", common, cpl_id);
+#endif
        BOOST_CHECK_MESSAGE (boost::filesystem::exists(base / dir_a / ref), "File " << ref << " not found");
 
-       ref = String::compose("KDM_Cinema_B_-_Screen_X_-_my_great_film_-_%1_%2_-_%3_%4_-_%5.xml", from.date(), from_time, until.date(), until_time, cpl_id);
+#ifdef DCPOMATIC_WINDOWS
+       ref = String::compose("KDM_%1.xml", dcp_name);
+#else
+       ref = String::compose("KDM_Cinema_B_-_Screen_X_-_%1_-_%2.xml", common, cpl_id);
+#endif
        BOOST_CHECK_MESSAGE (boost::filesystem::exists(base / dir_b / ref), "File " << ref << " not found");
 
-       ref = String::compose("KDM_Cinema_A_-_Screen_1_-_my_great_film_-_%1_%2_-_%3_%4_-_%5.xml", from.date(), from_time, until.date(), until_time, cpl_id);
+#ifdef DCPOMATIC_WINDOWS
+       ref = String::compose("KDM_%1.xml", dcp_name);
+#else
+       ref = String::compose("KDM_Cinema_A_-_Screen_1_-_%1_-_%2.xml", common, cpl_id);
+#endif
        BOOST_CHECK_MESSAGE (boost::filesystem::exists(base / dir_a / ref), "File " << ref << " not found");
 
-       ref = String::compose("KDM_Cinema_B_-_Screen_Z_-_my_great_film_-_%1_%2_-_%3_%4_-_%5.xml", from.date(), from_time, until.date(), until_time, cpl_id);
+#ifdef DCPOMATIC_WINDOWS
+       ref = String::compose("KDM_%1.xml", dcp_name);
+#else
+       ref = String::compose("KDM_Cinema_B_-_Screen_Z_-_%1_-_%2.xml", common, cpl_id);
+#endif
        BOOST_CHECK_MESSAGE (boost::filesystem::exists(base / dir_b / ref), "File " << ref << " not found");
 }