X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=test%2Fconfig_test.cc;h=6b35c595d0b60792b849056f7b66597ae1592c51;hp=14cceb6a0df30100849a9565e733fbec032902fd;hb=6d686ea45f5cd01a0d11f92a903ac77779ad8562;hpb=04badd0c82d3ce82ee87c07e120e585899d4acff diff --git a/test/config_test.cc b/test/config_test.cc index 14cceb6a0..6b35c595d 100644 --- a/test/config_test.cc +++ b/test/config_test.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2018 Carl Hetherington + Copyright (C) 2018-2021 Carl Hetherington This file is part of DCP-o-matic. @@ -18,79 +18,203 @@ */ + +#include "lib/cinema.h" #include "lib/config.h" #include "test.h" #include #include + +using std::list; using std::ofstream; +using std::make_shared; +using std::string; +using boost::optional; -static void -rewrite_bad_config () + +static string +rewrite_bad_config (string filename, string extra_line) { + using namespace boost::filesystem; + + auto base = path("build/test/bad_config/2.16"); + auto file = base / filename; + boost::system::error_code ec; - boost::filesystem::remove ("build/test/config.xml", ec); + remove (file, ec); - Config::override_path = "build/test"; - ofstream f ("build/test/config.xml"); + boost::filesystem::create_directories (base); + std::ofstream f (file.string().c_str()); f << "\n" << "\n" << "\n" + << extra_line << "\n" << "\n"; f.close (); + + return dcp::file_to_string (file); } BOOST_AUTO_TEST_CASE (config_backup_test) { + ConfigRestorer cr; + + Config::override_path = "build/test/bad_config"; Config::drop(); + boost::filesystem::remove_all ("build/test/bad_config"); - boost::system::error_code ec; - boost::filesystem::remove ("build/test/config.xml.1", ec); - boost::filesystem::remove ("build/test/config.xml.2", ec); - boost::filesystem::remove ("build/test/config.xml.3", ec); - boost::filesystem::remove ("build/test/config.xml.4", ec); - boost::filesystem::remove ("build/test/config.xml.5", ec); - boost::filesystem::remove ("build/test/config.xml.5", ec); + /* Write an invalid config file to config.xml */ + auto const first_write_xml = rewrite_bad_config("config.xml", "first write"); + + /* Load the config; this should fail, causing the bad config to be copied to config.xml.1 + * and a new config.xml created in its place. + */ + Config::instance(); - rewrite_bad_config(); + BOOST_CHECK ( boost::filesystem::exists("build/test/bad_config/2.16/config.xml.1")); + BOOST_CHECK (dcp::file_to_string("build/test/bad_config/2.16/config.xml.1") == first_write_xml); + BOOST_CHECK (!boost::filesystem::exists("build/test/bad_config/2.16/config.xml.2")); + BOOST_CHECK (!boost::filesystem::exists("build/test/bad_config/2.16/config.xml.3")); + BOOST_CHECK (!boost::filesystem::exists("build/test/bad_config/2.16/config.xml.4")); + Config::drop(); + auto const second_write_xml = rewrite_bad_config("config.xml", "second write"); Config::instance(); - BOOST_CHECK ( boost::filesystem::exists ("build/test/config.xml.1")); - BOOST_CHECK (!boost::filesystem::exists ("build/test/config.xml.2")); - BOOST_CHECK (!boost::filesystem::exists ("build/test/config.xml.3")); - BOOST_CHECK (!boost::filesystem::exists ("build/test/config.xml.4")); + BOOST_CHECK ( boost::filesystem::exists("build/test/bad_config/2.16/config.xml.1")); + BOOST_CHECK (dcp::file_to_string("build/test/bad_config/2.16/config.xml.1") == first_write_xml); + BOOST_CHECK ( boost::filesystem::exists("build/test/bad_config/2.16/config.xml.2")); + BOOST_CHECK (dcp::file_to_string("build/test/bad_config/2.16/config.xml.2") == second_write_xml); + BOOST_CHECK (!boost::filesystem::exists("build/test/bad_config/2.16/config.xml.3")); + BOOST_CHECK (!boost::filesystem::exists("build/test/bad_config/2.16/config.xml.4")); Config::drop(); - rewrite_bad_config(); + auto const third_write_xml = rewrite_bad_config("config.xml", "third write"); Config::instance(); - BOOST_CHECK ( boost::filesystem::exists ("build/test/config.xml.1")); - BOOST_CHECK ( boost::filesystem::exists ("build/test/config.xml.2")); - BOOST_CHECK (!boost::filesystem::exists ("build/test/config.xml.3")); - BOOST_CHECK (!boost::filesystem::exists ("build/test/config.xml.4")); + BOOST_CHECK ( boost::filesystem::exists("build/test/bad_config/2.16/config.xml.1")); + BOOST_CHECK (dcp::file_to_string("build/test/bad_config/2.16/config.xml.1") == first_write_xml); + BOOST_CHECK ( boost::filesystem::exists("build/test/bad_config/2.16/config.xml.2")); + BOOST_CHECK (dcp::file_to_string("build/test/bad_config/2.16/config.xml.2") == second_write_xml); + BOOST_CHECK ( boost::filesystem::exists("build/test/bad_config/2.16/config.xml.3")); + BOOST_CHECK (dcp::file_to_string("build/test/bad_config/2.16/config.xml.3") == third_write_xml); + BOOST_CHECK (!boost::filesystem::exists("build/test/bad_config/2.16/config.xml.4")); Config::drop(); - rewrite_bad_config(); + auto const fourth_write_xml = rewrite_bad_config("config.xml", "fourth write"); Config::instance(); - BOOST_CHECK ( boost::filesystem::exists ("build/test/config.xml.1")); - BOOST_CHECK ( boost::filesystem::exists ("build/test/config.xml.2")); - BOOST_CHECK ( boost::filesystem::exists ("build/test/config.xml.3")); - BOOST_CHECK (!boost::filesystem::exists ("build/test/config.xml.4")); + BOOST_CHECK (boost::filesystem::exists("build/test/bad_config/2.16/config.xml.1")); + BOOST_CHECK (dcp::file_to_string("build/test/bad_config/2.16/config.xml.1") == first_write_xml); + BOOST_CHECK (boost::filesystem::exists("build/test/bad_config/2.16/config.xml.2")); + BOOST_CHECK (dcp::file_to_string("build/test/bad_config/2.16/config.xml.2") == second_write_xml); + BOOST_CHECK (boost::filesystem::exists("build/test/bad_config/2.16/config.xml.3")); + BOOST_CHECK (dcp::file_to_string("build/test/bad_config/2.16/config.xml.3") == third_write_xml); + BOOST_CHECK (boost::filesystem::exists("build/test/bad_config/2.16/config.xml.4")); + BOOST_CHECK (dcp::file_to_string("build/test/bad_config/2.16/config.xml.4") == fourth_write_xml); +} + +BOOST_AUTO_TEST_CASE (config_backup_with_link_test) +{ + using namespace boost::filesystem; + + ConfigRestorer cr; + + auto base = path("build/test/bad_config"); + auto version = base / "2.16"; + + Config::override_path = base; Config::drop(); - rewrite_bad_config(); + + boost::filesystem::remove_all (base); + + boost::filesystem::create_directories (version); + std::ofstream f (path(version / "config.xml").string().c_str()); + f << "\n" + << "\n" + << "" << path(version / "actual.xml").string() << "\n" + << "\n"; + f.close (); + + Config::drop (); + /* Cause actual.xml to be backed up */ + rewrite_bad_config ("actual.xml", "first write"); + Config::instance (); + + /* Make sure actual.xml was backed up to the right place */ + BOOST_CHECK (boost::filesystem::exists(version / "actual.xml.1")); +} + + +BOOST_AUTO_TEST_CASE (config_write_utf8_test) +{ + ConfigRestorer cr; + + boost::filesystem::remove_all ("build/test/config.xml"); + boost::filesystem::copy_file ("test/data/utf8_config.xml", "build/test/config.xml"); + Config::override_path = "build/test"; + Config::drop (); + Config::instance()->write(); + + check_text_file ("test/data/utf8_config.xml", "build/test/config.xml"); +} + + +BOOST_AUTO_TEST_CASE (config_upgrade_test) +{ + ConfigRestorer cr; + + boost::filesystem::path dir = "build/test/config_upgrade_test"; + Config::override_path = dir; + Config::drop (); + boost::filesystem::remove_all (dir); + boost::filesystem::create_directories (dir); + + boost::filesystem::copy_file ("test/data/2.14.config.xml", dir / "config.xml"); + boost::filesystem::copy_file ("test/data/2.14.cinemas.xml", dir / "cinemas.xml"); Config::instance(); + try { + /* This will fail to write cinemas.xml since the link is to a non-existant directory */ + Config::instance()->write(); + } catch (...) {} + + check_xml (dir / "config.xml", "test/data/2.14.config.xml", {}); + check_xml (dir / "cinemas.xml", "test/data/2.14.cinemas.xml", {}); +#ifdef DCPOMATIC_WINDOWS + /* This file has the windows path for dkdm_recipients.xml (with backslashes) */ + check_xml (dir / "2.16" / "config.xml", "test/data/2.16.config.windows.xml", {}); +#else + check_xml (dir / "2.16" / "config.xml", "test/data/2.16.config.xml", {}); +#endif + /* cinemas.xml is not copied into 2.16 as its format has not changed */ + BOOST_REQUIRE (!boost::filesystem::exists(dir / "2.16" / "cinemas.xml")); +} + + +BOOST_AUTO_TEST_CASE (config_keep_cinemas_if_making_new_config) +{ + ConfigRestorer cr; - BOOST_CHECK (boost::filesystem::exists ("build/test/config.xml.1")); - BOOST_CHECK (boost::filesystem::exists ("build/test/config.xml.2")); - BOOST_CHECK (boost::filesystem::exists ("build/test/config.xml.3")); - BOOST_CHECK (boost::filesystem::exists ("build/test/config.xml.4")); + boost::filesystem::path dir = "build/test/config_keep_cinemas_if_making_new_config"; + Config::override_path = dir; + Config::drop (); + boost::filesystem::remove_all (dir); + boost::filesystem::create_directories (dir); - /* This test has called Config::set_defaults(), so take us back - to the config that we want for our tests. - */ - setup_test_config (); + Config::instance()->write(); + + Config::instance()->add_cinema(make_shared("My Great Cinema", list(), "", 0, 0)); + Config::instance()->write(); + + boost::filesystem::copy_file (dir / "cinemas.xml", dir / "backup_for_test.xml"); + + Config::drop (); + boost::filesystem::remove (dir / "2.16" / "config.xml"); + Config::instance(); + + check_text_file (dir / "backup_for_test.xml", dir / "cinemas.xml.1"); } +