252 lines
9.7 KiB
C++
252 lines
9.7 KiB
C++
|
#include "logging.hh"
|
||
|
#include "nixexpr.hh"
|
||
|
#include "util.hh"
|
||
|
|
||
|
#include <gtest/gtest.h>
|
||
|
|
||
|
namespace nix {
|
||
|
|
||
|
/* ----------------------------------------------------------------------------
|
||
|
* logEI
|
||
|
* --------------------------------------------------------------------------*/
|
||
|
|
||
|
TEST(logEI, catpuresBasicProperties) {
|
||
|
|
||
|
MakeError(TestError, Error);
|
||
|
ErrorInfo::programName = std::optional("error-unit-test");
|
||
|
|
||
|
try {
|
||
|
throw TestError("an error for testing purposes");
|
||
|
} catch (Error &e) {
|
||
|
testing::internal::CaptureStderr();
|
||
|
logger->logEI(e.info());
|
||
|
auto str = testing::internal::GetCapturedStderr();
|
||
|
|
||
|
ASSERT_STREQ(str.c_str(),"\x1B[31;1merror:\x1B[0m\x1B[34;1m --- TestError ------------------------------------ error-unit-test\x1B[0m\nan error for testing purposes\n");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
TEST(logEI, appendingHintsToPreviousError) {
|
||
|
|
||
|
MakeError(TestError, Error);
|
||
|
ErrorInfo::programName = std::optional("error-unit-test");
|
||
|
|
||
|
try {
|
||
|
auto e = Error("initial error");
|
||
|
throw TestError(e.info());
|
||
|
} catch (Error &e) {
|
||
|
ErrorInfo ei = e.info();
|
||
|
ei.hint = hintfmt("%s; subsequent error message.", normaltxt(e.info().hint ? e.info().hint->str() : ""));
|
||
|
|
||
|
testing::internal::CaptureStderr();
|
||
|
logger->logEI(ei);
|
||
|
auto str = testing::internal::GetCapturedStderr();
|
||
|
|
||
|
ASSERT_STREQ(str.c_str(), "\x1B[31;1merror:\x1B[0m\x1B[34;1m --- TestError ------------------------------------ error-unit-test\x1B[0m\n\x1B[33;1m\x1B[0minitial error\x1B[0m; subsequent error message.\n");
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
TEST(logEI, picksUpSysErrorExitCode) {
|
||
|
|
||
|
MakeError(TestError, Error);
|
||
|
ErrorInfo::programName = std::optional("error-unit-test");
|
||
|
|
||
|
try {
|
||
|
auto x = readFile(-1);
|
||
|
}
|
||
|
catch (SysError &e) {
|
||
|
testing::internal::CaptureStderr();
|
||
|
logError(e.info());
|
||
|
auto str = testing::internal::GetCapturedStderr();
|
||
|
|
||
|
ASSERT_STREQ(str.c_str(), "\x1B[31;1merror:\x1B[0m\x1B[34;1m --- SysError ------------------------------------- error-unit-test\x1B[0m\n\x1B[33;1m\x1B[0mstatting file\x1B[0m: \x1B[33;1mBad file descriptor\x1B[0m\n");
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
TEST(logEI, loggingErrorOnInfoLevel) {
|
||
|
testing::internal::CaptureStderr();
|
||
|
|
||
|
logger->logEI({ .level = lvlInfo,
|
||
|
.name = "Info name",
|
||
|
.description = "Info description",
|
||
|
});
|
||
|
|
||
|
auto str = testing::internal::GetCapturedStderr();
|
||
|
ASSERT_STREQ(str.c_str(), "\x1B[32;1minfo:\x1B[0m\x1B[34;1m --- Info name ------------------------------------- error-unit-test\x1B[0m\nInfo description\n");
|
||
|
}
|
||
|
|
||
|
TEST(logEI, loggingErrorOnTalkativeLevel) {
|
||
|
testing::internal::CaptureStderr();
|
||
|
|
||
|
logger->logEI({ .level = lvlTalkative,
|
||
|
.name = "Talkative name",
|
||
|
.description = "Talkative description",
|
||
|
});
|
||
|
|
||
|
auto str = testing::internal::GetCapturedStderr();
|
||
|
// XXX: why is this the empty string?
|
||
|
ASSERT_STREQ(str.c_str(), "");
|
||
|
}
|
||
|
|
||
|
TEST(logEI, loggingErrorOnChattyLevel) {
|
||
|
testing::internal::CaptureStderr();
|
||
|
|
||
|
logger->logEI({ .level = lvlChatty,
|
||
|
.name = "Chatty name",
|
||
|
.description = "Talkative description",
|
||
|
});
|
||
|
|
||
|
auto str = testing::internal::GetCapturedStderr();
|
||
|
// XXX: why is this the empty string?
|
||
|
ASSERT_STREQ(str.c_str(), "");
|
||
|
}
|
||
|
|
||
|
TEST(logEI, loggingErrorOnDebugLevel) {
|
||
|
testing::internal::CaptureStderr();
|
||
|
|
||
|
logger->logEI({ .level = lvlDebug,
|
||
|
.name = "Debug name",
|
||
|
.description = "Debug description",
|
||
|
});
|
||
|
|
||
|
auto str = testing::internal::GetCapturedStderr();
|
||
|
// XXX: why is this the empty string?
|
||
|
ASSERT_STREQ(str.c_str(), "");
|
||
|
}
|
||
|
|
||
|
TEST(logEI, loggingErrorOnVomitLevel) {
|
||
|
testing::internal::CaptureStderr();
|
||
|
|
||
|
logger->logEI({ .level = lvlVomit,
|
||
|
.name = "Vomit name",
|
||
|
.description = "Vomit description",
|
||
|
});
|
||
|
|
||
|
auto str = testing::internal::GetCapturedStderr();
|
||
|
// XXX: why is this the empty string?
|
||
|
ASSERT_STREQ(str.c_str(), "");
|
||
|
}
|
||
|
|
||
|
/* ----------------------------------------------------------------------------
|
||
|
* logError
|
||
|
* --------------------------------------------------------------------------*/
|
||
|
|
||
|
|
||
|
TEST(logError, logErrorWithoutHintOrCode) {
|
||
|
testing::internal::CaptureStderr();
|
||
|
|
||
|
logError({
|
||
|
.name = "name",
|
||
|
.description = "error description",
|
||
|
});
|
||
|
|
||
|
auto str = testing::internal::GetCapturedStderr();
|
||
|
ASSERT_STREQ(str.c_str(), "\x1B[31;1merror:\x1B[0m\x1B[34;1m --- name ----------------------------------------- error-unit-test\x1B[0m\nerror description\n");
|
||
|
}
|
||
|
|
||
|
TEST(logError, logErrorWithPreviousAndNextLinesOfCode) {
|
||
|
SymbolTable testTable;
|
||
|
auto problem_file = testTable.create("myfile.nix");
|
||
|
|
||
|
testing::internal::CaptureStderr();
|
||
|
|
||
|
logError({
|
||
|
.name = "error name",
|
||
|
.description = "error with code lines",
|
||
|
.hint = hintfmt("this hint has %1% templated %2%!!",
|
||
|
"yellow",
|
||
|
"values"),
|
||
|
.nixCode = NixCode {
|
||
|
.errPos = Pos(problem_file, 40, 13),
|
||
|
.prevLineOfCode = "previous line of code",
|
||
|
.errLineOfCode = "this is the problem line of code",
|
||
|
.nextLineOfCode = "next line of code",
|
||
|
}});
|
||
|
|
||
|
|
||
|
auto str = testing::internal::GetCapturedStderr();
|
||
|
ASSERT_STREQ(str.c_str(), "\x1B[31;1merror:\x1B[0m\x1B[34;1m --- error name ----------------------------------- error-unit-test\x1B[0m\nin file: \x1B[34;1mmyfile.nix (40:13)\x1B[0m\n\nerror with code lines\n\n 39| previous line of code\n 40| this is the problem line of code\n | \x1B[31;1m^\x1B[0m\n 41| next line of code\n\nthis hint has \x1B[33;1myellow\x1B[0m templated \x1B[33;1mvalues\x1B[0m!!\n");
|
||
|
}
|
||
|
|
||
|
TEST(logError, logErrorWithoutLinesOfCode) {
|
||
|
SymbolTable testTable;
|
||
|
auto problem_file = testTable.create("myfile.nix");
|
||
|
testing::internal::CaptureStderr();
|
||
|
|
||
|
logError({
|
||
|
.name = "error name",
|
||
|
.description = "error without any code lines.",
|
||
|
.hint = hintfmt("this hint has %1% templated %2%!!",
|
||
|
"yellow",
|
||
|
"values"),
|
||
|
.nixCode = NixCode {
|
||
|
.errPos = Pos(problem_file, 40, 13)
|
||
|
}});
|
||
|
|
||
|
auto str = testing::internal::GetCapturedStderr();
|
||
|
ASSERT_STREQ(str.c_str(), "\x1B[31;1merror:\x1B[0m\x1B[34;1m --- error name ----------------------------------- error-unit-test\x1B[0m\nin file: \x1B[34;1mmyfile.nix (40:13)\x1B[0m\n\nerror without any code lines.\n\nthis hint has \x1B[33;1myellow\x1B[0m templated \x1B[33;1mvalues\x1B[0m!!\n");
|
||
|
}
|
||
|
|
||
|
TEST(logError, logErrorWithOnlyHintAndName) {
|
||
|
SymbolTable testTable;
|
||
|
auto problem_file = testTable.create("myfile.nix");
|
||
|
testing::internal::CaptureStderr();
|
||
|
|
||
|
logError({
|
||
|
.name = "error name",
|
||
|
.hint = hintfmt("hint %1%", "only"),
|
||
|
.nixCode = NixCode {
|
||
|
.errPos = Pos(problem_file, 40, 13)
|
||
|
}});
|
||
|
|
||
|
auto str = testing::internal::GetCapturedStderr();
|
||
|
ASSERT_STREQ(str.c_str(), "\x1B[31;1merror:\x1B[0m\x1B[34;1m --- error name ----------------------------------- error-unit-test\x1B[0m\nin file: \x1B[34;1mmyfile.nix (40:13)\x1B[0m\n\nhint \x1B[33;1monly\x1B[0m\n");
|
||
|
|
||
|
}
|
||
|
|
||
|
/* ----------------------------------------------------------------------------
|
||
|
* logWarning
|
||
|
* --------------------------------------------------------------------------*/
|
||
|
|
||
|
TEST(logWarning, logWarningWithNameDescriptionAndHint) {
|
||
|
testing::internal::CaptureStderr();
|
||
|
|
||
|
logWarning({
|
||
|
.name = "name",
|
||
|
.description = "error description",
|
||
|
.hint = hintfmt("there was a %1%", "warning"),
|
||
|
});
|
||
|
|
||
|
auto str = testing::internal::GetCapturedStderr();
|
||
|
ASSERT_STREQ(str.c_str(), "\x1B[33;1mwarning:\x1B[0m\x1B[34;1m --- name --------------------------------------- error-unit-test\x1B[0m\nerror description\n\nthere was a \x1B[33;1mwarning\x1B[0m\n");
|
||
|
}
|
||
|
|
||
|
TEST(logWarning, logWarningWithFileLineNumAndCode) {
|
||
|
|
||
|
SymbolTable testTable;
|
||
|
auto problem_file = testTable.create("myfile.nix");
|
||
|
|
||
|
testing::internal::CaptureStderr();
|
||
|
|
||
|
logWarning({
|
||
|
.name = "warning name",
|
||
|
.description = "warning description",
|
||
|
.hint = hintfmt("this hint has %1% templated %2%!!",
|
||
|
"yellow",
|
||
|
"values"),
|
||
|
.nixCode = NixCode {
|
||
|
.errPos = Pos(problem_file, 40, 13),
|
||
|
.prevLineOfCode = std::nullopt,
|
||
|
.errLineOfCode = "this is the problem line of code",
|
||
|
.nextLineOfCode = std::nullopt
|
||
|
}});
|
||
|
|
||
|
|
||
|
auto str = testing::internal::GetCapturedStderr();
|
||
|
ASSERT_STREQ(str.c_str(), "\x1B[33;1mwarning:\x1B[0m\x1B[34;1m --- warning name ------------------------------- error-unit-test\x1B[0m\nin file: \x1B[34;1mmyfile.nix (40:13)\x1B[0m\n\nwarning description\n\n 40| this is the problem line of code\n | \x1B[31;1m^\x1B[0m\n\nthis hint has \x1B[33;1myellow\x1B[0m templated \x1B[33;1mvalues\x1B[0m!!\n");
|
||
|
}
|
||
|
|
||
|
}
|