From 3ff3f9f00328b4f9538f1a2d008034c1368758f1 Mon Sep 17 00:00:00 2001 From: zxu Date: Wed, 20 Dec 2017 13:32:57 -0500 Subject: implement C++ logger (#575) * implement logger, apple impl and other impl, with test. * some minor fixes * re-organize cmake build rules; * fix bugs in log_apple.mm; * style fix by style.sh * Complete removal of LogAssert --- .../src/firebase/firestore/util/CMakeLists.txt | 1 + Firestore/core/src/firebase/firestore/util/log.h | 63 +++++++++ .../core/src/firebase/firestore/util/log_apple.mm | 148 +++++++++++++++++++++ .../core/src/firebase/firestore/util/log_stdio.cc | 97 ++++++++++++++ .../test/firebase/firestore/util/CMakeLists.txt | 1 + .../core/test/firebase/firestore/util/log_test.cc | 51 +++++++ 6 files changed, 361 insertions(+) create mode 100644 Firestore/core/src/firebase/firestore/util/log.h create mode 100644 Firestore/core/src/firebase/firestore/util/log_apple.mm create mode 100644 Firestore/core/src/firebase/firestore/util/log_stdio.cc create mode 100644 Firestore/core/test/firebase/firestore/util/log_test.cc (limited to 'Firestore') diff --git a/Firestore/core/src/firebase/firestore/util/CMakeLists.txt b/Firestore/core/src/firebase/firestore/util/CMakeLists.txt index ce81363..ebb2301 100644 --- a/Firestore/core/src/firebase/firestore/util/CMakeLists.txt +++ b/Firestore/core/src/firebase/firestore/util/CMakeLists.txt @@ -15,5 +15,6 @@ add_library( firebase_firestore_util autoid.cc + log_stdio.cc secure_random_arc4random.cc ) diff --git a/Firestore/core/src/firebase/firestore/util/log.h b/Firestore/core/src/firebase/firestore/util/log.h new file mode 100644 index 0000000..d0cff4d --- /dev/null +++ b/Firestore/core/src/firebase/firestore/util/log.h @@ -0,0 +1,63 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_UTIL_LOG_H_ +#define FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_UTIL_LOG_H_ + +#include + +namespace firebase { +namespace firestore { +namespace util { + +/// @brief Levels used when logging messages. +enum LogLevel { + /// Verbose Log Level + kLogLevelVerbose = 0, + /// Debug Log Level + kLogLevelDebug, + /// Info Log Level + kLogLevelInfo, + /// Warning Log Level + kLogLevelWarning, + /// Error Log Level + kLogLevelError, +}; + +// Common log methods. + +// All messages at or above the specified log level value are displayed. +void LogSetLevel(LogLevel level); +// Get the currently set log level. +LogLevel LogGetLevel(); +// Log a debug message to the system log. +void LogDebug(const char* format, ...); +// Log an info message to the system log. +void LogInfo(const char* format, ...); +// Log a warning to the system log. +void LogWarning(const char* format, ...); +// Log an error to the system log. +void LogError(const char* format, ...); +// Log a firebase message (implemented by the platform specific logger). +void LogMessageV(LogLevel log_level, const char* format, va_list args); +// Log a firebase message via LogMessageV(). +void LogMessage(LogLevel log_level, const char* format, ...); + +} // namespace util +} // namespace firestore +} // namespace firebase + +#endif // FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_UTIL_LOG_H_ diff --git a/Firestore/core/src/firebase/firestore/util/log_apple.mm b/Firestore/core/src/firebase/firestore/util/log_apple.mm new file mode 100644 index 0000000..7cd834b --- /dev/null +++ b/Firestore/core/src/firebase/firestore/util/log_apple.mm @@ -0,0 +1,148 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Firestore/core/src/firebase/firestore/util/log.h" + +#include + +#import + +#import "Firestore/Source/API/FIRFirestore+Internal.h" + +namespace firebase { +namespace firestore { +namespace util { + +static NSString* FormatString(const char* format) { + return [[NSString alloc] initWithBytesNoCopy:(void*)format + length:strlen(format) + encoding:NSUTF8StringEncoding + freeWhenDone:NO]; +} + +void LogSetLevel(LogLevel level) { + switch (level) { + case kLogLevelVerbose: + FIRSetLoggerLevel(FIRLoggerLevelMax); + break; + case kLogLevelDebug: + FIRSetLoggerLevel(FIRLoggerLevelDebug); + break; + case kLogLevelInfo: + FIRSetLoggerLevel(FIRLoggerLevelInfo); + break; + case kLogLevelWarning: + FIRSetLoggerLevel(FIRLoggerLevelWarning); + break; + case kLogLevelError: + FIRSetLoggerLevel(FIRLoggerLevelError); + break; + default: + // Unsupported log level. FIRSetLoggerLevel will deal with it. + FIRSetLoggerLevel((FIRLoggerLevel)-1); + break; + } +} + +LogLevel LogGetLevel() { + // We return the true log level. True log level is what the SDK used to + // determine whether to log instead of what parameter is used in the last call + // of LogSetLevel(). + if (FIRIsLoggableLevel(FIRLoggerLevelInfo, NO)) { + if (FIRIsLoggableLevel(FIRLoggerLevelDebug, NO)) { + // FIRLoggerLevelMax is actually kLogLevelDebug right now. We do not check + // further. + return kLogLevelDebug; + } else { + return kLogLevelInfo; + } + } else { + if (FIRIsLoggableLevel(FIRLoggerLevelWarning, NO)) { + return kLogLevelWarning; + } else { + return kLogLevelError; + } + } +} + +void LogDebug(const char* format, ...) { + va_list list; + va_start(list, format); + FIRLogBasic(FIRLoggerLevelDebug, kFIRLoggerFirestore, @"I-FST000001", + FormatString(format), list); + va_end(list); +} + +void LogInfo(const char* format, ...) { + va_list list; + va_start(list, format); + FIRLogBasic(FIRLoggerLevelInfo, kFIRLoggerFirestore, @"I-FST000001", + FormatString(format), list); + va_end(list); +} + +void LogWarning(const char* format, ...) { + va_list list; + va_start(list, format); + FIRLogBasic(FIRLoggerLevelWarning, kFIRLoggerFirestore, @"I-FST000001", + FormatString(format), list); + va_end(list); +} + +void LogError(const char* format, ...) { + va_list list; + va_start(list, format); + FIRLogBasic(FIRLoggerLevelError, kFIRLoggerFirestore, @"I-FST000001", + FormatString(format), list); + va_end(list); +} + +void LogMessageV(LogLevel log_level, const char* format, va_list args) { + switch (log_level) { + case kLogLevelVerbose: // fall through + case kLogLevelDebug: + FIRLogBasic(FIRLoggerLevelDebug, kFIRLoggerFirestore, @"I-FST000001", + FormatString(format), args); + break; + case kLogLevelInfo: + FIRLogBasic(FIRLoggerLevelInfo, kFIRLoggerFirestore, @"I-FST000001", + FormatString(format), args); + break; + case kLogLevelWarning: + FIRLogBasic(FIRLoggerLevelWarning, kFIRLoggerFirestore, @"I-FST000001", + FormatString(format), args); + break; + case kLogLevelError: + FIRLogBasic(FIRLoggerLevelError, kFIRLoggerFirestore, @"I-FST000001", + FormatString(format), args); + break; + default: + FIRLogBasic(FIRLoggerLevelError, kFIRLoggerFirestore, @"I-FST000001", + FormatString(format), args); + break; + } +} + +void LogMessage(LogLevel log_level, const char* format, ...) { + va_list list; + va_start(list, format); + LogMessageV(log_level, format, list); + va_end(list); +} + +} // namespace util +} // namespace firestore +} // namespace firebase diff --git a/Firestore/core/src/firebase/firestore/util/log_stdio.cc b/Firestore/core/src/firebase/firestore/util/log_stdio.cc new file mode 100644 index 0000000..bca2dc9 --- /dev/null +++ b/Firestore/core/src/firebase/firestore/util/log_stdio.cc @@ -0,0 +1,97 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Firestore/core/src/firebase/firestore/util/log.h" + +#include +#include + +namespace firebase { +namespace firestore { +namespace util { + +LogLevel g_log_level = kLogLevelInfo; + +void LogSetLevel(LogLevel level) { + g_log_level = level; +} + +LogLevel LogGetLevel() { + return g_log_level; +} + +void LogDebug(const char* format, ...) { + va_list list; + va_start(list, format); + LogMessageV(kLogLevelDebug, format, list); + va_end(list); +} + +void LogInfo(const char* format, ...) { + va_list list; + va_start(list, format); + LogMessageV(kLogLevelInfo, format, list); + va_end(list); +} + +void LogWarning(const char* format, ...) { + va_list list; + va_start(list, format); + LogMessageV(kLogLevelWarning, format, list); + va_end(list); +} + +void LogError(const char* format, ...) { + va_list list; + va_start(list, format); + LogMessageV(kLogLevelError, format, list); + va_end(list); +} + +void LogMessageV(LogLevel log_level, const char* format, va_list args) { + if (log_level < g_log_level) { + return; + } + switch (log_level) { + case kLogLevelVerbose: + printf("VERBOSE: "); + break; + case kLogLevelDebug: + printf("DEBUG: "); + break; + case kLogLevelInfo: + break; + case kLogLevelWarning: + printf("WARNING: "); + break; + case kLogLevelError: + printf("ERROR: "); + break; + } + vprintf(format, args); + printf("\n"); +} + +void LogMessage(LogLevel log_level, const char* format, ...) { + va_list list; + va_start(list, format); + LogMessageV(log_level, format, list); + va_end(list); +} + +} // namespace util +} // namespace firestore +} // namespace firebase diff --git a/Firestore/core/test/firebase/firestore/util/CMakeLists.txt b/Firestore/core/test/firebase/firestore/util/CMakeLists.txt index 223fa41..ae2c3b0 100644 --- a/Firestore/core/test/firebase/firestore/util/CMakeLists.txt +++ b/Firestore/core/test/firebase/firestore/util/CMakeLists.txt @@ -15,6 +15,7 @@ cc_test( firebase_firestore_util_test autoid_test.cc + log_test.cc secure_random_test.cc ) target_link_libraries( diff --git a/Firestore/core/test/firebase/firestore/util/log_test.cc b/Firestore/core/test/firebase/firestore/util/log_test.cc new file mode 100644 index 0000000..09b2c08 --- /dev/null +++ b/Firestore/core/test/firebase/firestore/util/log_test.cc @@ -0,0 +1,51 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Firestore/core/src/firebase/firestore/util/log.h" + +#include "gtest/gtest.h" + +namespace firebase { +namespace firestore { +namespace util { + +TEST(Log, SetAndGet) { + LogSetLevel(kLogLevelVerbose); + + LogSetLevel(kLogLevelDebug); + EXPECT_EQ(kLogLevelDebug, LogGetLevel()); + + LogSetLevel(kLogLevelInfo); + EXPECT_EQ(kLogLevelInfo, LogGetLevel()); + + LogSetLevel(kLogLevelWarning); + EXPECT_EQ(kLogLevelWarning, LogGetLevel()); + + LogSetLevel(kLogLevelError); + EXPECT_EQ(kLogLevelError, LogGetLevel()); +} + +TEST(Log, LogAllKinds) { + LogDebug("test debug logging %d", 1); + LogInfo("test info logging %d", 2); + LogWarning("test warning logging %d", 3); + LogError("test error logging %d", 4); + LogMessage(kLogLevelError, "test va-args %s %c %d", "abc", ':', 123); +} + +} // namespace util +} // namespace firestore +} // namespace firebase -- cgit v1.2.3