Move UTC offset for KDMs from the cinema to the point of KDM creation (#2300).
[dcpomatic.git] / test / config_test.cc
index 6a65deb2e1a95f638dee2bb991aae5c92a094a51..00adb7b09fc781e80106f8657aca126c3f55a5a9 100644 (file)
 #include <fstream>
 
 
-using std::list;
-using std::ofstream;
 using std::make_shared;
+using std::ofstream;
 using std::string;
+using std::vector;
 using boost::optional;
 
 
@@ -38,7 +38,7 @@ rewrite_bad_config (string filename, string extra_line)
 {
        using namespace boost::filesystem;
 
-       auto base = path("build/test/bad_config/2.16");
+       auto base = path("build/test/bad_config/2.18");
        auto file = base / filename;
 
        boost::system::error_code ec;
@@ -73,47 +73,49 @@ BOOST_AUTO_TEST_CASE (config_backup_test)
         */
        Config::instance();
 
-       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"));
+       boost::filesystem::path const prefix = "build/test/bad_config/2.18";
+
+       BOOST_CHECK(boost::filesystem::exists(prefix / "config.xml.1"));
+       BOOST_CHECK(dcp::file_to_string(prefix / "config.xml.1") == first_write_xml);
+       BOOST_CHECK(!boost::filesystem::exists(prefix / "config.xml.2"));
+       BOOST_CHECK(!boost::filesystem::exists(prefix / "config.xml.3"));
+       BOOST_CHECK(!boost::filesystem::exists(prefix / "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/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"));
+       BOOST_CHECK(boost::filesystem::exists(prefix / "config.xml.1"));
+       BOOST_CHECK(dcp::file_to_string(prefix / "config.xml.1") == first_write_xml);
+       BOOST_CHECK(boost::filesystem::exists(prefix / "config.xml.2"));
+       BOOST_CHECK(dcp::file_to_string(prefix / "config.xml.2") == second_write_xml);
+       BOOST_CHECK(!boost::filesystem::exists(prefix / "config.xml.3"));
+       BOOST_CHECK(!boost::filesystem::exists(prefix / "config.xml.4"));
 
        Config::drop();
        auto const third_write_xml = rewrite_bad_config("config.xml", "third write");
        Config::instance();
 
-       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(boost::filesystem::exists(prefix / "config.xml.1"));
+       BOOST_CHECK(dcp::file_to_string(prefix / "config.xml.1") == first_write_xml);
+       BOOST_CHECK(boost::filesystem::exists(prefix / "config.xml.2"));
+       BOOST_CHECK(dcp::file_to_string(prefix / "config.xml.2") == second_write_xml);
+       BOOST_CHECK(boost::filesystem::exists(prefix / "config.xml.3"));
+       BOOST_CHECK(dcp::file_to_string(prefix / "config.xml.3") == third_write_xml);
+       BOOST_CHECK(!boost::filesystem::exists(prefix / "config.xml.4"));
 
        Config::drop();
        auto const fourth_write_xml = rewrite_bad_config("config.xml", "fourth write");
        Config::instance();
 
-       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_CHECK(boost::filesystem::exists(prefix / "config.xml.1"));
+       BOOST_CHECK(dcp::file_to_string(prefix / "config.xml.1") == first_write_xml);
+       BOOST_CHECK(boost::filesystem::exists(prefix / "config.xml.2"));
+       BOOST_CHECK(dcp::file_to_string(prefix / "config.xml.2") == second_write_xml);
+       BOOST_CHECK(boost::filesystem::exists(prefix / "config.xml.3"));
+       BOOST_CHECK(dcp::file_to_string(prefix / "config.xml.3") == third_write_xml);
+       BOOST_CHECK(boost::filesystem::exists(prefix / "config.xml.4"));
+       BOOST_CHECK(dcp::file_to_string(prefix / "config.xml.4") == fourth_write_xml);
 }
 
 
@@ -124,7 +126,7 @@ BOOST_AUTO_TEST_CASE (config_backup_with_link_test)
        ConfigRestorer cr;
 
        auto base = path("build/test/bad_config");
-       auto version = base / "2.16";
+       auto version = base / "2.18";
 
        Config::override_path = base;
        Config::drop();
@@ -163,7 +165,8 @@ BOOST_AUTO_TEST_CASE (config_write_utf8_test)
 }
 
 
