/*
- Copyright (C) 2012-2020 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-2021 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
*/
+
+
/** @file test/test.cc
* @brief Overall test stuff and useful methods for tests.
*/
+
#include "lib/compose.hpp"
#include "lib/config.h"
#include "lib/cross.h"
#include <list>
#include <vector>
+
using std::abs;
using std::cerr;
using std::cout;
Config::instance()->set_master_encoding_threads (boost::thread::hardware_concurrency());
Config::instance()->set_server_encoding_threads (1);
Config::instance()->set_server_port_base (61921);
- Config::instance()->set_default_isdcf_metadata (ISDCFMetadata ());
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_still_length (10);
Config::instance()->set_log_types (
LogEntry::TYPE_GENERAL | LogEntry::TYPE_WARNING |
- LogEntry::TYPE_ERROR | LogEntry::TYPE_DEBUG_THREE_D |
- LogEntry::TYPE_DEBUG_ENCODE | LogEntry::TYPE_DEBUG_PLAYER |
- LogEntry::TYPE_DISK
+ LogEntry::TYPE_ERROR | LogEntry::TYPE_DISK
);
Config::instance()->set_automatic_audio_analysis (false);
+ auto signer = make_shared<dcp::CertificateChain>(dcp::file_to_string("test/data/signer_chain"));
+ signer->set_key(dcp::file_to_string("test/data/signer_key"));
+ Config::instance()->set_signer_chain (signer);
+ auto decryption = make_shared<dcp::CertificateChain>(dcp::file_to_string("test/data/decryption_chain"));
+ decryption->set_key(dcp::file_to_string("test/data/decryption_key"));
+ Config::instance()->set_decryption_chain (decryption);
}
+
class TestSignalManager : public SignalManager
{
public:
}
};
+
BOOST_GLOBAL_FIXTURE (TestConfig);
+
boost::filesystem::path
test_film_dir (string name)
{
return p;
}
+
shared_ptr<Film>
new_test_film (string name)
{
return film;
}
+
shared_ptr<Film>
-new_test_film2 (string name, Cleanup* cleanup)
+new_test_film2 (string name, vector<shared_ptr<Content>> content, Cleanup* cleanup)
{
auto p = test_film_dir (name);
if (boost::filesystem::exists (p)) {
film->set_dcp_content_type (DCPContentType::from_isdcf_name ("TST"));
film->set_container (Ratio::from_id ("185"));
film->write_metadata ();
+
+ for (auto i: content) {
+ film->examine_and_add_content (i);
+ BOOST_REQUIRE (!wait_for_jobs());
+ }
+
return film;
}
+
void
check_wav_file (boost::filesystem::path ref, boost::filesystem::path check)
{
}
}
+
void
check_mxf_audio_file (boost::filesystem::path ref, boost::filesystem::path check)
{
double
rms_error (boost::filesystem::path ref, boost::filesystem::path check)
{
- FFmpegImageProxy ref_proxy (ref, VideoRange::FULL);
- auto ref_image = ref_proxy.image().image;
- FFmpegImageProxy check_proxy (check, VideoRange::FULL);
- auto check_image = check_proxy.image().image;
+ FFmpegImageProxy ref_proxy (ref);
+ auto ref_image = ref_proxy.image(Image::Alignment::COMPACT).image;
+ FFmpegImageProxy check_proxy (check);
+ auto check_image = check_proxy.image(Image::Alignment::COMPACT).image;
BOOST_REQUIRE_EQUAL (ref_image->pixel_format(), check_image->pixel_format());
AVPixelFormat const format = ref_image->pixel_format();
fclose (check_file);
}
+
+void
+check_text_file (boost::filesystem::path ref, boost::filesystem::path check)
+{
+ auto ref_file = fopen_boost (ref, "r");
+ BOOST_CHECK (ref_file);
+ auto check_file = fopen_boost (check, "r");
+ BOOST_CHECK (check_file);
+
+ int const buffer_size = std::max(
+ boost::filesystem::file_size(ref),
+ boost::filesystem::file_size(check)
+ );
+
+ DCPOMATIC_ASSERT (buffer_size < 1024 * 1024);
+
+ auto ref_buffer = new uint8_t[buffer_size];
+ auto ref_read = fread(ref_buffer, 1, buffer_size, ref_file);
+ auto check_buffer = new uint8_t[buffer_size];
+ auto check_read = fread(check_buffer, 1, buffer_size, check_file);
+ BOOST_CHECK_EQUAL (ref_read, check_read);
+
+ string const error = "File " + check.string() + " differs from reference " + ref.string();
+ BOOST_CHECK_MESSAGE(memcmp(ref_buffer, check_buffer, ref_read) == 0, error);
+
+ delete[] ref_buffer;
+ delete[] check_buffer;
+
+ fclose (ref_file);
+ fclose (check_file);
+}
+
+
static void
note (dcp::NoteType t, string n)
{
boost::filesystem::remove_all (i, ec);
}
}
+
+
+void stage (string, boost::optional<boost::filesystem::path>) {}
+void progress (float) {}
+
+
+void
+make_and_verify_dcp (shared_ptr<Film> film, vector<dcp::VerificationNote::Code> ignore)
+{
+ film->write_metadata ();
+ film->make_dcp ();
+ BOOST_REQUIRE (!wait_for_jobs());
+ 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()) {
+ std::cout << "\t" << dcp::note_to_string(i) << "\n";
+ ok = false;
+ }
+ }
+ BOOST_CHECK(ok);
+}
+
+
+void
+check_int_close (int a, int b, int d)
+{
+ BOOST_CHECK_MESSAGE (std::abs(a - b) < d, a << " differs from " << b << " by more than " << d);
+}
+
+
+void
+check_int_close (std::pair<int, int> a, std::pair<int, int> b, int d)
+{
+ check_int_close (a.first, b.first, d);
+ check_int_close (a.second, b.second, d);
+}