• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

realm / realm-core / github_pull_request_278228

04 Oct 2023 10:15PM UTC coverage: 91.582% (+0.007%) from 91.575%
github_pull_request_278228

Pull #7029

Evergreen

tgoyne
Use UNITTEST_LOG_LEVEL in objectstore tests

For historical reasons core and sync tests use the UNITTEST_LOG_LEVEL
environment variable to determine the test log level, while object store tests
used a build time setting. This brings them into alignment on using the env
variable, and applies it via setting the default log level on startup in a
single place.
Pull Request #7029: Use UNITTEST_LOG_LEVEL in objectstore tests

94218 of 173442 branches covered (0.0%)

46 of 54 new or added lines in 5 files covered. (85.19%)

51 existing lines in 12 files now uncovered.

230351 of 251523 relevant lines covered (91.58%)

6704577.96 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

87.93
/src/realm/util/logger.cpp
1
/*************************************************************************
2
 *
3
 * Copyright 2016 Realm Inc.
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at
8
 *
9
 * http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 *
17
 **************************************************************************/
18

19
#include <realm/util/logger.hpp>
20

21
#include <iostream>
22
#include <mutex>
23

24
namespace realm::util {
25

26
namespace {
27
auto& s_logger_mutex = *new std::mutex;
28
std::shared_ptr<util::Logger> s_default_logger;
29
std::atomic<Logger::Level> s_default_level = Logger::Level::info;
30
} // anonymous namespace
31

32
void Logger::set_default_logger(std::shared_ptr<util::Logger> logger) noexcept
33
{
36✔
34
    std::lock_guard lock(s_logger_mutex);
36✔
35
    s_default_logger = logger;
36✔
36
}
36✔
37

38
std::shared_ptr<util::Logger>& Logger::get_default_logger() noexcept
39
{
185,037✔
40
    std::lock_guard lock(s_logger_mutex);
185,037✔
41
    if (!s_default_logger) {
185,037✔
42
        s_default_logger = std::make_shared<StderrLogger>();
6✔
43
        s_default_logger->set_level_threshold(s_default_level);
6✔
44
    }
6✔
45

91,317✔
46
    return s_default_logger;
185,037✔
47
}
185,037✔
48

49
void Logger::set_default_level_threshold(Level level) noexcept
50
{
24✔
51
    std::lock_guard lock(s_logger_mutex);
24✔
52
    s_default_level = level;
24✔
53
    if (s_default_logger)
24✔
54
        s_default_logger->set_level_threshold(level);
18✔
55
}
24✔
56

57
Logger::Level Logger::get_default_level_threshold() noexcept
58
{
510✔
59
    return s_default_level.load(std::memory_order_relaxed);
510✔
60
}
510✔
61

62
const char* Logger::get_level_prefix(Level level) noexcept
63
{
847,194✔
64
    switch (level) {
847,194✔
65
        case Level::off:
✔
66
            [[fallthrough]];
×
67
        case Level::all:
✔
68
            [[fallthrough]];
×
69
        case Level::trace:
90,114✔
70
            [[fallthrough]];
90,114✔
71
        case Level::debug:
442,491✔
72
            [[fallthrough]];
442,491✔
73
        case Level::detail:
548,070✔
74
            [[fallthrough]];
548,070✔
75
        case Level::info:
824,781✔
76
            break;
824,781✔
77
        case Level::warn:
490,005✔
78
            return "WARNING: ";
22,194✔
79
        case Level::error:
478,938✔
80
            return "ERROR: ";
267✔
81
        case Level::fatal:
478,911✔
82
            return "FATAL: ";
×
83
    }
824,724✔
84
    return "";
824,724✔
85
}
824,724✔
86

87
std::string_view Logger::level_to_string(Level level) noexcept
88
{
21,339✔
89
    switch (level) {
21,339✔
90
        case Logger::Level::all:
6✔
91
            return "all";
6✔
92
        case Logger::Level::trace:
6✔
93
            return "trace";
6✔
94
        case Logger::Level::debug:
6,555✔
95
            return "debug";
6,555✔
96
        case Logger::Level::detail:
6✔
97
            return "detail";
6✔
98
        case Logger::Level::info:
13,551✔
99
            return "info";
13,551✔
100
        case Logger::Level::warn:
6✔
101
            return "warn";
6✔
102
        case Logger::Level::error:
6✔
103
            return "error";
6✔
104
        case Logger::Level::fatal:
6✔
105
            return "fatal";
6✔
106
        case Logger::Level::off:
1,197✔
107
            return "off";
1,197✔
108
    }
×
109
    REALM_ASSERT(false);
×
110
    return "";
×
111
}
×
112

113
std::optional<Logger::Level> Logger::level_from_string(std::string_view str)
114
{
66✔
115
    if (str == "all") {
66✔
116
        return Logger::Level::all;
6✔
117
    }
6✔
118
    if (str == "trace") {
60✔
119
        return Logger::Level::trace;
6✔
120
    }
6✔
121
    if (str == "debug") {
54✔
122
        return Logger::Level::debug;
18✔
123
    }
18✔
124
    if (str == "detail") {
36✔
125
        return Logger::Level::detail;
6✔
126
    }
6✔
127
    if (str == "info") {
30✔
128
        return Logger::Level::info;
6✔
129
    }
6✔
130
    if (str == "warn") {
24✔
131
        return Logger::Level::warn;
6✔
132
    }
6✔
133
    if (str == "error") {
18✔
134
        return Logger::Level::error;
6✔
135
    }
6✔
136
    if (str == "fatal") {
12✔
137
        return Logger::Level::fatal;
6✔
138
    }
6✔
139
    if (str == "off") {
6✔
140
        return Logger::Level::off;
6✔
141
    }
6✔
NEW
142
    return std::nullopt;
×
NEW
143
}
×
144

145
void StderrLogger::do_log(Level level, const std::string& message)
146
{
708,519✔
147
    // std::cerr is unbuffered, so no need to flush
565,002✔
148
    std::cerr << get_level_prefix(level) << message << '\n'; // Throws
708,519✔
149
}
708,519✔
150

151
void StreamLogger::do_log(Level level, const std::string& message)
152
{
138,669✔
153
    m_out << get_level_prefix(level) << message << std::endl; // Throws
138,669✔
154
}
138,669✔
155

156
void ThreadSafeLogger::do_log(Level level, const std::string& message)
157
{
479,139✔
158
    LockGuard l(m_mutex);
479,139✔
159
    Logger::do_log(*m_base_logger_ptr, level, message); // Throws
479,139✔
160
}
479,139✔
161

162
void PrefixLogger::do_log(Level level, const std::string& message)
163
{
195,375✔
164
    Logger::do_log(m_chained_logger, level, m_prefix + message); // Throws
195,375✔
165
}
195,375✔
166

167
void LocalThresholdLogger::do_log(Logger::Level level, std::string const& message)
168
{
×
169
    Logger::do_log(*m_chained_logger, level, message); // Throws
×
170
}
×
171
} // namespace realm::util
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc