You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
spdlog/tests/test_io_errors.cpp

117 lines
3.5 KiB
C++

/*
* This content is released under the MIT License as specified in https://raw.githubusercontent.com/gabime/spdlog/master/LICENSE
*/
#include "includes.h"
#include "spdlog/sinks/stdout_sinks.h"
#include "spdlog/sinks/stdout_color_sinks.h"
#ifdef SPDLOG_NO_EXCEPTIONS
#error
#endif
#define TEST_FILENAME "test_logs/file_helper_test.txt"
using spdlog::details::file_helper;
using Catch::Matchers::Contains;
static int mocked_fwrite_errno;
extern "C" int __real_fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream);
extern "C" int __wrap_fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream)
{
if (mocked_fwrite_errno)
{
errno = mocked_fwrite_errno;
mocked_fwrite_errno = 0;
return 0;
}
return __real_fwrite(ptr, size, nmemb, stream);
}
static int mocked_fflush_errno;
extern "C" int __real_fflush(FILE *stream);
extern "C" int __wrap_fflush(FILE *stream)
{
if (mocked_fflush_errno)
{
errno = mocked_fflush_errno;
mocked_fflush_errno = 0;
return EOF;
}
return __real_fflush(stream);
}
TEST_CASE("file_helper_write_error", "[file_helper::write()]]")
{
spdlog::memory_buf_t buffer;
fmt::format_to(buffer, "not empty");
prepare_logdir();
file_helper helper;
helper.open(SPDLOG_FILENAME_T(TEST_FILENAME));
mocked_fwrite_errno = EIO;
CHECK_THROWS(helper.write(buffer));
mocked_fwrite_errno = 0;
}
TEST_CASE("file_helper_flush_error", "[file_helper::flush()]]")
{
prepare_logdir();
file_helper helper;
helper.open(SPDLOG_FILENAME_T(TEST_FILENAME));
mocked_fflush_errno = EIO;
CHECK_THROWS(helper.flush());
mocked_fflush_errno = 0;
}
TEST_CASE("stdout_st_flush_error", "[stdout]")
{
auto last_error_msg = std::string{};
auto l = spdlog::stdout_logger_st("test");
l->set_error_handler([&](const std::string &msg) { last_error_msg = msg; });
l->set_pattern("%+");
mocked_fflush_errno = EIO;
l->info("Test stdout_st fflush error");
mocked_fflush_errno = 0;
spdlog::drop_all();
REQUIRE_THAT(last_error_msg, Contains("flush"));
REQUIRE_THAT(last_error_msg, Contains("base"));
}
TEST_CASE("stderr_st_write_error", "[stdout]")
{
auto last_error_msg = std::string{};
auto l = spdlog::stderr_logger_mt("test");
l->set_error_handler([&](const std::string &msg) { last_error_msg = msg; });
mocked_fwrite_errno = EIO;
l->info("Test stderr_mt fwrite error");
mocked_fwrite_errno = 0;
spdlog::drop_all();
REQUIRE_THAT(last_error_msg, Contains("write"));
REQUIRE_THAT(last_error_msg, Contains("base"));
}
TEST_CASE("stdout_color_mt_flush_error", "[stdout]")
{
auto last_error_msg = std::string{};
auto l = spdlog::stdout_color_mt("test");
l->set_error_handler([&](const std::string &msg) { last_error_msg = msg; });
l->set_pattern("%+");
mocked_fflush_errno = EIO;
l->info("Test stdout_color_mt fflush error");
mocked_fflush_errno = 0;
spdlog::drop_all();
REQUIRE_THAT(last_error_msg, Contains("flush"));
REQUIRE_THAT(last_error_msg, Contains("ansi"));
}
TEST_CASE("stderr_color_st_write_error", "[stdout]")
{
auto last_error_msg = std::string{};
auto l = spdlog::stderr_color_st("test");
l->set_error_handler([&](const std::string &msg) { last_error_msg = msg; });
mocked_fwrite_errno = EIO;
l->info("Test stderr_color_st fwrite error");
mocked_fwrite_errno = 0;
spdlog::drop_all();
REQUIRE_THAT(last_error_msg, Contains("write"));
REQUIRE_THAT(last_error_msg, Contains("ansi"));
}