refactor: simplify calling *_main() from tests even more

This commit is contained in:
Marcus Holland-Moritz 2023-12-28 14:17:45 +01:00
parent c5c7b633c8
commit 7b2029674d
11 changed files with 73 additions and 24 deletions

View File

@ -26,6 +26,7 @@
#include <filesystem>
#include <span>
#include <string>
#include <string_view>
#include "dwarfs/types.h"
@ -49,7 +50,10 @@ inline std::string u8string_to_string(std::u8string const& in) {
std::string sys_string_to_string(sys_string const& in);
sys_string string_to_sys_string(std::string const& in);
int call_sys_main_iolayer(std::span<char const*> args, iolayer const& iol,
int call_sys_main_iolayer(std::span<std::string_view> args, iolayer const& iol,
int (*main)(int, sys_char**, iolayer const&));
int call_sys_main_iolayer(std::span<std::string> args, iolayer const& iol,
int (*main)(int, sys_char**, iolayer const&));
size_t utf8_display_width(char const* p, size_t len);

View File

@ -23,6 +23,8 @@
#include <iosfwd>
#include <span>
#include <string>
#include <string_view>
#include "dwarfs/types.h"
@ -36,23 +38,28 @@ namespace dwarfs {
struct iolayer;
int mkdwarfs_main(std::span<char const*> args, iolayer const& iol);
int mkdwarfs_main(std::span<std::string> args, iolayer const& iol);
int mkdwarfs_main(std::span<std::string_view> args, iolayer const& iol);
int mkdwarfs_main(int argc, sys_char** argv, iolayer const& iol);
int mkdwarfs_main(int argc, sys_char** argv);
int dwarfsck_main(std::span<char const*> args, iolayer const& iol);
int dwarfsck_main(std::span<std::string> args, iolayer const& iol);
int dwarfsck_main(std::span<std::string_view> args, iolayer const& iol);
int dwarfsck_main(int argc, sys_char** argv, iolayer const& iol);
int dwarfsck_main(int argc, sys_char** argv);
int dwarfsextract_main(std::span<char const*> args, iolayer const& iol);
int dwarfsextract_main(std::span<std::string> args, iolayer const& iol);
int dwarfsextract_main(std::span<std::string_view> args, iolayer const& iol);
int dwarfsextract_main(int argc, sys_char** argv, iolayer const& iol);
int dwarfsextract_main(int argc, sys_char** argv);
int dwarfsbench_main(std::span<char const*> args, iolayer const& iol);
int dwarfsbench_main(std::span<std::string> args, iolayer const& iol);
int dwarfsbench_main(std::span<std::string_view> args, iolayer const& iol);
int dwarfsbench_main(int argc, sys_char** argv, iolayer const& iol);
int dwarfsbench_main(int argc, sys_char** argv);
int dwarfs_main(std::span<char const*> args, iolayer const& iol);
int dwarfs_main(std::span<std::string> args, iolayer const& iol);
int dwarfs_main(std::span<std::string_view> args, iolayer const& iol);
int dwarfs_main(int argc, sys_char** argv, iolayer const& iol);
int dwarfs_main(int argc, sys_char** argv);

View File

@ -47,6 +47,21 @@ inline std::string trimmed(std::string in) {
}
return in;
}
template <typename T>
int call_sys_main_iolayer_impl(std::span<T> args, iolayer const& iol,
int (*main)(int, sys_char**, iolayer const&)) {
std::vector<sys_string> argv;
std::vector<sys_char*> argv_ptrs;
argv.reserve(args.size());
argv_ptrs.reserve(args.size());
for (auto const& arg : args) {
argv.emplace_back(string_to_sys_string(std::string(arg)));
argv_ptrs.emplace_back(argv.back().data());
}
return main(argv_ptrs.size(), argv_ptrs.data(), iol);
}
} // namespace
std::string size_with_unit(size_t size) {
@ -148,17 +163,14 @@ sys_string string_to_sys_string(std::string const& in) {
#endif
}
int call_sys_main_iolayer(std::span<char const*> args, iolayer const& iol,
int call_sys_main_iolayer(std::span<std::string_view> args, iolayer const& iol,
int (*main)(int, sys_char**, iolayer const&)) {
std::vector<sys_string> argv;
std::vector<sys_char*> argv_ptrs;
argv.reserve(args.size());
argv_ptrs.reserve(args.size());
for (auto const& arg : args) {
argv.emplace_back(string_to_sys_string(arg));
argv_ptrs.emplace_back(argv.back().data());
}
return main(argv_ptrs.size(), argv_ptrs.data(), iol);
return call_sys_main_iolayer_impl(args, iol, main);
}
int call_sys_main_iolayer(std::span<std::string> args, iolayer const& iol,
int (*main)(int, sys_char**, iolayer const&)) {
return call_sys_main_iolayer_impl(args, iol, main);
}
size_t utf8_display_width(char const* p, size_t len) {

View File

@ -1389,7 +1389,11 @@ int dwarfs_main(int argc, sys_char** argv) {
return dwarfs_main(argc, argv, iolayer::system_default());
}
int dwarfs_main(std::span<char const*> args, iolayer const& iol) {
int dwarfs_main(std::span<std::string> args, iolayer const& iol) {
return call_sys_main_iolayer(args, iol, dwarfs_main);
}
int dwarfs_main(std::span<std::string_view> args, iolayer const& iol) {
return call_sys_main_iolayer(args, iol, dwarfs_main);
}

View File

@ -141,7 +141,11 @@ int dwarfsbench_main(int argc, sys_char** argv) {
return dwarfsbench_main(argc, argv, iolayer::system_default());
}
int dwarfsbench_main(std::span<char const*> args, iolayer const& iol) {
int dwarfsbench_main(std::span<std::string> args, iolayer const& iol) {
return call_sys_main_iolayer(args, iol, dwarfsbench_main);
}
int dwarfsbench_main(std::span<std::string_view> args, iolayer const& iol) {
return call_sys_main_iolayer(args, iol, dwarfsbench_main);
}

View File

@ -208,7 +208,11 @@ int dwarfsck_main(int argc, sys_char** argv) {
return dwarfsck_main(argc, argv, iolayer::system_default());
}
int dwarfsck_main(std::span<char const*> args, iolayer const& iol) {
int dwarfsck_main(std::span<std::string> args, iolayer const& iol) {
return call_sys_main_iolayer(args, iol, dwarfsck_main);
}
int dwarfsck_main(std::span<std::string_view> args, iolayer const& iol) {
return call_sys_main_iolayer(args, iol, dwarfsck_main);
}

View File

@ -201,7 +201,11 @@ int dwarfsextract_main(int argc, sys_char** argv) {
return dwarfsextract_main(argc, argv, iolayer::system_default());
}
int dwarfsextract_main(std::span<char const*> args, iolayer const& iol) {
int dwarfsextract_main(std::span<std::string> args, iolayer const& iol) {
return call_sys_main_iolayer(args, iol, dwarfsextract_main);
}
int dwarfsextract_main(std::span<std::string_view> args, iolayer const& iol) {
return call_sys_main_iolayer(args, iol, dwarfsextract_main);
}

View File

@ -1289,7 +1289,11 @@ int mkdwarfs_main(int argc, sys_char** argv) {
return mkdwarfs_main(argc, argv, iolayer::system_default());
}
int mkdwarfs_main(std::span<char const*> args, iolayer const& iol) {
int mkdwarfs_main(std::span<std::string> args, iolayer const& iol) {
return call_sys_main_iolayer(args, iol, mkdwarfs_main);
}
int mkdwarfs_main(std::span<std::string_view> args, iolayer const& iol) {
return call_sys_main_iolayer(args, iol, mkdwarfs_main);
}

View File

@ -57,9 +57,7 @@ TEST_P(categorizer_test, end_to_end) {
test::test_iolayer iolayer(input);
std::vector<char const*> args{"mkdwarfs", "-i", "/",
"-o", "-", "--categorize"};
auto args = test::parse_args("mkdwarfs -i / -o - --categorize");
auto exit_code = mkdwarfs_main(args, iolayer.get());
EXPECT_EQ(exit_code, 0);

View File

@ -469,5 +469,11 @@ std::optional<fs::path> find_binary(std::string_view name) {
return std::nullopt;
}
std::vector<std::string> parse_args(std::string_view args) {
std::vector<std::string> rv;
folly::split(' ', args, rv);
return rv;
}
} // namespace test
} // namespace dwarfs

View File

@ -183,4 +183,6 @@ std::optional<std::filesystem::path> find_binary(std::string_view name);
std::span<std::pair<simplestat, std::string_view> const> test_dirtree();
std::vector<std::string> parse_args(std::string_view args);
} // namespace dwarfs::test