Commit 34ebe17e authored by Stephen Morris's avatar Stephen Morris
Browse files

[trac555] Add LoggerSpecification class and associated tests

parent 67c6c448
......@@ -14,6 +14,7 @@ liblog_la_SOURCES += logger_impl.cc logger_impl.h
liblog_la_SOURCES += logger_level.h
liblog_la_SOURCES += logger_level.h
liblog_la_SOURCES += logger_level_impl.cc logger_level_impl.h
liblog_la_SOURCES += logger_specification.h
liblog_la_SOURCES += logger_support.cc logger_support.h
liblog_la_SOURCES += macros.h
liblog_la_SOURCES += messagedef.cc messagedef.h
......
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
// PERFORMANCE OF THIS SOFTWARE.
#ifndef __LOGGER_SPECIFICATION_H
#define __LOGGER_SPEC_IFICATIONH
#include <stdint.h>
#include <stdlib.h>
#include <log/logger_level.h>
#include <log/output_option.h>
/// \brief Logger Specification
///
/// The logging configuration options are a list of logger specifications, each
/// of which represents a logger and the options for its appenders.
///
/// Unlike OutputOption (which is a struct), this contains a bit more
/// structure and is concealed in a class.
namespace isc {
namespace log {
class LoggerSpecification {
public:
typedef std::vector<OutputOption>::iterator iterator;
typedef std::vector<OutputOption>::const_iterator const_iterator;
/// \brief Constructor
///
/// \param name Name of the logger.
/// \param severity Severity at which this logger logs
/// \param dbglevel Debug level
/// \param additive true to cause message logged with this logger to be
/// passed to the parent for logging.
LoggerSpecification(const std::string& name = "",
isc::log::Severity severity = isc::log::INFO,
int dbglevel = 0, bool additive = false) :
name_(name), severity_(severity), dbglevel_(dbglevel),
additive_(additive)
{}
/// \brief Set the name
///
/// \param name Name of the logger .
void setName(const std::string& name) {
name_ = name;
}
/// \return Return logger name
std::string getName() const {
return name_;
}
/// \brief Set the severity
///
/// \param severity New severity of the logger .
void setSeverity(isc::log::Severity severity) {
severity_ = severity;
}
/// \return Return logger severity
isc::log::Severity getSeverity() const {
return severity_;
}
/// \brief Set the debug level
///
/// \param dbglevel New debug level of the logger .
void setDbglevel(int dbglevel) {
dbglevel_ = dbglevel;
}
/// \return Return logger debug level
int getDbglevel() const {
return dbglevel_;
}
/// \brief Set the additive flag
///
/// \param additive New value of the additive flag
void setAdditive(bool additive) {
additive_ = additive;
}
/// \return Return additive flag
int getAdditive() const {
return additive_;
}
/// \brief Add output option
///
/// \param Option to add to the list
void addOutputOption(const OutputOption& option) {
options_.push_back(option);
}
/// \return Iterator to start of output options
iterator begin() {
return options_.begin();
}
/// \return Iterator to start of output options
const_iterator begin() const {
return options_.begin();
}
/// \return Iterator to end of output options
iterator end() {
return options_.end();
}
/// \return Iterator to end of output options
const_iterator end() const {
return options_.end();
}
/// \return Number of output specification options
size_t optionCount() const {
return options_.size();
}
/// \brief Reset back to defaults
void reset() {
name_ = "";
severity_ = isc::log::INFO;
dbglevel_ = 0;
additive_ = false;
options_.clear();
}
private:
std::string name_; ///< Logger name
isc::log::Severity severity_; ///< Severity for this logger
int dbglevel_; ///< Debug level
bool additive_; ///< Chaining output
std::vector<OutputOption> options_; ///< Logger options
};
} // namespace log
} // namespace isc
#endif // __LOGGER_SPEC_IFICATIONH
......@@ -15,8 +15,8 @@
#ifndef __OUTPUT_OPTION_H
#define __OUTPUT_OPTION_H
#include <cstddef>
#include <cstdint>
#include <stdint.h>
#include <stdlib.h>
#include <string>
/// \brief Logger Output Option
......@@ -54,12 +54,17 @@ struct OutputOption {
/// If console, stream on which messages are output
typedef enum {
STR_STDERR = 0, // Default console stream is stderr
STR_STDOUT = 1
STR_STDOUT = 0,
STR_STDERR = 1
} Stream;
/// Members. The default sets everything to 0, which why the
/// stderr/stdout numbers (above) are reversed.
/// \brief Constructor
OutputOption() : destination(DEST_CONSOLE), stream(STR_STDERR),
flush(false), facility(""), filename(""), maxsize(0),
maxver(0)
{}
/// Members.
Destination destination; ///< Where the output should go
Stream stream; ///< stdout/stderr if console output
......
......@@ -18,6 +18,7 @@ run_unittests_SOURCES += log_formatter_unittest.cc
run_unittests_SOURCES += logger_level_impl_unittest.cc
run_unittests_SOURCES += logger_level_unittest.cc
run_unittests_SOURCES += logger_unittest.cc
run_unittests_SOURCES += logger_specification_unittest.cc
run_unittests_SOURCES += message_dictionary_unittest.cc
run_unittests_SOURCES += message_initializer_unittest_2.cc
run_unittests_SOURCES += message_initializer_unittest.cc
......
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
// PERFORMANCE OF THIS SOFTWARE.
#include <string>
#include <gtest/gtest.h>
#include <log/logger_specification.h>
#include <log/output_option.h>
using namespace isc::log;
using namespace std;
/// \brief LoggerSpecification Test
class LoggerSpecificationTest : public ::testing::Test {
public:
LoggerSpecificationTest()
{}
~LoggerSpecificationTest()
{}
};
// Check default initialization.
TEST_F(LoggerSpecificationTest, DefaultInitialization) {
LoggerSpecification spec;
EXPECT_EQ(string(""), spec.getName());
EXPECT_EQ(isc::log::INFO, spec.getSeverity());
EXPECT_EQ(0, spec.getDbglevel());
EXPECT_FALSE(spec.getAdditive());
EXPECT_EQ(0, spec.optionCount());
}
// Non-default initialization
TEST_F(LoggerSpecificationTest, Initialization) {
LoggerSpecification spec("alpha", isc::log::ERROR, 42, true);
EXPECT_EQ(string("alpha"), spec.getName());
EXPECT_EQ(isc::log::ERROR, spec.getSeverity());
EXPECT_EQ(42, spec.getDbglevel());
EXPECT_TRUE(spec.getAdditive());
EXPECT_EQ(0, spec.optionCount());
}
// Get/Set tests
TEST_F(LoggerSpecificationTest, SetGet) {
LoggerSpecification spec;
spec.setName("gamma");
EXPECT_EQ(string("gamma"), spec.getName());
spec.setSeverity(isc::log::FATAL);
EXPECT_EQ(isc::log::FATAL, spec.getSeverity());
spec.setDbglevel(7);
EXPECT_EQ(7, spec.getDbglevel());
spec.setAdditive(true);
EXPECT_TRUE(spec.getAdditive());
// Should not affect option count
EXPECT_EQ(0, spec.optionCount());
}
// Check option setting
TEST_F(LoggerSpecificationTest, AddOption) {
OutputOption option1;
option1.destination = OutputOption::DEST_FILE;
option1.filename = "/tmp/example.log";
option1.maxsize = 123456;
OutputOption option2;
option2.destination = OutputOption::DEST_SYSLOG;
option2.facility = "LOCAL7";
LoggerSpecification spec;
spec.addOutputOption(option1);
spec.addOutputOption(option2);
EXPECT_EQ(2, spec.optionCount());
// Iterate through them
LoggerSpecification::const_iterator i = spec.begin();
EXPECT_EQ(OutputOption::DEST_FILE, i->destination);
EXPECT_EQ(string("/tmp/example.log"), i->filename);
EXPECT_EQ(123456, i->maxsize);
++i;
EXPECT_EQ(OutputOption::DEST_SYSLOG, i->destination);
EXPECT_EQ(string("LOCAL7"), i->facility);
++i;
EXPECT_TRUE(i == spec.end());
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment