2 Copyright (C) 2018-2021 Carl Hetherington <cth@carlh.net>
4 This file is part of DCP-o-matic.
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.
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.
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/>.
22 #include "lib/cinema.h"
23 #include "lib/config.h"
25 #include <boost/test/unit_test.hpp>
29 using std::make_shared;
33 using boost::optional;
37 rewrite_bad_config (string filename, string extra_line)
39 using namespace boost::filesystem;
41 auto base = path("build/test/bad_config/2.16");
42 auto file = base / filename;
44 boost::system::error_code ec;
47 boost::filesystem::create_directories (base);
48 std::ofstream f (file.string().c_str());
49 f << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
56 return dcp::file_to_string (file);
60 BOOST_AUTO_TEST_CASE (config_backup_test)
64 Config::override_path = "build/test/bad_config";
66 boost::filesystem::remove_all ("build/test/bad_config");
68 /* Write an invalid config file to config.xml */
69 auto const first_write_xml = rewrite_bad_config("config.xml", "first write");
71 /* Load the config; this should fail, causing the bad config to be copied to config.xml.1
72 * and a new config.xml created in its place.
76 BOOST_CHECK ( boost::filesystem::exists("build/test/bad_config/2.16/config.xml.1"));
77 BOOST_CHECK (dcp::file_to_string("build/test/bad_config/2.16/config.xml.1") == first_write_xml);
78 BOOST_CHECK (!boost::filesystem::exists("build/test/bad_config/2.16/config.xml.2"));
79 BOOST_CHECK (!boost::filesystem::exists("build/test/bad_config/2.16/config.xml.3"));
80 BOOST_CHECK (!boost::filesystem::exists("build/test/bad_config/2.16/config.xml.4"));
83 auto const second_write_xml = rewrite_bad_config("config.xml", "second write");
86 BOOST_CHECK ( boost::filesystem::exists("build/test/bad_config/2.16/config.xml.1"));
87 BOOST_CHECK (dcp::file_to_string("build/test/bad_config/2.16/config.xml.1") == first_write_xml);
88 BOOST_CHECK ( boost::filesystem::exists("build/test/bad_config/2.16/config.xml.2"));
89 BOOST_CHECK (dcp::file_to_string("build/test/bad_config/2.16/config.xml.2") == second_write_xml);
90 BOOST_CHECK (!boost::filesystem::exists("build/test/bad_config/2.16/config.xml.3"));
91 BOOST_CHECK (!boost::filesystem::exists("build/test/bad_config/2.16/config.xml.4"));
94 auto const third_write_xml = rewrite_bad_config("config.xml", "third write");
97 BOOST_CHECK ( boost::filesystem::exists("build/test/bad_config/2.16/config.xml.1"));
98 BOOST_CHECK (dcp::file_to_string("build/test/bad_config/2.16/config.xml.1") == first_write_xml);
99 BOOST_CHECK ( boost::filesystem::exists("build/test/bad_config/2.16/config.xml.2"));
100 BOOST_CHECK (dcp::file_to_string("build/test/bad_config/2.16/config.xml.2") == second_write_xml);
101 BOOST_CHECK ( boost::filesystem::exists("build/test/bad_config/2.16/config.xml.3"));
102 BOOST_CHECK (dcp::file_to_string("build/test/bad_config/2.16/config.xml.3") == third_write_xml);
103 BOOST_CHECK (!boost::filesystem::exists("build/test/bad_config/2.16/config.xml.4"));
106 auto const fourth_write_xml = rewrite_bad_config("config.xml", "fourth write");
109 BOOST_CHECK (boost::filesystem::exists("build/test/bad_config/2.16/config.xml.1"));
110 BOOST_CHECK (dcp::file_to_string("build/test/bad_config/2.16/config.xml.1") == first_write_xml);
111 BOOST_CHECK (boost::filesystem::exists("build/test/bad_config/2.16/config.xml.2"));
112 BOOST_CHECK (dcp::file_to_string("build/test/bad_config/2.16/config.xml.2") == second_write_xml);
113 BOOST_CHECK (boost::filesystem::exists("build/test/bad_config/2.16/config.xml.3"));
114 BOOST_CHECK (dcp::file_to_string("build/test/bad_config/2.16/config.xml.3") == third_write_xml);
115 BOOST_CHECK (boost::filesystem::exists("build/test/bad_config/2.16/config.xml.4"));
116 BOOST_CHECK (dcp::file_to_string("build/test/bad_config/2.16/config.xml.4") == fourth_write_xml);
120 BOOST_AUTO_TEST_CASE (config_backup_with_link_test)
122 using namespace boost::filesystem;
126 auto base = path("build/test/bad_config");
127 auto version = base / "2.16";
129 Config::override_path = base;
132 boost::filesystem::remove_all (base);
134 boost::filesystem::create_directories (version);
135 std::ofstream f (path(version / "config.xml").string().c_str());
136 f << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
138 << "<Link>" << path(version / "actual.xml").string() << "</Link>\n"
143 /* Cause actual.xml to be backed up */
144 rewrite_bad_config ("actual.xml", "first write");
147 /* Make sure actual.xml was backed up to the right place */
148 BOOST_CHECK (boost::filesystem::exists(version / "actual.xml.1"));
152 BOOST_AUTO_TEST_CASE (config_write_utf8_test)
156 boost::filesystem::remove_all ("build/test/config.xml");
157 boost::filesystem::copy_file ("test/data/utf8_config.xml", "build/test/config.xml");
158 Config::override_path = "build/test";
160 Config::instance()->write();
162 check_text_file ("test/data/utf8_config.xml", "build/test/config.xml");
166 BOOST_AUTO_TEST_CASE (config_upgrade_test)
170 boost::filesystem::path dir = "build/test/config_upgrade_test";
171 Config::override_path = dir;
173 boost::filesystem::remove_all (dir);
174 boost::filesystem::create_directories (dir);
176 boost::filesystem::copy_file ("test/data/2.14.config.xml", dir / "config.xml");
177 boost::filesystem::copy_file ("test/data/2.14.cinemas.xml", dir / "cinemas.xml");
180 /* This will fail to write cinemas.xml since the link is to a non-existent directory */
181 Config::instance()->write();
184 check_xml (dir / "config.xml", "test/data/2.14.config.xml", {});
185 check_xml (dir / "cinemas.xml", "test/data/2.14.cinemas.xml", {});
186 #ifdef DCPOMATIC_WINDOWS
187 /* This file has the windows path for dkdm_recipients.xml (with backslashes) */
188 check_xml (dir / "2.16" / "config.xml", "test/data/2.16.config.windows.xml", {});
190 check_xml (dir / "2.16" / "config.xml", "test/data/2.16.config.xml", {});
192 /* cinemas.xml is not copied into 2.16 as its format has not changed */
193 BOOST_REQUIRE (!boost::filesystem::exists(dir / "2.16" / "cinemas.xml"));
197 BOOST_AUTO_TEST_CASE (config_keep_cinemas_if_making_new_config)
201 boost::filesystem::path dir = "build/test/config_keep_cinemas_if_making_new_config";
202 Config::override_path = dir;
204 boost::filesystem::remove_all (dir);
205 boost::filesystem::create_directories (dir);
207 Config::instance()->write();
209 Config::instance()->add_cinema(make_shared<Cinema>("My Great Cinema", vector<string>(), "", 0, 0));
210 Config::instance()->write();
212 boost::filesystem::copy_file (dir / "cinemas.xml", dir / "backup_for_test.xml");
215 boost::filesystem::remove (dir / "2.16" / "config.xml");
218 check_text_file(dir / "backup_for_test.xml", dir / "cinemas.xml");
222 BOOST_AUTO_TEST_CASE(keep_config_if_cinemas_fail_to_load)
226 /* Make a new config */
227 boost::filesystem::path dir = "build/test/keep_config_if_cinemas_fail_to_load";
228 Config::override_path = dir;
230 boost::filesystem::remove_all(dir);
231 boost::filesystem::create_directories(dir);
232 Config::instance()->write();
234 auto const cinemas = dir / "cinemas.xml";
237 boost::filesystem::copy_file(dir / "2.16" / "config.xml", dir / "config_backup_for_test.xml");
238 boost::filesystem::copy_file(cinemas, dir / "cinemas_backup_for_test.xml");
240 /* Corrupt the cinemas */
242 std::ofstream corrupt(cinemas.string().c_str());
247 /* We should have a new cinemas.xml and the old config.xml */
248 check_text_file(dir / "2.16" / "config.xml", dir / "config_backup_for_test.xml");
249 check_text_file(cinemas, dir / "cinemas_backup_for_test.xml");