|
|
@ -20,6 +20,7 @@ |
|
|
|
#include "rocksdb/env.h" |
|
|
|
#include "rocksdb/env.h" |
|
|
|
#include "port/port.h" |
|
|
|
#include "port/port.h" |
|
|
|
#include "util/coding.h" |
|
|
|
#include "util/coding.h" |
|
|
|
|
|
|
|
#include "util/log_buffer.h" |
|
|
|
#include "util/mutexlock.h" |
|
|
|
#include "util/mutexlock.h" |
|
|
|
#include "util/testharness.h" |
|
|
|
#include "util/testharness.h" |
|
|
|
|
|
|
|
|
|
|
@ -465,6 +466,78 @@ TEST(EnvPosixTest, PosixRandomRWFileTest) { |
|
|
|
ASSERT_OK(file.get()->Close()); |
|
|
|
ASSERT_OK(file.get()->Close()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestLogger : public Logger { |
|
|
|
|
|
|
|
public: |
|
|
|
|
|
|
|
virtual void Logv(const char* format, va_list ap) override { |
|
|
|
|
|
|
|
log_count++; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
char new_format[550]; |
|
|
|
|
|
|
|
std::fill_n(new_format, sizeof(new_format), '2'); |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
va_list backup_ap; |
|
|
|
|
|
|
|
va_copy(backup_ap, ap); |
|
|
|
|
|
|
|
int n = vsnprintf(new_format, sizeof(new_format) - 1, format, backup_ap); |
|
|
|
|
|
|
|
// 48 bytes for extra information + bytes allocated
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (new_format[0] == '[') { |
|
|
|
|
|
|
|
// "[DEBUG] "
|
|
|
|
|
|
|
|
ASSERT_TRUE(n <= 56 + (512 - sizeof(struct timeval))); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
ASSERT_TRUE(n <= 48 + (512 - sizeof(struct timeval))); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
va_end(backup_ap); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < sizeof(new_format); i++) { |
|
|
|
|
|
|
|
if (new_format[i] == 'x') { |
|
|
|
|
|
|
|
char_x_count++; |
|
|
|
|
|
|
|
} else if (new_format[i] == '\0') { |
|
|
|
|
|
|
|
char_0_count++; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
int log_count; |
|
|
|
|
|
|
|
int char_x_count; |
|
|
|
|
|
|
|
int char_0_count; |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TEST(EnvPosixTest, LogBufferTest) { |
|
|
|
|
|
|
|
TestLogger test_logger; |
|
|
|
|
|
|
|
test_logger.SetInfoLogLevel(INFO); |
|
|
|
|
|
|
|
test_logger.log_count = 0; |
|
|
|
|
|
|
|
test_logger.char_x_count = 0; |
|
|
|
|
|
|
|
test_logger.char_0_count = 0; |
|
|
|
|
|
|
|
LogBuffer log_buffer(INFO, &test_logger); |
|
|
|
|
|
|
|
LogBuffer log_buffer_debug(DEBUG, &test_logger); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
char bytes200[200]; |
|
|
|
|
|
|
|
std::fill_n(bytes200, sizeof(bytes200), '1'); |
|
|
|
|
|
|
|
bytes200[sizeof(bytes200) - 1] = '\0'; |
|
|
|
|
|
|
|
char bytes600[600]; |
|
|
|
|
|
|
|
std::fill_n(bytes600, sizeof(bytes600), '1'); |
|
|
|
|
|
|
|
bytes600[sizeof(bytes600) - 1] = '\0'; |
|
|
|
|
|
|
|
char bytes9000[9000]; |
|
|
|
|
|
|
|
std::fill_n(bytes9000, sizeof(bytes9000), '1'); |
|
|
|
|
|
|
|
bytes9000[sizeof(bytes9000) - 1] = '\0'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LogToBuffer(&log_buffer, "x%sx", bytes200); |
|
|
|
|
|
|
|
LogToBuffer(&log_buffer, "x%sx", bytes600); |
|
|
|
|
|
|
|
LogToBuffer(&log_buffer, "x%sx%sx%sx", bytes200, bytes200, bytes200); |
|
|
|
|
|
|
|
LogToBuffer(&log_buffer, "x%sx%sx", bytes200, bytes600); |
|
|
|
|
|
|
|
LogToBuffer(&log_buffer, "x%sx%sx", bytes600, bytes9000); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LogToBuffer(&log_buffer_debug, "x%sx", bytes200); |
|
|
|
|
|
|
|
test_logger.SetInfoLogLevel(DEBUG); |
|
|
|
|
|
|
|
LogToBuffer(&log_buffer_debug, "x%sx%sx%sx", bytes600, bytes9000, bytes200); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ASSERT_EQ(0, test_logger.log_count); |
|
|
|
|
|
|
|
log_buffer.FlushBufferToLog(); |
|
|
|
|
|
|
|
log_buffer_debug.FlushBufferToLog(); |
|
|
|
|
|
|
|
ASSERT_EQ(6, test_logger.log_count); |
|
|
|
|
|
|
|
ASSERT_EQ(6, test_logger.char_0_count); |
|
|
|
|
|
|
|
ASSERT_EQ(10, test_logger.char_x_count); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} // namespace rocksdb
|
|
|
|
} // namespace rocksdb
|
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char** argv) { |
|
|
|
int main(int argc, char** argv) { |
|
|
|