Explorar o código

Start testing on c_logger

Sam Jaffe %!s(int64=6) %!d(string=hai) anos
pai
achega
cd50fa2ca6

+ 6 - 0
logger.xcodeproj/project.pbxproj

@@ -10,6 +10,7 @@
 		CD1CDE872252E5B900E5B6B2 /* properties.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CD1CDE862252E5B900E5B6B2 /* properties.cxx */; };
 		CD1CDE892252E60900E5B6B2 /* file_logger.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CD1CDE882252E60900E5B6B2 /* file_logger.cxx */; };
 		CD1CDE8B2252E61800E5B6B2 /* console_logger.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CD1CDE8A2252E61800E5B6B2 /* console_logger.cxx */; };
+		CD1CDE8D22540D9B00E5B6B2 /* c_logger_test.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CD1CDE8C22540D9B00E5B6B2 /* c_logger_test.cxx */; };
 		CD29739B1D7B401F00E37217 /* logger.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CD2973991D7B401F00E37217 /* logger.cxx */; };
 		CD3C80C01D6A2CA300ACC795 /* format.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CD3C80BE1D6A2CA300ACC795 /* format.cxx */; };
 		CD6F73EC225187BE0081ED74 /* logger in Headers */ = {isa = PBXBuildFile; fileRef = CD6F73EA225187A10081ED74 /* logger */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -65,6 +66,8 @@
 		CD1CDE862252E5B900E5B6B2 /* properties.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = properties.cxx; sourceTree = "<group>"; };
 		CD1CDE882252E60900E5B6B2 /* file_logger.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = file_logger.cxx; sourceTree = "<group>"; };
 		CD1CDE8A2252E61800E5B6B2 /* console_logger.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = console_logger.cxx; sourceTree = "<group>"; };
+		CD1CDE8C22540D9B00E5B6B2 /* c_logger_test.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = c_logger_test.cxx; sourceTree = "<group>"; };
+		CD1CDE8E22540DEA00E5B6B2 /* mock_logger.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mock_logger.h; sourceTree = "<group>"; };
 		CD2973991D7B401F00E37217 /* logger.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = logger.cxx; sourceTree = "<group>"; };
 		CD3C80BE1D6A2CA300ACC795 /* format.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = format.cxx; sourceTree = "<group>"; };
 		CD6F73EA225187A10081ED74 /* logger */ = {isa = PBXFileReference; lastKnownFileType = folder; name = logger; path = include/logger; sourceTree = "<group>"; };
@@ -150,6 +153,8 @@
 			isa = PBXGroup;
 			children = (
 				CD6F73FC225187E10081ED74 /* logger_test.cxx */,
+				CD1CDE8C22540D9B00E5B6B2 /* c_logger_test.cxx */,
+				CD1CDE8E22540DEA00E5B6B2 /* mock_logger.h */,
 			);
 			path = test;
 			sourceTree = "<group>";
@@ -336,6 +341,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				CD6F740C225187FD0081ED74 /* logger_test.cxx in Sources */,
+				CD1CDE8D22540D9B00E5B6B2 /* c_logger_test.cxx in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

+ 2 - 1
src/c_logger.cxx

@@ -31,7 +31,7 @@ std::string c_logger::get_header(log_level level) {
 
 void c_logger::vlognf(log_level level, size_t num_bytes, char const* fmt,
                     va_list args) {
-  if (level < min_level_) return;
+  if (level < min_level_ || !impl_->should_log(level)) return;
   const std::unique_ptr<char[]> data(new char[num_bytes]);
   int n = vsnprintf(data.get(), num_bytes, fmt, args);
   if (n >= 0) {
@@ -41,6 +41,7 @@ void c_logger::vlognf(log_level level, size_t num_bytes, char const* fmt,
 }
 
 void c_logger::log(log_level level, std::string const& msg) {
+  if (level < min_level_ || !impl_->should_log(level)) return;
   impl_->write(level, msg);
 }
 

+ 1 - 1
src/log_manager.cxx

@@ -88,7 +88,7 @@ void manager::configure(properties const & props) {
   for (auto & app : impls.obj) {
     pimpl_->appenders.emplace(app.first, factory.get(app.first, app.second));
   }
-  // TODO: root
+
   auto & configs = props["configuration"]["loggers"];
   expects(configs.type == properties::OBJECT);
   for (auto & log : configs.obj) {

+ 35 - 0
test/c_logger_test.cxx

@@ -0,0 +1,35 @@
+//
+//  c_logger_test.cxx
+//  logger_test
+//
+//  Created by Sam Jaffe on 4/2/19.
+//
+
+#include "mock_logger.h"
+
+#include "logger/c_logger.h"
+
+using namespace logging;
+
+namespace {
+struct t_logger : public c_logger {
+  t_logger(std::string const & name, std::shared_ptr<logger_impl> impl)
+  : c_logger(name, impl) {}
+};
+}
+
+using CLoggerTest = LoggerTest;
+
+TEST_F(CLoggerTest, LogsWithFmtCode) {
+  using testing::_;
+  using testing::HasSubstr;
+  EXPECT_CALL(*pimpl, write(_, HasSubstr("5"))).Times(1);
+  t_logger("", pimpl).errorf("%d", 5);
+}
+
+TEST_F(CLoggerTest, DoesNotLogAboveLevel) {
+  using testing::_;
+  pimpl->SetLogLevel(LFATAL);
+  EXPECT_CALL(*pimpl, write(_)).Times(0);
+  t_logger("", pimpl).errorf("%d", 5);
+}

+ 2 - 46
test/logger_test.cxx

@@ -5,61 +5,17 @@
 //  Created by Sam Jaffe on 3/31/19.
 //
 
-#include <gmock/gmock.h>
+#include "mock_logger.h"
 
 #include "logger/logger.h"
-#include "logger/logger_impl.h"
-
-namespace logging {
-  void PrintTo(location_info const & info, std::ostream * os) {
-    if (info.line) {
-      (*os) << "{\"" << info.filename << "\", \"" <<
-          info.function << "\", " << info.line << "}";
-    } else {
-      (*os) << "NULL";
-    }
-  }
-  void PrintTo(logpacket const & pkt, std::ostream * os) {
-    (*os) << "{ " << pkt.level << ", ";
-    PrintTo(pkt.info, os);
-    (*os) << ", \"" << pkt.logger << "\", \"" << pkt.message << "\" }";
-  }
-}
-
-struct MockLoggerImpl : public logging::logger_impl {
-  MockLoggerImpl() {
-    SetLogLevel(logging::LTRACE);
-  }
-  void SetLogLevel(logging::log_level ll) {
-    min_log_level = ll;
-  }
-  MOCK_METHOD0(flush, void());
-  MOCK_METHOD1(write, void(logging::logpacket const &));
-  MOCK_METHOD2(write, void(logging::log_level, std::string const &));
-};
-
-struct LoggerTest : public testing::Test {
-  void SetUp() override;
-  void TearDown() override;
-
-  std::shared_ptr<MockLoggerImpl> pimpl;
-};
 
 using namespace logging;
 
+namespace {
 struct t_logger : public logger {
   t_logger(std::string const & name, std::shared_ptr<logger_impl> impl)
   : logger(name, impl) {}
 };
-
-void LoggerTest::SetUp() {
-  pimpl.reset(new MockLoggerImpl);
-  using testing::AnyNumber;
-  EXPECT_CALL(*pimpl, flush()).Times(AnyNumber());
-}
-
-void LoggerTest::TearDown() {
-  pimpl.reset();
 }
 
 TEST_F(LoggerTest, LogsWithBraceFmtCode) {

+ 53 - 0
test/mock_logger.h

@@ -0,0 +1,53 @@
+//
+//  mock_logger.h
+//  logger_test
+//
+//  Created by Sam Jaffe on 4/2/19.
+//
+
+#ifndef mock_logger_h
+#define mock_logger_h
+
+#include <gmock/gmock.h>
+
+#include "logger/logger_impl.h"
+
+namespace logging {
+  inline void PrintTo(location_info const & info, std::ostream * os) {
+    if (info.line) {
+      (*os) << "{\"" << info.filename << "\", \"" <<
+      info.function << "\", " << info.line << "}";
+    } else {
+      (*os) << "NULL";
+    }
+  }
+  
+  inline void PrintTo(logpacket const & pkt, std::ostream * os) {
+    (*os) << "{ " << pkt.level << ", ";
+    PrintTo(pkt.info, os);
+    (*os) << ", \"" << pkt.logger << "\", \"" << pkt.message << "\" }";
+  }
+}
+
+struct MockLoggerImpl : public logging::logger_impl {
+  MockLoggerImpl() { SetLogLevel(logging::LTRACE); }
+  void SetLogLevel(logging::log_level ll) { min_log_level = ll; }
+  MOCK_METHOD0(flush, void());
+  MOCK_METHOD1(write, void(logging::logpacket const &));
+  MOCK_METHOD2(write, void(logging::log_level, std::string const &));
+};
+
+struct LoggerTest : public testing::Test {
+  void SetUp() override {
+    pimpl.reset(new MockLoggerImpl);
+    using testing::AnyNumber;
+    EXPECT_CALL(*pimpl, flush()).Times(AnyNumber());
+  }
+  void TearDown() override {
+    pimpl.reset();
+  }
+  
+  std::shared_ptr<MockLoggerImpl> pimpl;
+};
+
+#endif /* mock_logger_h */