Don't crash immediately if there's no private data.
[dcpomatic.git] / test / test.cc
index f1fd40fb791597c4bf5da7e960a05b523b5878cb..c91701e558ce1302c4fd32c60d54848c780f674d 100644 (file)
@@ -94,7 +94,13 @@ TestPaths::TestPaths::private_data ()
                return boost::filesystem::path(env);
        }
 
-       return boost::filesystem::canonical(boost::filesystem::path ("..") / boost::filesystem::path ("dcpomatic-test-private"));
+       auto relative = boost::filesystem::path ("..") / boost::filesystem::path ("dcpomatic-test-private");
+       if (!boost::filesystem::exists(relative)) {
+               std::cerr << "No private test data found! Tests may fail.\n";
+               return relative;
+       }
+
+       return boost::filesystem::canonical(relative);
 }
 
 
@@ -110,7 +116,6 @@ setup_test_config ()
        Config::instance()->set_master_encoding_threads (boost::thread::hardware_concurrency() / 2);
        Config::instance()->set_server_encoding_threads (1);
        Config::instance()->set_server_port_base (61921);
-       Config::instance()->set_default_container (Ratio::from_id ("185"));
        Config::instance()->set_default_dcp_content_type (static_cast<DCPContentType*> (0));
        Config::instance()->set_default_audio_delay (0);
        Config::instance()->set_default_j2k_bandwidth (100000000);
@@ -283,7 +288,7 @@ check_mxf_audio_file (boost::filesystem::path ref, boost::filesystem::path check
        for (size_t i = 0; i < ref_desc.ContainerDuration; ++i) {
                ref_reader.ReadFrame (i, ref_buffer, 0);
                check_reader.ReadFrame (i, check_buffer, 0);
-               BOOST_REQUIRE (memcmp(ref_buffer.RoData(), check_buffer.RoData(), ref_buffer.Size()) == 0);
+               BOOST_REQUIRE_MESSAGE(memcmp(ref_buffer.RoData(), check_buffer.RoData(), ref_buffer.Size()) == 0, "Audio MXF differs in frame " << i);
        }
 }
 
@@ -552,6 +557,7 @@ check_dcp (boost::filesystem::path ref, boost::filesystem::path check)
        options.reel_annotation_texts_can_differ = true;
        options.reel_hashes_can_differ = true;
        options.issue_dates_can_differ = true;
+       options.max_subtitle_vertical_position_error = 0.001;
 
        BOOST_CHECK (ref_dcp.equals (check_dcp, options, boost::bind (note, _1, _2)));
 }
@@ -824,13 +830,15 @@ check_one_frame (boost::filesystem::path dcp_dir, int64_t index, boost::filesyst
 boost::filesystem::path
 dcp_file (shared_ptr<const Film> film, string prefix)
 {
-       auto i = boost::filesystem::recursive_directory_iterator(film->dir(film->dcp_name()));
-       while (i != boost::filesystem::recursive_directory_iterator() && !boost::algorithm::starts_with(i->path().leaf().string(), prefix)) {
-               ++i;
-       }
+       using namespace boost::filesystem;
+
+       vector<directory_entry> matches;
+       std::copy_if(recursive_directory_iterator(film->dir(film->dcp_name())), recursive_directory_iterator(), std::back_inserter(matches), [&prefix](directory_entry const& entry) {
+               return boost::algorithm::starts_with(entry.path().leaf().string(), prefix);
+       });
 
-       BOOST_REQUIRE_MESSAGE(i != boost::filesystem::recursive_directory_iterator(), "Could not find file with prefix " << prefix);
-       return i->path();
+       BOOST_REQUIRE_MESSAGE(matches.size() == 1, "Found " << matches.size() << " files with prefix " << prefix);
+       return matches[0].path();
 }
 
 boost::filesystem::path
@@ -934,7 +942,7 @@ make_and_verify_dcp (shared_ptr<Film> film, vector<dcp::VerificationNote::Code>
        film->write_metadata ();
        make_dcp (film, TranscodeJob::ChangedBehaviour::IGNORE);
        BOOST_REQUIRE (!wait_for_jobs());
-       auto notes = dcp::verify ({film->dir(film->dcp_name())}, &stage, &progress, TestPaths::xsd());
+       auto notes = dcp::verify({film->dir(film->dcp_name())}, &stage, &progress, {}, TestPaths::xsd());
        bool ok = true;
        for (auto i: notes) {
                if (find(ignore.begin(), ignore.end(), i.code()) == ignore.end()) {
@@ -980,3 +988,27 @@ find_file (boost::filesystem::path dir, string filename_part)
        BOOST_REQUIRE (found);
        return *found;
 }
+
+
+Editor::Editor(boost::filesystem::path path)
+       : _path(path)
+       , _content(dcp::file_to_string(path))
+{
+
+}
+
+Editor::~Editor()
+{
+       auto f = fopen(_path.string().c_str(), "w");
+       BOOST_REQUIRE(f);
+       fwrite(_content.c_str(), _content.length(), 1, f);
+       fclose(f);
+}
+
+void
+Editor::replace(string a, string b)
+{
+       auto old_content = _content;
+       boost::algorithm::replace_all(_content, a, b);
+       BOOST_REQUIRE(_content != old_content);
+}