Head off some cert validity warnings.
[dcpomatic.git] / test / kdm_naming_test.cc
1 /*
2     Copyright (C) 2020-2021 Carl Hetherington <cth@carlh.net>
3
4     This file is part of DCP-o-matic.
5
6     DCP-o-matic is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     DCP-o-matic is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
18
19 */
20
21
22 #include "lib/cinema.h"
23 #include "lib/config.h"
24 #include "lib/content_factory.h"
25 #include "lib/film.h"
26 #include "lib/kdm_with_metadata.h"
27 #include "lib/screen.h"
28 #include "test.h"
29 #include <boost/test/unit_test.hpp>
30
31
32 using std::dynamic_pointer_cast;
33 using std::list;
34 using std::make_shared;
35 using std::shared_ptr;
36 using std::string;
37 using std::vector;
38 using boost::optional;
39
40
41 static
42 bool
43 confirm_overwrite (boost::filesystem::path)
44 {
45         return true;
46 }
47
48
49 static shared_ptr<dcpomatic::Screen> cinema_a_screen_1;
50 static shared_ptr<dcpomatic::Screen> cinema_a_screen_2;
51 static shared_ptr<dcpomatic::Screen> cinema_b_screen_x;
52 static shared_ptr<dcpomatic::Screen> cinema_b_screen_y;
53 static shared_ptr<dcpomatic::Screen> cinema_b_screen_z;
54
55
56 BOOST_AUTO_TEST_CASE (single_kdm_naming_test)
57 {
58         auto c = Config::instance();
59
60         auto crypt_cert = c->decryption_chain()->leaf();
61
62         /* Cinema A: UTC +4:30 */
63         auto cinema_a = make_shared<Cinema>("Cinema A", list<string>(), "", 4, 30);
64         cinema_a_screen_1 = make_shared<dcpomatic::Screen>("Screen 1", "", crypt_cert, vector<TrustedDevice>());
65         cinema_a->add_screen (cinema_a_screen_1);
66         cinema_a_screen_2 = make_shared<dcpomatic::Screen>("Screen 2", "", crypt_cert, vector<TrustedDevice>());
67         cinema_a->add_screen (cinema_a_screen_2);
68         c->add_cinema (cinema_a);
69
70         /* Cinema B: UTC -1:00 */
71         auto cinema_b = make_shared<Cinema>("Cinema B", list<string>(), "", -1, 0);
72         cinema_b_screen_x = make_shared<dcpomatic::Screen>("Screen X", "", crypt_cert, vector<TrustedDevice>());
73         cinema_b->add_screen (cinema_b_screen_x);
74         cinema_b_screen_y = make_shared<dcpomatic::Screen>("Screen Y", "", crypt_cert, vector<TrustedDevice>());
75         cinema_b->add_screen (cinema_b_screen_y);
76         cinema_b_screen_z = make_shared<dcpomatic::Screen>("Screen Z", "", crypt_cert, vector<TrustedDevice>());
77         cinema_b->add_screen (cinema_b_screen_z);
78         c->add_cinema (cinema_a);
79
80         /* Film */
81         boost::filesystem::remove_all ("build/test/single_kdm_naming_test");
82         auto film = new_test_film2 ("single_kdm_naming_test");
83         film->set_name ("my_great_film");
84         film->examine_and_add_content (content_factory("test/data/flat_black.png").front());
85         BOOST_REQUIRE (!wait_for_jobs());
86         film->set_encrypted (true);
87         make_and_verify_dcp (film);
88         auto cpls = film->cpls ();
89         BOOST_REQUIRE(cpls.size() == 1);
90
91         auto sign_cert = c->signer_chain()->leaf();
92
93         dcp::LocalTime from (sign_cert.not_before());
94         from.add_months (2);
95         dcp::LocalTime until (sign_cert.not_after());
96         until.add_months (-2);
97
98         auto const from_string = from.date() + " " + from.time_of_day(true, false);
99         auto const until_string = until.date() + " " + until.time_of_day(true, false);
100
101         auto cpl = cpls.front().cpl_file;
102         auto kdm = kdm_for_screen (
103                         film,
104                         cpls.front().cpl_file,
105                         cinema_a_screen_1,
106                         boost::posix_time::time_from_string(from_string),
107                         boost::posix_time::time_from_string(until_string),
108                         dcp::Formulation::MODIFIED_TRANSITIONAL_1,
109                         false,
110                         optional<int>()
111                         );
112
113         write_files (
114                 { kdm },
115                 boost::filesystem::path("build/test/single_kdm_naming_test"),
116                 dcp::NameFormat("KDM %c - %s - %f - %b - %e"),
117                 &confirm_overwrite
118                 );
119
120         auto from_time = from.time_of_day (true, false);
121         boost::algorithm::replace_all (from_time, ":", "-");
122         auto until_time = until.time_of_day (true, false);
123         boost::algorithm::replace_all (until_time, ":", "-");
124
125         auto 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);
126         BOOST_CHECK_MESSAGE (boost::filesystem::exists("build/test/single_kdm_naming_test/" + ref), "File " << ref << " not found");
127 }
128
129
130 BOOST_AUTO_TEST_CASE (directory_kdm_naming_test, * boost::unit_test::depends_on("single_kdm_naming_test"))
131 {
132         using boost::filesystem::path;
133
134         /* Film */
135         boost::filesystem::remove_all ("build/test/directory_kdm_naming_test");
136         auto film = new_test_film2 (
137                 "directory_kdm_naming_test",
138                 { content_factory("test/data/flat_black.png").front() }
139                 );
140
141         film->set_name ("my_great_film");
142         film->set_encrypted (true);
143         make_and_verify_dcp (film);
144         auto cpls = film->cpls ();
145         BOOST_REQUIRE(cpls.size() == 1);
146
147         auto sign_cert = Config::instance()->signer_chain()->leaf();
148
149         dcp::LocalTime from (sign_cert.not_before());
150         from.add_months (2);
151         dcp::LocalTime until (sign_cert.not_after());
152         until.add_months (-2);
153
154         string const from_string = from.date() + " " + from.time_of_day(true, false);
155         string const until_string = until.date() + " " + until.time_of_day(true, false);
156
157         list<shared_ptr<dcpomatic::Screen>> screens = {
158                 cinema_a_screen_2, cinema_b_screen_x, cinema_a_screen_1, (cinema_b_screen_z)
159         };
160
161         auto const cpl = cpls.front().cpl_file;
162         auto const cpl_id = cpls.front().cpl_id;
163
164         list<KDMWithMetadataPtr> kdms;
165         for (auto i: screens) {
166                 auto kdm = kdm_for_screen (
167                                 film,
168                                 cpls.front().cpl_file,
169                                 i,
170                                 boost::posix_time::time_from_string(from_string),
171                                 boost::posix_time::time_from_string(until_string),
172                                 dcp::Formulation::MODIFIED_TRANSITIONAL_1,
173                                 false,
174                                 optional<int>()
175                                 );
176
177                 kdms.push_back (kdm);
178         }
179
180         write_directories (
181                 collect(kdms),
182                 path("build/test/directory_kdm_naming_test"),
183                 dcp::NameFormat("%c - %s - %f - %b - %e"),
184 #ifdef DCPOMATIC_WINDOWS
185                 /* With %i in the format the path is too long for Windows */
186                 dcp::NameFormat("KDM %c - %s - %f - %b - %e"),
187 #else
188                 dcp::NameFormat("KDM %c - %s - %f - %b - %e - %i"),
189 #endif
190                 &confirm_overwrite
191                 );
192
193         auto from_time = from.time_of_day (true, false);
194         boost::algorithm::replace_all (from_time, ":", "-");
195         auto until_time = until.time_of_day (true, false);
196         boost::algorithm::replace_all (until_time, ":", "-");
197
198         path const base = "build/test/directory_kdm_naming_test";
199
200         path dir_a = String::compose("Cinema_A_-_%s_-_my_great_film_-_%1_%2_-_%3_%4", from.date(), from_time, until.date(), until_time);
201         BOOST_CHECK_MESSAGE (boost::filesystem::exists(base / dir_a), "Directory " << dir_a << " not found");
202         path dir_b = String::compose("Cinema_B_-_%s_-_my_great_film_-_%1_%2_-_%3_%4", from.date(), from_time, until.date(), until_time);
203         BOOST_CHECK_MESSAGE (boost::filesystem::exists(base / dir_b), "Directory " << dir_b << " not found");
204
205 #ifdef DCPOMATIC_WINDOWS
206         path ref = String::compose("KDM_Cinema_A_-_Screen_2_-_my_great_film_-_%1_%2_-_%3_%4.xml", from.date(), from_time, until.date(), until_time);
207 #else
208         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);
209 #endif
210         BOOST_CHECK_MESSAGE (boost::filesystem::exists(base / dir_a / ref), "File " << ref << " not found");
211
212 #ifdef DCPOMATIC_WINDOWS
213         ref = String::compose("KDM_Cinema_B_-_Screen_X_-_my_great_film_-_%1_%2_-_%3_%4.xml", from.date(), from_time, until.date(), until_time);
214 #else
215         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);
216 #endif
217         BOOST_CHECK_MESSAGE (boost::filesystem::exists(base / dir_b / ref), "File " << ref << " not found");
218
219 #ifdef DCPOMATIC_WINDOWS
220         ref = String::compose("KDM_Cinema_A_-_Screen_1_-_my_great_film_-_%1_%2_-_%3_%4.xml", from.date(), from_time, until.date(), until_time);
221 #else
222         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);
223 #endif
224         BOOST_CHECK_MESSAGE (boost::filesystem::exists(base / dir_a / ref), "File " << ref << " not found");
225
226 #ifdef DCPOMATIC_WINDOWS
227         ref = String::compose("KDM_Cinema_B_-_Screen_Z_-_my_great_film_-_%1_%2_-_%3_%4.xml", from.date(), from_time, until.date(), until_time);
228 #else
229         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);
230 #endif
231         BOOST_CHECK_MESSAGE (boost::filesystem::exists(base / dir_b / ref), "File " << ref << " not found");
232 }
233