X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=test%2Ftest.cc;h=0b98f7b8226ba4cdc58a3f5705455e765eccb000;hp=cbf4b5d4d6f84024cdcff4a3258d2d027b165a53;hb=b1dc9c3a2f7e55c9afc5bf2d5b465371b048e14f;hpb=8c7a308c03e4b4196b4e2379a26d432b100ae2b1 diff --git a/test/test.cc b/test/test.cc index cbf4b5d4d..0b98f7b82 100644 --- a/test/test.cc +++ b/test/test.cc @@ -1,19 +1,20 @@ /* - Copyright (C) 2012-2014 Carl Hetherington + Copyright (C) 2012-2015 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + DCP-o-matic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with DCP-o-matic. If not, see . */ @@ -21,23 +22,27 @@ * @brief Overall test stuff and useful methods for tests. */ -#include -#include -#include -#include -#include #include "lib/config.h" #include "lib/util.h" -#include "lib/ui_signaller.h" +#include "lib/signal_manager.h" #include "lib/film.h" #include "lib/job_manager.h" #include "lib/job.h" #include "lib/cross.h" -#include "lib/server_finder.h" +#include "lib/encode_server_finder.h" #include "lib/image.h" +#include "lib/ratio.h" +#include "lib/log_entry.h" +#include +#include +#include +#include #define BOOST_TEST_DYN_LINK #define BOOST_TEST_MODULE dcpomatic_test #include +#include +#include +#include using std::string; using std::vector; @@ -45,11 +50,13 @@ using std::min; using std::cout; using std::cerr; using std::list; +using std::abs; using boost::shared_ptr; +using boost::scoped_array; boost::filesystem::path private_data = boost::filesystem::path ("..") / boost::filesystem::path ("dcpomatic-test-private"); -class TestUISignaller : public UISignaller +class TestSignalManager : public SignalManager { public: /* No wakes in tests: we call ui_idle ourselves */ @@ -66,15 +73,17 @@ struct TestConfig dcpomatic_setup (); Config::instance()->set_num_local_encoding_threads (1); - Config::instance()->set_server_port_base (61920); + Config::instance()->set_server_port_base (61921); Config::instance()->set_default_isdcf_metadata (ISDCFMetadata ()); - Config::instance()->set_default_container (static_cast (0)); + Config::instance()->set_default_container (Ratio::from_id ("185")); Config::instance()->set_default_dcp_content_type (static_cast (0)); Config::instance()->set_default_audio_delay (0); + Config::instance()->set_default_j2k_bandwidth (100000000); + Config::instance()->set_log_types (LogEntry::TYPE_GENERAL | LogEntry::TYPE_WARNING | LogEntry::TYPE_ERROR); - ServerFinder::instance()->disable (); + EncodeServerFinder::instance()->stop (); - ui_signaller = new TestUISignaller (); + signal_manager = new TestSignalManager (); } ~TestConfig () @@ -102,10 +111,53 @@ new_test_film (string name) if (boost::filesystem::exists (p)) { boost::filesystem::remove_all (p); } - - shared_ptr f = shared_ptr (new Film (p.string())); - f->write_metadata (); - return f; + + shared_ptr film = shared_ptr (new Film (p.string())); + film->write_metadata (); + return film; +} + +void +check_audio_file (boost::filesystem::path ref, boost::filesystem::path check) +{ + SF_INFO ref_info; + ref_info.format = 0; + SNDFILE* ref_file = sf_open (ref.string().c_str(), SFM_READ, &ref_info); + BOOST_CHECK (ref_file); + + SF_INFO check_info; + check_info.format = 0; + SNDFILE* check_file = sf_open (check.string().c_str(), SFM_READ, &check_info); + BOOST_CHECK (check_file); + + BOOST_CHECK_EQUAL (ref_info.frames, check_info.frames); + BOOST_CHECK_EQUAL (ref_info.samplerate, check_info.samplerate); + BOOST_CHECK_EQUAL (ref_info.channels, check_info.channels); + BOOST_CHECK_EQUAL (ref_info.format, check_info.format); + + /* buffer_size is in frames */ + sf_count_t const buffer_size = 65536 * ref_info.channels; + scoped_array ref_buffer (new int32_t[buffer_size]); + scoped_array check_buffer (new int32_t[buffer_size]); + + sf_count_t N = ref_info.frames; + while (N) { + sf_count_t this_time = min (buffer_size, N); + sf_count_t r = sf_readf_int (ref_file, ref_buffer.get(), this_time); + BOOST_CHECK_EQUAL (r, this_time); + r = sf_readf_int (check_file, check_buffer.get(), this_time); + BOOST_CHECK_EQUAL (r, this_time); + + for (sf_count_t i = 0; i < this_time; ++i) { + BOOST_REQUIRE_MESSAGE ( + abs (ref_buffer[i] - check_buffer[i]) <= 65536, + ref << " differs from " << check << " at " << (ref_info.frames - N + i) << " of " << ref_info.frames + << "(" << ref_buffer[i] << " vs " << check_buffer[i] << ")" + ); + } + + N -= this_time; + } } void @@ -117,11 +169,13 @@ check_file (boost::filesystem::path ref, boost::filesystem::path check) BOOST_CHECK (ref_file); FILE* check_file = fopen_boost (check, "rb"); BOOST_CHECK (check_file); - + int const buffer_size = 65536; uint8_t* ref_buffer = new uint8_t[buffer_size]; uint8_t* check_buffer = new uint8_t[buffer_size]; + string error = "File " + check.string() + " differs from reference " + ref.string(); + while (N) { uintmax_t this_time = min (uintmax_t (buffer_size), N); size_t r = fread (ref_buffer, 1, this_time, ref_file); @@ -129,7 +183,11 @@ check_file (boost::filesystem::path ref, boost::filesystem::path check) r = fread (check_buffer, 1, this_time, check_file); BOOST_CHECK_EQUAL (r, this_time); - BOOST_CHECK_EQUAL (memcmp (ref_buffer, check_buffer, this_time), 0); + BOOST_CHECK_MESSAGE (memcmp (ref_buffer, check_buffer, this_time) == 0, error); + if (memcmp (ref_buffer, check_buffer, this_time)) { + break; + } + N -= this_time; } @@ -161,9 +219,10 @@ check_dcp (boost::filesystem::path ref, boost::filesystem::path check) options.max_std_dev_pixel_error = 5; options.max_audio_sample_error = 255; options.cpl_annotation_texts_can_differ = true; - options.mxf_names_can_differ = true; + options.reel_annotation_texts_can_differ = true; options.reel_hashes_can_differ = true; - + options.issue_dates_can_differ = true; + BOOST_CHECK (ref_dcp.equals (check_dcp, options, boost::bind (note, _1, _2))); } @@ -176,15 +235,15 @@ check_xml (xmlpp::Element* ref, xmlpp::Element* test, list ignore) if (find (ignore.begin(), ignore.end(), ref->get_name()) != ignore.end ()) { return; } - + xmlpp::Element::NodeList ref_children = ref->get_children (); xmlpp::Element::NodeList test_children = test->get_children (); BOOST_CHECK_EQUAL (ref_children.size (), test_children.size ()); xmlpp::Element::NodeList::iterator k = ref_children.begin (); xmlpp::Element::NodeList::iterator l = test_children.begin (); - while (k != ref_children.end () && l != test_children.end ()) { - + while (k != ref_children.end ()) { + /* XXX: should be doing xmlpp::EntityReference, xmlpp::XIncludeEnd, xmlpp::XIncludeStart */ xmlpp::Element* ref_el = dynamic_cast (*k); @@ -201,20 +260,23 @@ check_xml (xmlpp::Element* ref, xmlpp::Element* test, list ignore) BOOST_CHECK_EQUAL (ref_cn->get_content(), test_cn->get_content ()); } - xmlpp::Attribute* ref_at = dynamic_cast (*k); - xmlpp::Attribute* test_at = dynamic_cast (*l); - BOOST_CHECK ((ref_at && test_at) || (!ref_at && !test_at)); - if (ref_at && test_at) { - BOOST_CHECK_EQUAL (ref_at->get_name(), test_at->get_name ()); - BOOST_CHECK_EQUAL (ref_at->get_value(), test_at->get_value ()); - } - ++k; ++l; } - BOOST_CHECK (k == ref_children.end ()); - BOOST_CHECK (l == test_children.end ()); + xmlpp::Element::AttributeList ref_attributes = ref->get_attributes (); + xmlpp::Element::AttributeList test_attributes = test->get_attributes (); + BOOST_CHECK_EQUAL (ref_attributes.size(), test_attributes.size ()); + + xmlpp::Element::AttributeList::const_iterator m = ref_attributes.begin(); + xmlpp::Element::AttributeList::const_iterator n = test_attributes.begin(); + while (m != ref_attributes.end ()) { + BOOST_CHECK_EQUAL ((*m)->get_name(), (*n)->get_name()); + BOOST_CHECK_EQUAL ((*m)->get_value(), (*n)->get_value()); + + ++m; + ++n; + } } void @@ -228,13 +290,15 @@ check_xml (boost::filesystem::path ref, boost::filesystem::path test, listwork_to_do ()) { - ui_signaller->ui_idle (); + while (signal_manager->ui_idle ()) {} + dcpomatic_sleep (1); } + if (jm->errors ()) { int N = 0; for (list >::iterator i = jm->_jobs.begin(); i != jm->_jobs.end(); ++i) { @@ -252,16 +316,25 @@ wait_for_jobs () } } } - - BOOST_CHECK (!jm->errors()); - ui_signaller->ui_idle (); + while (signal_manager->ui_idle ()) {} + + if (jm->errors ()) { + JobManager::drop (); + return true; + } + + return false; } void write_image (shared_ptr image, boost::filesystem::path file) { - using namespace MagickCore; +#ifdef DCPOMATIC_IMAGE_MAGICK + using namespace MagickCore; +#else + using namespace MagickLib; +#endif Magick::Image m (image->size().width, image->size().height, "ARGB", CharPixel, (void *) image->data()[0]); m.write (file.string ());