#include #include #include #include #include "logger.hpp" #include "scoped_file.hpp" namespace logger::tests { using namespace logger; void testLoggerCreation() { Logger logger("test.log", LogLevel::info()); assert(logger.getFileName() == "test.log"); assert(logger.getLogLevel() == LogLevel::info()); } void testWithLogLevel() { Logger logger("test.log", LogLevel::info()); auto debugLogger = logger.withLogLevel(LogLevel::debug()); assert(logger.getLogLevel() == LogLevel::info()); assert(debugLogger.getLogLevel() == LogLevel::debug()); assert(debugLogger.getFileName() == "test.log"); } void testWithFileName() { Logger logger("old.log", LogLevel::info()); auto newLogger = logger.withFileName("new.log"); assert(logger.getFileName() == "old.log"); assert(newLogger.getFileName() == "new.log"); assert(newLogger.getLogLevel() == LogLevel::info()); } void testWriteLogSuccess() { helpers::ScopedFile file("logger_test.log"); file.throwIfExists(); Logger logger(file.getFileName(), LogLevel::info()); auto result = logger.writeMessage(LogLevel::info(), "Application started"); assert(result.isSuccess()); assert(result.getValue()); std::ifstream input(file.getFileName()); assert(input.is_open()); std::string content; std::getline(input, content); assert(content.find("Application started") != std::string::npos); } void testWriteLogFailure() { helpers::ScopedFile file("logger_test_directory"); file.throwIfExists(); std::filesystem::create_directory(file.getFileName()); Logger logger(file.getFileName(), LogLevel::info()); auto result = logger.writeMessage(LogLevel::info(), "message"); assert(result.isFailure()); assert(!result.getError().empty()); std::filesystem::remove(file.getFileName()); } void testMultipleWrites() { helpers::ScopedFile file("multiple.log"); file.throwIfExists(); Logger logger(file.getFileName(), LogLevel::info()); // NOTE: Ресурс файла был автоматически освобождён после первого вызова, // поэтому следующий вызов может повторно открыть файл для записи auto first = logger.writeMessage(LogLevel::info(), "first message"); auto second = logger.writeMessage(LogLevel::error(), "second message"); assert(first.isSuccess()); assert(second.isSuccess()); std::ifstream input(file.getFileName()); assert(input.is_open()); std::string firstLine; std::string secondLine; std::getline(input, firstLine); std::getline(input, secondLine); assert(firstLine.find("first message") != std::string::npos); assert(secondLine.find("second message") != std::string::npos); } void testIgnoreLowerLogLevel() { helpers::ScopedFile file("filter.log"); file.throwIfExists(); Logger logger(file.getFileName(), LogLevel::info()); // INFO соответствует минимальному уровню логирования, // поэтому сообщение должно быть записано в журнал auto infoResult = logger.writeMessage(LogLevel::info(), "info message"); assert(infoResult.isSuccess()); // DEBUG имеет более низкий приоритет, чем установленный уровень INFO. // Сообщение не должно попасть в журнал auto debugResult = logger.writeMessage(LogLevel::debug(), "debug message"); assert(debugResult.isSuccess()); std::ifstream input(file.getFileName()); assert(input.is_open()); std::string firstLine; std::string secondLine; std::getline(input, firstLine); assert(firstLine.find("info message") != std::string::npos); // Проверяем, что после INFO-сообщения отсутствует DEBUG-сообщение. bool hasSecondLine = static_cast(std::getline(input, secondLine)); assert(!hasSecondLine); } void testWriteMessageWithDefaultLevel() { helpers::ScopedFile file("default_level.log"); file.throwIfExists(); Logger logger(file.getFileName(), LogLevel::error()); auto result = logger.writeMessage("critical message"); assert(result.isSuccess()); std::ifstream input(file.getFileName()); assert(input.is_open()); std::string content; std::getline(input, content); assert(content.find("critical message") != std::string::npos); } void runTests() { testLoggerCreation(); testWithLogLevel(); testWithFileName(); testWriteLogSuccess(); testWriteLogFailure(); testMultipleWrites(); testIgnoreLowerLogLevel(); testWriteMessageWithDefaultLevel(); } } // namespace logger::tests int main() { logger::tests::runTests(); return 0; }