Remove dependency on unreliable tar archive

This commit is contained in:
Marcus Holland-Moritz 2023-06-28 12:50:46 +02:00
parent 480092a8da
commit 05f4ea0bb9
2 changed files with 38 additions and 15 deletions

View File

@ -290,7 +290,6 @@ endif()
if(WITH_TESTS)
find_program(DIFF_BIN diff DOC "compare files line by line" REQUIRED)
find_program(TAR_BIN tar DOC "an archiving utility" REQUIRED)
endif()
if(USE_JEMALLOC)
@ -628,7 +627,7 @@ if(WITH_TESTS)
dwarfs_tools_test
PRIVATE TEST_DATA_DIR=\"${CMAKE_SOURCE_DIR}/test\"
TOOLS_BIN_DIR=\"${CMAKE_CURRENT_BINARY_DIR}\"
DIFF_BIN=\"${DIFF_BIN}\" TAR_BIN=\"${TAR_BIN}\")
DIFF_BIN=\"${DIFF_BIN}\")
endif()
if(WITH_BENCHMARKS)

View File

@ -23,8 +23,10 @@
#include <chrono>
#include <filesystem>
#include <fstream>
#include <future>
#include <iostream>
#include <sstream>
#include <thread>
#include <tuple>
@ -43,7 +45,6 @@
#include <boost/process.hpp>
#include <folly/Conv.h>
#include <folly/FileUtil.h>
#include <folly/String.h>
#include <folly/experimental/TestUtil.h>
@ -76,7 +77,6 @@ auto dwarfsextract_bin = tools_dir / "dwarfsextract" EXE_EXT;
auto dwarfsck_bin = tools_dir / "dwarfsck" EXE_EXT;
auto diff_bin = fs::path(DIFF_BIN).make_preferred();
auto tar_bin = fs::path(TAR_BIN).make_preferred();
#ifndef _WIN32
pid_t get_dwarfs_pid(fs::path const& path) {
@ -106,6 +106,17 @@ bool wait_until_file_ready(fs::path const& path,
return true;
}
bool read_file(fs::path const& path, std::string& out) {
std::ifstream ifs(path, std::ios::binary);
if (!ifs.is_open()) {
return false;
}
std::stringstream tmp;
tmp << ifs.rdbuf();
out = tmp.str();
return true;
}
#ifdef _WIN32
struct new_process_group : public ::boost::process::detail::handler_base {
template <class WindowsExecutor>
@ -409,9 +420,9 @@ TEST(tools, everything) {
auto td = fs::path(tempdir.path().string());
auto image = td / "test.dwarfs";
auto image_hdr = td / "test_hdr.dwarfs";
auto data_dir = td / "data";
// auto data_dir = td / "data";
auto fsdata_dir = td / "fsdata";
auto header_data = data_dir / "format.sh";
auto header_data = fsdata_dir / "format.sh";
ASSERT_TRUE(fs::create_directory(fsdata_dir));
ASSERT_TRUE(subprocess::check_run(dwarfsextract_bin, "-i", test_data_dwarfs,
@ -421,8 +432,19 @@ TEST(tools, everything) {
EXPECT_TRUE(fs::is_symlink(fsdata_dir / "foobar"));
EXPECT_EQ(fs::read_symlink(fsdata_dir / "foobar"), fs::path("foo") / "bar");
ASSERT_TRUE(subprocess::check_run(tar_bin, "xf", test_data_tar, "-C", td));
ASSERT_TRUE(subprocess::check_run(diff_bin, "-qruN", data_dir, fsdata_dir));
auto unicode_symlink = fsdata_dir / u8"יוניקוד";
auto unicode_symlink_target = fs::path("unicode") / u8"我爱你"/u8"☀️ Sun"/u8"Γειά σας"/u8"مرحبًا"/u8"⚽️"/u8"Карибського";
std::string unicode_file_contents;
EXPECT_TRUE(fs::is_symlink(unicode_symlink));
EXPECT_EQ(fs::read_symlink(unicode_symlink), unicode_symlink_target);
EXPECT_TRUE(read_file(unicode_symlink, unicode_file_contents));
EXPECT_EQ(unicode_file_contents, "unicode\n");
EXPECT_TRUE(read_file(fsdata_dir / unicode_symlink_target, unicode_file_contents));
EXPECT_EQ(unicode_file_contents, "unicode\n");
// ASSERT_TRUE(subprocess::check_run(tar_bin, "xf", test_data_tar, "-C", td));
// ASSERT_TRUE(subprocess::check_run(diff_bin, "-qruN", data_dir, fsdata_dir));
ASSERT_TRUE(subprocess::check_run(mkdwarfs_bin, "-i", fsdata_dir, "-o", image,
"--no-progress"));
@ -547,7 +569,7 @@ TEST(tools, everything) {
{
std::string header;
EXPECT_TRUE(folly::readFile(header_data.string().c_str(), header));
EXPECT_TRUE(read_file(header_data, header));
auto output = subprocess::check_run(dwarfsck_bin, image_hdr, "-H");
@ -567,12 +589,14 @@ TEST(tools, everything) {
EXPECT_EQ(fs::read_symlink(extracted / "foobar"), fs::path("foo") / "bar");
ASSERT_TRUE(subprocess::check_run(diff_bin, "-qruN", fsdata_dir, extracted));
auto tarfile = td / "test.tar";
// TODO: use only a non-unicode subset?
ASSERT_TRUE(subprocess::check_run(dwarfsextract_bin, "-i", image, "-f",
"gnutar", "-o", tarfile));
// auto tarfile = td / "test.tar";
ASSERT_TRUE(fs::create_directory(untared));
ASSERT_TRUE(subprocess::check_run(tar_bin, "xf", tarfile, "-C", untared));
ASSERT_TRUE(subprocess::check_run(diff_bin, "-qruN", fsdata_dir, untared));
// ASSERT_TRUE(subprocess::check_run(dwarfsextract_bin, "-i", image, "-f",
// "gnutar", "-o", tarfile));
// ASSERT_TRUE(fs::create_directory(untared));
// ASSERT_TRUE(subprocess::check_run(tar_bin, "xf", tarfile, "-C", untared));
// ASSERT_TRUE(subprocess::check_run(diff_bin, "-qruN", fsdata_dir, untared));
}