|
@@ -5,12 +5,15 @@
|
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
|
|
#include <config.h>
|
|
#include <config.h>
|
|
-#include <exceptions/exceptions.h>
|
|
|
|
#include <cc/data.h>
|
|
#include <cc/data.h>
|
|
#include <config/module_spec.h>
|
|
#include <config/module_spec.h>
|
|
|
|
+#include <dhcpsrv/dhcpsrv_log.h>
|
|
#include <dhcpsrv/logging.h>
|
|
#include <dhcpsrv/logging.h>
|
|
-#include <gtest/gtest.h>
|
|
|
|
|
|
+#include <exceptions/exceptions.h>
|
|
#include <log/logger_support.h>
|
|
#include <log/logger_support.h>
|
|
|
|
+#include <testutils/io_utils.h>
|
|
|
|
+
|
|
|
|
+#include <gtest/gtest.h>
|
|
|
|
|
|
using namespace isc;
|
|
using namespace isc;
|
|
using namespace isc::dhcp;
|
|
using namespace isc::dhcp;
|
|
@@ -24,7 +27,6 @@ namespace {
|
|
/// each test. Strictly speaking this only resets the testing root logger (which
|
|
/// each test. Strictly speaking this only resets the testing root logger (which
|
|
/// has the name "kea") but as the only other logger mentioned here ("wombat")
|
|
/// has the name "kea") but as the only other logger mentioned here ("wombat")
|
|
/// is not used elsewhere, that is sufficient.
|
|
/// is not used elsewhere, that is sufficient.
|
|
-
|
|
|
|
class LoggingTest : public ::testing::Test {
|
|
class LoggingTest : public ::testing::Test {
|
|
public:
|
|
public:
|
|
/// @brief Constructor
|
|
/// @brief Constructor
|
|
@@ -34,10 +36,46 @@ class LoggingTest : public ::testing::Test {
|
|
///
|
|
///
|
|
/// Reset root logger back to defaults.
|
|
/// Reset root logger back to defaults.
|
|
~LoggingTest() {
|
|
~LoggingTest() {
|
|
- isc::log::setDefaultLoggingOutput();
|
|
|
|
|
|
+ isc::log::initLogger();
|
|
|
|
+ wipeFiles();
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ /// @brief Generates a log file name suffixed with a rotation number
|
|
|
|
+ /// @param rotation number to the append to the end of the file
|
|
|
|
+ std::string logName(int rotation) {
|
|
|
|
+ std::ostringstream os;
|
|
|
|
+ os << TEST_LOG_NAME << "." << rotation;
|
|
|
|
+ return (os.str());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /// @brief Removes the base log file name and 1 rotation
|
|
|
|
+ void wipeFiles() {
|
|
|
|
+ static_cast<void>(remove(TEST_LOG_NAME));
|
|
|
|
+ for (int i = 1; i < TEST_MAX_VERS + 1; ++i) {
|
|
|
|
+ static_cast<void>(remove(logName(i).c_str()));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Remove the lock file
|
|
|
|
+ std::ostringstream os;
|
|
|
|
+ os << TEST_LOG_NAME << ".lock";
|
|
|
|
+ static_cast<void>(remove(os.str().c_str()));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /// @brief Name of the log file
|
|
|
|
+ static const char* TEST_LOG_NAME;
|
|
|
|
+
|
|
|
|
+ /// @brief Maximum log size
|
|
|
|
+ static const int TEST_MAX_SIZE;
|
|
|
|
+
|
|
|
|
+ /// @brief Maximum rotated log versions
|
|
|
|
+ static const int TEST_MAX_VERS;
|
|
|
|
+
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+const char* LoggingTest::TEST_LOG_NAME = "kea.test.log";
|
|
|
|
+const int LoggingTest::TEST_MAX_SIZE = 204800; // Smallest without disabling rotation
|
|
|
|
+const int LoggingTest::TEST_MAX_VERS = 2; // More than the default of 1
|
|
|
|
+
|
|
// Tests that the spec file is valid.
|
|
// Tests that the spec file is valid.
|
|
TEST_F(LoggingTest, basicSpec) {
|
|
TEST_F(LoggingTest, basicSpec) {
|
|
std::string specfile = std::string(LOGGING_SPEC_FILE);
|
|
std::string specfile = std::string(LOGGING_SPEC_FILE);
|
|
@@ -244,6 +282,69 @@ TEST_F(LoggingTest, multipleLoggingDestinations) {
|
|
EXPECT_TRUE(storage->getLoggingInfo()[0].destinations_[1].flush_);
|
|
EXPECT_TRUE(storage->getLoggingInfo()[0].destinations_[1].flush_);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// Verifies that log rotation occurs when configured. We do not
|
|
|
|
+// worry about contents of the log files, only that rotation occurs.
|
|
|
|
+// Such details are tested in lib/log. This test verifies that
|
|
|
|
+// we can correcty configure logging such that rotation occurs as
|
|
|
|
+// expected.
|
|
|
|
+TEST_F(LoggingTest, logRotate) {
|
|
|
|
+ wipeFiles();
|
|
|
|
+
|
|
|
|
+ std::ostringstream os;
|
|
|
|
+ os <<
|
|
|
|
+ "{ \"loggers\": ["
|
|
|
|
+ " {"
|
|
|
|
+ " \"name\": \"kea\","
|
|
|
|
+ " \"output_options\": ["
|
|
|
|
+ " {"
|
|
|
|
+ " \"output\": \""
|
|
|
|
+ << TEST_LOG_NAME << "\"," <<
|
|
|
|
+ " \"flush\": true,"
|
|
|
|
+ " \"maxsize\":"
|
|
|
|
+ << TEST_MAX_SIZE << "," <<
|
|
|
|
+ " \"maxver\":"
|
|
|
|
+ << TEST_MAX_VERS <<
|
|
|
|
+ " }"
|
|
|
|
+ " ],"
|
|
|
|
+ " \"debuglevel\": 99,"
|
|
|
|
+ " \"severity\": \"DEBUG\""
|
|
|
|
+ " }"
|
|
|
|
+ "]}";
|
|
|
|
+
|
|
|
|
+ // Create our server config container.
|
|
|
|
+ SrvConfigPtr server_cfg(new SrvConfig());
|
|
|
|
+
|
|
|
|
+ // LogConfigParser expects a list of loggers, so parse
|
|
|
|
+ // the JSON text and extract the "loggers" element from it
|
|
|
|
+ ConstElementPtr config = Element::fromJSON(os.str());
|
|
|
|
+ config = config->get("loggers");
|
|
|
|
+
|
|
|
|
+ // Parse the config and then apply it.
|
|
|
|
+ LogConfigParser parser(server_cfg);
|
|
|
|
+ ASSERT_NO_THROW(parser.parseConfiguration(config));
|
|
|
|
+ ASSERT_NO_THROW(server_cfg->applyLoggingCfg());
|
|
|
|
+
|
|
|
|
+ EXPECT_EQ(TEST_MAX_SIZE, server_cfg->getLoggingInfo()[0].destinations_[0].maxsize_);
|
|
|
|
+ EXPECT_EQ(TEST_MAX_VERS, server_cfg->getLoggingInfo()[0].destinations_[0].maxver_);
|
|
|
|
+
|
|
|
|
+ // Make sure we have the initial log file.
|
|
|
|
+ ASSERT_TRUE(isc::test::fileExists(TEST_LOG_NAME));
|
|
|
|
+
|
|
|
|
+ // Now generate a log we know will be large enough to force a rotation.
|
|
|
|
+ // We borrow a one argument log message for the test.
|
|
|
|
+ std::string big_arg(TEST_MAX_SIZE, 'x');
|
|
|
|
+ isc::log::Logger logger("kea");
|
|
|
|
+
|
|
|
|
+ for (int i = 1; i < TEST_MAX_VERS + 1; i++) {
|
|
|
|
+ // Output the big log and make sure we get the expected rotation file.
|
|
|
|
+ LOG_INFO(logger, DHCPSRV_CFGMGR_ADD_IFACE).arg(big_arg);
|
|
|
|
+ EXPECT_TRUE(isc::test::fileExists(logName(i).c_str()));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Clean up.
|
|
|
|
+ wipeFiles();
|
|
|
|
+}
|
|
|
|
+
|
|
/// @todo Add tests for malformed logging configuration
|
|
/// @todo Add tests for malformed logging configuration
|
|
|
|
|
|
/// @todo There is no easy way to test applyConfiguration() and defaultLogging().
|
|
/// @todo There is no easy way to test applyConfiguration() and defaultLogging().
|