]>
git.proxmox.com Git - ceph.git/blob - ceph/src/rocksdb/logging/env_logger_test.cc
1 // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
2 // This source code is licensed under both the GPLv2 (found in the
3 // COPYING file in the root directory) and Apache 2.0 License
4 // (found in the LICENSE.Apache file in the root directory).
7 #include "logging/env_logger.h"
9 #include "test_util/testharness.h"
10 #include "test_util/testutil.h"
12 namespace ROCKSDB_NAMESPACE
{
15 // In this test we only want to Log some simple log message with
17 void LogMessage(std::shared_ptr
<Logger
> logger
, const std::string
& message
) {
18 Log(logger
, "%s", message
.c_str());
21 // Helper method to write the message num_times in the given logger.
22 void WriteLogs(std::shared_ptr
<Logger
> logger
, const std::string
& message
,
24 for (int ii
= 0; ii
< num_times
; ++ii
) {
25 LogMessage(logger
, message
);
31 class EnvLoggerTest
: public testing::Test
{
35 EnvLoggerTest() : env_(Env::Default()) {}
37 ~EnvLoggerTest() = default;
39 std::shared_ptr
<Logger
> CreateLogger() {
40 std::shared_ptr
<Logger
> result
;
41 assert(NewEnvLogger(kLogFile
, env_
, &result
).ok());
43 result
->SetInfoLogLevel(InfoLogLevel::INFO_LEVEL
);
47 void DeleteLogFile() { ASSERT_OK(env_
->DeleteFile(kLogFile
)); }
49 static const std::string kSampleMessage
;
50 static const std::string kTestDir
;
51 static const std::string kLogFile
;
54 const std::string
EnvLoggerTest::kSampleMessage
=
55 "this is the message to be written to the log file!!";
56 const std::string
EnvLoggerTest::kLogFile
= test::PerThreadDBPath("log_file");
58 TEST_F(EnvLoggerTest
, EmptyLogFile
) {
59 auto logger
= CreateLogger();
60 ASSERT_EQ(logger
->Close(), Status::OK());
62 // Check the size of the log file.
64 ASSERT_EQ(env_
->GetFileSize(kLogFile
, &file_size
), Status::OK());
65 ASSERT_EQ(file_size
, 0);
69 TEST_F(EnvLoggerTest
, LogMultipleLines
) {
70 auto logger
= CreateLogger();
72 // Write multiple lines.
73 const int kNumIter
= 10;
74 WriteLogs(logger
, kSampleMessage
, kNumIter
);
78 ASSERT_EQ(logger
->Close(), Status::OK());
80 // Validate whether the log file has 'kNumIter' number of lines.
81 ASSERT_EQ(test::GetLinesCount(kLogFile
, kSampleMessage
), kNumIter
);
85 TEST_F(EnvLoggerTest
, Overwrite
) {
87 auto logger
= CreateLogger();
89 // Write multiple lines.
90 const int kNumIter
= 10;
91 WriteLogs(logger
, kSampleMessage
, kNumIter
);
93 ASSERT_EQ(logger
->Close(), Status::OK());
95 // Validate whether the log file has 'kNumIter' number of lines.
96 ASSERT_EQ(test::GetLinesCount(kLogFile
, kSampleMessage
), kNumIter
);
99 // Now reopen the file again.
101 auto logger
= CreateLogger();
103 // File should be empty.
105 ASSERT_EQ(env_
->GetFileSize(kLogFile
, &file_size
), Status::OK());
106 ASSERT_EQ(file_size
, 0);
107 ASSERT_EQ(logger
->GetLogFileSize(), 0);
108 ASSERT_EQ(logger
->Close(), Status::OK());
113 TEST_F(EnvLoggerTest
, Close
) {
114 auto logger
= CreateLogger();
116 // Write multiple lines.
117 const int kNumIter
= 10;
118 WriteLogs(logger
, kSampleMessage
, kNumIter
);
120 ASSERT_EQ(logger
->Close(), Status::OK());
122 // Validate whether the log file has 'kNumIter' number of lines.
123 ASSERT_EQ(test::GetLinesCount(kLogFile
, kSampleMessage
), kNumIter
);
127 TEST_F(EnvLoggerTest
, ConcurrentLogging
) {
128 auto logger
= CreateLogger();
130 const int kNumIter
= 20;
131 std::function
<void()> cb
= [&]() {
132 WriteLogs(logger
, kSampleMessage
, kNumIter
);
136 // Write to the logs from multiple threads.
137 std::vector
<port::Thread
> threads
;
138 const int kNumThreads
= 5;
140 for (int ii
= 0; ii
< kNumThreads
; ++ii
) {
141 threads
.push_back(port::Thread(cb
));
144 // Wait for them to complete.
145 for (auto& th
: threads
) {
149 ASSERT_EQ(logger
->Close(), Status::OK());
151 // Verfiy the log file.
152 ASSERT_EQ(test::GetLinesCount(kLogFile
, kSampleMessage
),
153 kNumIter
* kNumThreads
);
157 } // namespace ROCKSDB_NAMESPACE
159 int main(int argc
, char** argv
) {
160 ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
161 ::testing::InitGoogleTest(&argc
, argv
);
162 return RUN_ALL_TESTS();