userver: userver/utest/default_logger_fixture.hpp Source File
Loading...
Searching...
No Matches
default_logger_fixture.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/utest/default_logger_fixture.hpp
4/// @brief @copybrief utest::DefaultLoggerFixture
5/// @ingroup userver_universal
6
7#include <vector>
8
9#include <userver/logging/log.hpp>
10#include <userver/utils/assert.hpp>
11
12USERVER_NAMESPACE_BEGIN
13
14namespace utest {
15
16/// @ingroup userver_utest
17///
18/// @brief Fixture that allows to set the default logger and manages its lifetime.
19///
20/// See @ref utest::LogCaptureFixture for a more high-level and simpler to use fixture.
21template <class Base>
22class DefaultLoggerFixture : public Base {
23public:
24 static void TearDownTestSuite() {
25 Base::TearDownTestSuite();
26 once_used_loggers.clear();
27 }
28
29protected:
30 /// Set the default logger and postpone its destruction till the coroutine
31 /// engine stops
32 void SetDefaultLogger(logging::LoggerPtr new_logger) {
33 UASSERT(new_logger);
34 BackUpDefaultLogger();
35 logging::impl::SetDefaultLoggerRef(*new_logger);
36
37 // Logger could be used by the ev-thread, so we postpone the
38 // destruction of logger for the lifetime of coroutine engine.
39 once_used_loggers.emplace_back(std::move(new_logger));
40 }
41
42 /// Set the default logger level
43 void SetDefaultLoggerLevel(logging::Level new_level) {
44 BackUpDefaultLogger();
45 logging::SetDefaultLoggerLevel(new_level);
46 }
47
48 ~DefaultLoggerFixture() override { RestoreDefaultLogger(); }
49
50private:
51 void BackUpDefaultLogger() {
52 if (!logger_initial_) {
53 logger_initial_ = &logging::GetDefaultLogger();
54 level_initial_ = logging::GetLoggerLevel(*logger_initial_);
55 }
56 }
57
58 void RestoreDefaultLogger() noexcept {
59 if (logger_initial_) {
60 logging::impl::SetDefaultLoggerRef(*logger_initial_);
61 logging::SetLoggerLevel(*logger_initial_, level_initial_);
62 }
63 }
64
65 logging::impl::LoggerBase* logger_initial_{nullptr};
66 logging::Level level_initial_{};
67
68 static inline std::vector<logging::LoggerPtr> once_used_loggers;
69};
70
71} // namespace utest
72
73USERVER_NAMESPACE_END