-BOOST_AUTO_TEST_CASE (config_upgrade_test)
+/* 2.14 -> 2.18 */
+BOOST_AUTO_TEST_CASE (config_upgrade_test1)
 {
        ConfigRestorer cr;
 
@@ -177,7 +180,7 @@ BOOST_AUTO_TEST_CASE (config_upgrade_test)
        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 */
+               /* This will fail to write cinemas.xml since the link is to a non-existent directory */
                Config::instance()->write();
        } catch (...) {}
 
@@ -185,17 +188,56 @@ BOOST_AUTO_TEST_CASE (config_upgrade_test)
        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", {});
+       check_xml(dir / "2.18" / "config.xml", "test/data/2.18.config.windows.xml", {});
+#else
+       check_xml(dir / "2.18" / "config.xml", "test/data/2.18.config.xml", {});
+#endif
+       /* cinemas.xml is not copied into 2.18 as its format has not changed */
+       BOOST_REQUIRE (!boost::filesystem::exists(dir / "2.18" / "cinemas.xml"));
+}
+
+
+/* 2.16 -> 2.18 */
+BOOST_AUTO_TEST_CASE (config_upgrade_test2)
+{
+       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);
+
+#ifdef DCPOMATIC_WINDOWS
+       boost::filesystem::copy_file("test/data/2.16.config.windows.xml", dir / "config.xml");
+#else
+       boost::filesystem::copy_file("test/data/2.16.config.xml", dir / "config.xml");
+#endif
+       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-existent directory */
+               Config::instance()->write();
+       } catch (...) {}
+
+       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.18" / "config.xml", "test/data/2.18.config.windows.xml", {});
+       check_xml(dir / "config.xml", "test/data/2.16.config.windows.xml", {});
 #else
-       check_xml (dir / "2.16" / "config.xml", "test/data/2.16.config.xml", {});
+       check_xml(dir / "2.18" / "config.xml", "test/data/2.18.config.xml", {});
+       check_xml(dir / "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"));
+       /* cinemas.xml is not copied into 2.18 as its format has not changed */
+       BOOST_REQUIRE (!boost::filesystem::exists(dir / "2.18" / "cinemas.xml"));
 }
 
 
 BOOST_AUTO_TEST_CASE (config_keep_cinemas_if_making_new_config)
 {
+       ConfigRestorer cr;
+
        boost::filesystem::path dir = "build/test/config_keep_cinemas_if_making_new_config";
        Config::override_path = dir;
        Config::drop ();
@@ -204,15 +246,46 @@ BOOST_AUTO_TEST_CASE (config_keep_cinemas_if_making_new_config)
 
        Config::instance()->write();
 
-       Config::instance()->add_cinema(make_shared<Cinema>("My Great Cinema", list<string>(), "", 0, 0));
+       Config::instance()->add_cinema(make_shared<Cinema>("My Great Cinema", vector<string>(), ""));
        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");
+       boost::filesystem::remove (dir / "2.18" / "config.xml");
+       Config::instance();
+
+       check_text_file(dir / "backup_for_test.xml", dir / "cinemas.xml");
+}
+
+
+BOOST_AUTO_TEST_CASE(keep_config_if_cinemas_fail_to_load)
+{
+       ConfigRestorer cr;
+
+       /* Make a new config */
+       boost::filesystem::path dir = "build/test/keep_config_if_cinemas_fail_to_load";
+       Config::override_path = dir;
+       Config::drop();
+       boost::filesystem::remove_all(dir);
+       boost::filesystem::create_directories(dir);
+       Config::instance()->write();
+
+       auto const cinemas = dir / "cinemas.xml";
+
+       /* Back things up */
+       boost::filesystem::copy_file(dir / "2.18" / "config.xml", dir / "config_backup_for_test.xml");
+       boost::filesystem::copy_file(cinemas, dir / "cinemas_backup_for_test.xml");
+
+       /* Corrupt the cinemas */
+       Config::drop();
+       std::ofstream corrupt(cinemas.string().c_str());
+       corrupt << "foo\n";
+       corrupt.close();
        Config::instance();
 
-       check_text_file (dir / "backup_for_test.xml", dir / "cinemas.xml.1");
+       /* We should have a new cinemas.xml and the old config.xml */
+       check_text_file(dir / "2.18" / "config.xml", dir / "config_backup_for_test.xml");
+       check_text_file(cinemas, dir / "cinemas_backup_for_test.xml");
 }