Skip to content

Commit 16c08e4

Browse files
committed
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.
1 parent 8948e83 commit 16c08e4

File tree

9 files changed

+65
-102
lines changed

9 files changed

+65
-102
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
### Internals
2626
* Update tests to use global logger. ([PR #6917](https://github.com/realm/realm-core/pull/6917))
27+
* Objectstore tests now use the UNITTEST_LOG_LEVEL env variable to determine log level rather than a build-time setting. ([PR #7029](https://github.com/realm/realm-core/pull/7029))
2728

2829
----------------------------------------------
2930

evergreen/config.yml

+5-3
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,6 @@ functions:
131131
set_cmake_var realm_vars CMAKE_TOOLCHAIN_FILE PATH "${cmake_toolchain_file}"
132132
fi
133133
134-
set_cmake_var realm_vars REALM_TEST_LOGGING BOOL On
135-
set_cmake_var realm_vars REALM_TEST_LOGGING_LEVEL STRING "debug"
136-
137134
GENERATOR="${cmake_generator}"
138135
if [ -z "${cmake_generator|}" ]; then
139136
GENERATOR="Ninja Multi-Config"
@@ -257,6 +254,9 @@ functions:
257254
if [[ -n "${run_with_encryption}" ]]; then
258255
export UNITTEST_ENCRYPT_ALL=1
259256
fi
257+
if [[ -n "${test_log_level}" ]]; then
258+
export UNITTEST_LOG_LEVEL="${test_log_level}"
259+
fi
260260
export TSAN_OPTIONS="suppressions=$(pwd)/test/tsan.suppress"
261261
262262
cd build
@@ -877,6 +877,7 @@ tasks:
877877
vars:
878878
test_label: objstore-local
879879
test_executable_name: "realm-object-store-tests"
880+
test_log_level: debug
880881
verbose_test_output: true
881882
- func: "check branch state"
882883

@@ -896,6 +897,7 @@ tasks:
896897
vars:
897898
test_label: objstore-baas
898899
test_executable_name: "realm-object-store-tests"
900+
test_log_level: debug
899901
verbose_test_output: true
900902
- func: "check branch state"
901903

src/realm/util/logger.cpp

+33-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ const char* Logger::get_level_prefix(Level level) noexcept
8484
return "";
8585
}
8686

87-
const std::string_view Logger::level_to_string(Level level) noexcept
87+
std::string_view Logger::level_to_string(Level level) noexcept
8888
{
8989
switch (level) {
9090
case Logger::Level::all:
@@ -110,6 +110,38 @@ const std::string_view Logger::level_to_string(Level level) noexcept
110110
return "";
111111
}
112112

113+
std::optional<Logger::Level> Logger::level_from_string(std::string_view str)
114+
{
115+
if (str == "all") {
116+
return Logger::Level::all;
117+
}
118+
if (str == "trace") {
119+
return Logger::Level::trace;
120+
}
121+
if (str == "debug") {
122+
return Logger::Level::debug;
123+
}
124+
if (str == "detail") {
125+
return Logger::Level::detail;
126+
}
127+
if (str == "info") {
128+
return Logger::Level::info;
129+
}
130+
if (str == "warn") {
131+
return Logger::Level::warn;
132+
}
133+
if (str == "error") {
134+
return Logger::Level::error;
135+
}
136+
if (str == "fatal") {
137+
return Logger::Level::fatal;
138+
}
139+
if (str == "off") {
140+
return Logger::Level::off;
141+
}
142+
return std::nullopt;
143+
}
144+
113145
void StderrLogger::do_log(Level level, const std::string& message)
114146
{
115147
// std::cerr is unbuffered, so no need to flush

src/realm/util/logger.hpp

+5-38
Original file line numberDiff line numberDiff line change
@@ -100,13 +100,14 @@ class Logger {
100100
return static_cast<int>(level) >= static_cast<int>(get_level_threshold());
101101
}
102102

103-
virtual inline ~Logger() noexcept = default;
103+
virtual ~Logger() noexcept = default;
104104

105105
static void set_default_logger(std::shared_ptr<util::Logger>) noexcept;
106106
static std::shared_ptr<util::Logger>& get_default_logger() noexcept;
107107
static void set_default_level_threshold(Level level) noexcept;
108108
static Level get_default_level_threshold() noexcept;
109-
static const std::string_view level_to_string(Level level) noexcept;
109+
static std::string_view level_to_string(Level level) noexcept;
110+
static std::optional<Level> level_from_string(std::string_view);
110111

111112
protected:
112113
// Used by subclasses that link to a base logger
@@ -376,43 +377,9 @@ template <class C, class T>
376377
std::basic_istream<C, T>& operator>>(std::basic_istream<C, T>& in, Logger::Level& level)
377378
{
378379
std::basic_string<C, T> str;
379-
auto check = [&](const char* name) {
380-
size_t n = strlen(name);
381-
if (n != str.size())
382-
return false;
383-
for (size_t i = 0; i < n; ++i) {
384-
if (in.widen(name[i]) != str[i])
385-
return false;
386-
}
387-
return true;
388-
};
389380
if (in >> str) {
390-
if (check("all")) {
391-
level = Logger::Level::all;
392-
}
393-
else if (check("trace")) {
394-
level = Logger::Level::trace;
395-
}
396-
else if (check("debug")) {
397-
level = Logger::Level::debug;
398-
}
399-
else if (check("detail")) {
400-
level = Logger::Level::detail;
401-
}
402-
else if (check("info")) {
403-
level = Logger::Level::info;
404-
}
405-
else if (check("warn")) {
406-
level = Logger::Level::warn;
407-
}
408-
else if (check("error")) {
409-
level = Logger::Level::error;
410-
}
411-
else if (check("fatal")) {
412-
level = Logger::Level::fatal;
413-
}
414-
else if (check("off")) {
415-
level = Logger::Level::off;
381+
if (auto parsed = Logger::level_from_string(str)) {
382+
level = *parsed;
416383
}
417384
else {
418385
in.setstate(std::ios_base::failbit);

test/object-store/CMakeLists.txt

-15
Original file line numberDiff line numberDiff line change
@@ -137,21 +137,6 @@ if(REALM_ENABLE_SYNC)
137137
endif()
138138
endif()
139139

140-
if(REALM_TEST_LOGGING)
141-
target_compile_definitions(ObjectStoreTests PRIVATE
142-
TEST_ENABLE_LOGGING=1
143-
)
144-
145-
if(REALM_TEST_LOGGING_LEVEL)
146-
message(STATUS "Test logging level: ${REALM_TEST_LOGGING_LEVEL}")
147-
target_compile_definitions(ObjectStoreTests PRIVATE
148-
TEST_LOGGING_LEVEL=${REALM_TEST_LOGGING_LEVEL}
149-
)
150-
else()
151-
message(STATUS "Test logging enabled")
152-
endif()
153-
endif()
154-
155140
target_include_directories(ObjectStoreTests PRIVATE
156141
${CATCH_INCLUDE_DIR}
157142
${JSON_INCLUDE_DIR}

test/object-store/util/test_file.cpp

+1-12
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ TestFile::TestFile()
7070
disable_sync_to_disk();
7171
m_temp_dir = util::make_temp_dir();
7272
path = (fs::path(m_temp_dir) / "realm.XXXXXX").string();
73-
util::Logger::set_default_level_threshold(realm::util::Logger::Level::TEST_LOGGING_LEVEL);
7473
if (const char* crypt_key = test_util::crypt_key()) {
7574
encryption_key = std::vector<char>(crypt_key, crypt_key + 64);
7675
}
@@ -197,16 +196,8 @@ SyncServer::SyncServer(const SyncServer::Config& config)
197196
, m_server(m_local_root_dir, util::none, ([&] {
198197
using namespace std::literals::chrono_literals;
199198

200-
#if TEST_ENABLE_LOGGING
201-
m_logger = util::Logger::get_default_logger();
202-
203-
#else
204-
// Logging is disabled, use a NullLogger to prevent printing anything
205-
m_logger.reset(new util::NullLogger());
206-
#endif
207-
208199
sync::Server::Config c;
209-
c.logger = m_logger;
200+
c.logger = util::Logger::get_default_logger();
210201
c.token_expiration_clock = this;
211202
c.listen_address = "127.0.0.1";
212203
c.disable_sync_to_disk = true;
@@ -339,7 +330,6 @@ TestAppSession::TestAppSession(AppSession session,
339330
if (!m_transport)
340331
m_transport = instance_of<SynchronousTestTransport>;
341332
auto app_config = get_config(m_transport, *m_app_session);
342-
util::Logger::set_default_level_threshold(realm::util::Logger::Level::TEST_LOGGING_LEVEL);
343333
set_app_config_defaults(app_config, m_transport);
344334

345335
util::try_make_dir(m_base_file_path);
@@ -429,7 +419,6 @@ TestSyncManager::TestSyncManager(const Config& config, const SyncServer::Config&
429419
{
430420
app::App::Config app_config = config.app_config;
431421
set_app_config_defaults(app_config, transport);
432-
util::Logger::set_default_level_threshold(config.log_level);
433422

434423
SyncClientConfig sc_config;
435424
m_base_file_path = config.base_path.empty() ? util::make_temp_dir() + random_string(10) : config.base_path;

test/object-store/util/test_file.hpp

-15
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
#include <realm/object-store/shared_realm.hpp>
2323
#include <realm/util/tagged_bool.hpp>
2424

25-
#include <realm/util/logger.hpp>
2625
#include <realm/util/optional.hpp>
2726

2827
#include <thread>
@@ -97,18 +96,6 @@ struct InMemoryTestFile : realm::Realm::Config {
9796
void advance_and_notify(realm::Realm& realm);
9897
void on_change_but_no_notify(realm::Realm& realm);
9998

100-
#ifndef TEST_ENABLE_LOGGING
101-
#define TEST_ENABLE_LOGGING 0 // change to 1 to enable trace-level logging
102-
#endif
103-
104-
#ifndef TEST_LOGGING_LEVEL
105-
#if TEST_ENABLE_LOGGING
106-
#define TEST_LOGGING_LEVEL all
107-
#else
108-
#define TEST_LOGGING_LEVEL off
109-
#endif // TEST_ENABLE_LOGGING
110-
#endif // TEST_LOGGING_LEVEL
111-
11299
#if REALM_ENABLE_SYNC
113100

114101
using StartImmediately = realm::util::TaggedBool<class StartImmediatelyTag>;
@@ -147,7 +134,6 @@ class SyncServer : private realm::sync::Clock {
147134
friend class TestSyncManager;
148135
SyncServer(const Config& config);
149136
std::string m_local_root_dir;
150-
std::shared_ptr<realm::util::Logger> m_logger;
151137
realm::sync::Server m_server;
152138
std::thread m_thread;
153139
std::string m_url;
@@ -224,7 +210,6 @@ class TestSyncManager {
224210
std::string base_path;
225211
realm::SyncManager::MetadataMode metadata_mode = realm::SyncManager::MetadataMode::NoEncryption;
226212
bool should_teardown_test_directory = true;
227-
realm::util::Logger::Level log_level = realm::util::Logger::Level::TEST_LOGGING_LEVEL;
228213
bool override_sync_route = true;
229214
std::shared_ptr<realm::app::GenericNetworkTransport> transport;
230215
bool start_sync_client = true;

test/test_all.cpp

+7-8
Original file line numberDiff line numberDiff line change
@@ -470,14 +470,13 @@ bool run_tests(const std::shared_ptr<realm::util::Logger>& logger = nullptr)
470470
// Set intra test log level threshold
471471
{
472472
const char* str = getenv("UNITTEST_LOG_LEVEL");
473-
if (str && strlen(str) != 0) {
474-
std::istringstream in(str);
475-
in.imbue(std::locale::classic());
476-
in.flags(in.flags() & ~std::ios_base::skipws); // Do not accept white space
477-
in >> config.intra_test_log_level;
478-
bool bad = !in || in.get() != std::char_traits<char>::eof();
479-
if (bad)
480-
throw std::runtime_error("Bad intra test log level");
473+
if (str && *str) {
474+
if (auto level = realm::util::Logger::level_from_string(str)) {
475+
config.intra_test_log_level = *level;
476+
}
477+
else {
478+
throw std::runtime_error(util::format("Invalid log level '%1'", str));
479+
}
481480
}
482481
}
483482

test/util/test_path.cpp

+13-10
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,19 @@ bool initialize_test_path(int argc, const char* argv[])
159159
g_path_prefix = argv[1];
160160
}
161161

162+
Logger::Level log_level = Logger::Level::off;
163+
if (const char* str = getenv("UNITTEST_LOG_LEVEL"); str && *str) {
164+
if (auto custom_level = Logger::level_from_string(str)) {
165+
log_level = *custom_level;
166+
}
167+
}
168+
if (log_level == Logger::Level::off) {
169+
Logger::set_default_logger(std::make_shared<NullLogger>());
170+
}
171+
else {
172+
Logger::set_default_logger(std::make_shared<util::StderrLogger>(log_level));
173+
}
174+
162175
return true;
163176
}
164177

@@ -317,17 +330,7 @@ std::string TestDirNameGenerator::next()
317330

318331
std::shared_ptr<DB> get_test_db(const std::string& path, const char* crypt_key)
319332
{
320-
const char* str = getenv("UNITTEST_LOG_LEVEL");
321-
realm::util::Logger::Level core_log_level = realm::util::Logger::Level::off;
322-
if (str && strlen(str) != 0) {
323-
std::istringstream in(str);
324-
in.imbue(std::locale::classic());
325-
in.flags(in.flags() & ~std::ios_base::skipws); // Do not accept white space
326-
in >> core_log_level;
327-
}
328-
329333
DBOptions options;
330-
options.logger = std::make_shared<util::StderrLogger>(core_log_level);
331334
options.encryption_key = crypt_key;
332335
return DB::create(make_in_realm_history(), path, options);
333336
}

0 commit comments

Comments
 (0)