From 81f2aee77e00dd46754f50d91c1e4a9e94441615 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 2 Dec 2020 00:41:03 +0100 Subject: [PATCH 1/1] Add basic unit test for the disk writer code. --- test/disk_writer_test.cc | 126 +++++++++++++++++++++++++++++++++++++++ test/wscript | 4 ++ 2 files changed, 130 insertions(+) create mode 100644 test/disk_writer_test.cc diff --git a/test/disk_writer_test.cc b/test/disk_writer_test.cc new file mode 100644 index 000000000..37c8f42d5 --- /dev/null +++ b/test/disk_writer_test.cc @@ -0,0 +1,126 @@ +/* + Copyright (C) 2020 Carl Hetherington + + 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. + + 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 DCP-o-matic. If not, see . + +*/ + + +#include "lib/cross.h" +#include "lib/ext.h" +#include "test.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +using std::future; +using std::string; +using std::vector; + + +static +void +create_empty (boost::filesystem::path file, int size) +{ + auto fd = open (file.string().c_str(), O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); + BOOST_REQUIRE (fd != -1); + auto const r = posix_fallocate (fd, 0, size); + BOOST_REQUIRE_EQUAL (r, 0); + close (fd); +} + + +vector +ext2_ls (string path) +{ + using namespace boost::process; + + boost::asio::io_service ios; + future data; + /* e2ls is from 'e2tools */ + child ch (search_path("e2ls"), path, std_in.close(), std_out > data, ios); + ios.run(); + + auto output = data.get(); + boost::trim (output); + vector parts; + boost::split (parts, output, boost::is_any_of("\t "), boost::token_compress_on); + return parts; +} + + +/** Use the writer code to make a disk and partition and copy a file to it, then check + * that the partition has inode size 128 and that the file can be copied back off using + * e2tools. + */ +BOOST_AUTO_TEST_CASE (disk_writer_test1) +{ + using namespace boost::filesystem; + using namespace boost::process; + + remove_all ("build/test/disk_writer_test1.disk"); + remove_all ("build/test/disk_writer_test1.partition"); + remove_all ("build/test/disk_writer_test1"); + + path disk = "build/test/disk_writer_test1.disk"; + path partition = "build/test/disk_writer_test1.partition"; + + /* lwext4 has a lower limit of correct ext2 partition sizes it can make; 32Mb + * does not work here: fsck gives errors about an incorrect free blocks count. + */ + create_empty (disk, 256 * 1024 * 1024); + create_empty (partition, 256 * 1024 * 1024); + + path dcp = "build/test/disk_writer_test1"; + create_directory (dcp); + /* Some arbitrary file size here */ + make_random_file (dcp / "foo", 1024 * 1024 * 32 - 6128); + + PrivilegeEscalator::test = true; + dcpomatic::write (dcp, disk.string(), partition.string(), 0); + + BOOST_CHECK_EQUAL (system("/sbin/e2fsck -fn build/test/disk_writer_test1.partition"), 0); + + { + boost::asio::io_service ios; + future data; + child ch ("/sbin/tune2fs", args({"-l", partition.string()}), std_in.close(), std_out > data, ios); + ios.run(); + + string output = data.get(); + std::smatch matches; + std::regex reg("Inode size:\\s*(.*)"); + BOOST_REQUIRE (std::regex_search(output, matches, reg)); + BOOST_REQUIRE (matches.size() == 2); + BOOST_CHECK_EQUAL (matches[1].str(), "128"); + } + + BOOST_CHECK (ext2_ls(partition.string()) == vector({"disk_writer_test1", "lost+found"})); + BOOST_CHECK (ext2_ls(partition.string() + ":disk_writer_test1") == vector({"foo"})); + + system ("e2cp " + partition.string() + ":disk_writer_test1/foo build/test/disk_writer_test1_foo_back"); + check_file ("build/test/disk_writer_test1/foo", "build/test/disk_writer_test1_foo_back"); +} + diff --git a/test/wscript b/test/wscript index 9037b6227..cf0e8e6e3 100644 --- a/test/wscript +++ b/test/wscript @@ -138,6 +138,10 @@ def build(bld): zipper_test.cc """ + if bld.env.TARGET_LINUX and bld.env.ENABLE_DISK: + obj.source += " disk_writer_test.cc" + obj.uselib += "LWEXT4 NANOMSG " + # Some difference in font rendering between the test machine and others... # burnt_subtitle_test.cc # This one doesn't check anything -- 2.30.2