2
0
mirror of https://gitlab.isc.org/isc-projects/kea synced 2025-09-05 00:15:17 +00:00

[#3578] added load write and reload test

This commit is contained in:
Razvan Becheriu
2024-09-25 22:55:24 +03:00
parent d251033b20
commit 4233f02e10
11 changed files with 223 additions and 25 deletions

View File

@@ -57,15 +57,14 @@ ParserContext::parseCommon() {
isc_throw(ParseError, "Parser abort");
}
scanEnd();
}
catch (...) {
} catch (...) {
scanEnd();
throw;
}
if (stack_.size() == 1) {
return (stack_[0]);
} else {
isc_throw(ParseError, "Expected exactly one terminal Element expected, found "
isc_throw(ParseError, "Expected exactly one terminal Element, found "
<< stack_.size());
}
}

View File

@@ -57,15 +57,14 @@ D2ParserContext::parseCommon() {
isc_throw(D2ParseError, "Parser abort");
}
scanEnd();
}
catch (...) {
} catch (...) {
scanEnd();
throw;
}
if (stack_.size() == 1) {
return (stack_[0]);
} else {
isc_throw(D2ParseError, "Expected exactly one terminal Element expected, found "
isc_throw(D2ParseError, "Expected exactly one terminal Element, found "
<< stack_.size());
}
}

View File

@@ -124,6 +124,7 @@ private:
/// (that was sent from some yet unspecified sender).
static void sessionReader(void);
protected:
/// @brief Handler for processing 'shutdown' command
///
/// This handler processes shutdown command, which initializes shutdown
@@ -342,6 +343,7 @@ private:
commandStatisticSetMaxSampleAgeAllHandler(const std::string& command,
isc::data::ConstElementPtr args);
private:
/// @brief Reclaims expired IPv4 leases and reschedules timer.
///
/// This is a wrapper method for @c AllocEngine::reclaimExpiredLeases4.

View File

@@ -55,15 +55,14 @@ Parser4Context::parseCommon() {
isc_throw(Dhcp4ParseError, "Parser abort");
}
scanEnd();
}
catch (...) {
} catch (...) {
scanEnd();
throw;
}
if (stack_.size() == 1) {
return (stack_[0]);
} else {
isc_throw(Dhcp4ParseError, "Expected exactly one terminal Element expected, found "
isc_throw(Dhcp4ParseError, "Expected exactly one terminal Element, found "
<< stack_.size());
}
}

View File

@@ -27,6 +27,7 @@
#endif
#include <log/logger_support.h>
#include <testutils/test_to_element.h>
#include <util/stopwatch.h>
#include <boost/pointer_cast.hpp>
@@ -55,6 +56,7 @@ using namespace isc::db::test;
using namespace isc::dhcp;
using namespace isc::dhcp::test;
using namespace isc::hooks;
using namespace isc::test;
namespace {
@@ -176,7 +178,7 @@ typedef boost::shared_ptr<TestCBControlDHCPv4> TestCBControlDHCPv4Ptr;
///
/// Exposes internal fields and installs stub implementation of the
/// @c CBControlDHCPv4 object.
class NakedControlledDhcpv4Srv: public ControlledDhcpv4Srv {
class NakedControlledDhcpv4Srv : public ControlledDhcpv4Srv {
public:
/// @brief Constructor.
@@ -185,7 +187,14 @@ public:
// We're replacing the @c CBControlDHCPv4 instance with our
// stub implementation used in tests.
cb_control_.reset(new TestCBControlDHCPv4());
CfgMgr::instance().setFamily(AF_INET);
}
using ControlledDhcpv4Srv::commandConfigGetHandler;
using ControlledDhcpv4Srv::commandConfigSetHandler;
using ControlledDhcpv4Srv::commandConfigReloadHandler;
using ControlledDhcpv4Srv::commandConfigWriteHandler;
};
/// @brief test class for Kea configuration backend
@@ -301,7 +310,6 @@ public:
EXPECT_EQ(0, cb_control->getDatabaseCurrentConfigFetchCalls());
EXPECT_EQ(1, cb_control->getDatabaseStagingConfigFetchCalls());
if (call_command) {
// The case where there is no backend is tested in the
// controlled server tests so we have only to verify
@@ -1079,7 +1087,6 @@ testBackendReconfiguration(const std::string& backend_first,
LeaseMgrFactory::instance().getType());
}
// This test verifies that backend specification can be added on
// server reconfiguration.
TEST_F(JSONFileBackendMySQLTest, reconfigureBackendUndefinedToMySQL) {
@@ -1100,4 +1107,94 @@ TEST_F(JSONFileBackendMySQLTest, reconfigureBackendMemfileToMySQL) {
#endif
/// @brief Test that all-keys.json config file can be loaded, written to disk
/// and reloaded.
TEST_F(JSONFileBackendTest, DISABLED_loadWriteReloadTest) {
// Create server first.
boost::scoped_ptr<NakedControlledDhcpv4Srv> srv;
ASSERT_NO_THROW(
srv.reset(new NakedControlledDhcpv4Srv());
);
try {
srv->init(CFG_EXAMPLES"/all-keys.json");
} catch (const std::exception& ex) {
ADD_FAILURE() << "Exception thrown on load: " << ex.what() << endl;
}
// Save initial configuration.
// ConstElementPtr expected_json;
// Read contents of the file and parse it as JSON.
// {
// Parser4Context parser;
// expected_json = parser.parseFile(CFG_EXAMPLES"/all-keys.json", Parser4Context::PARSER_DHCP4);
// if (!expected_json) {
// ADD_FAILURE() << "Invalid configuration in " << CFG_EXAMPLES"/all-keys.json" << endl;
// }
// }
// Set test file used write and reload configuration.
srv->setConfigFile(TEST_FILE);
// Save initial configuration to check it with the reloaded configuration.
// ConstElementPtr expected;
// try {
// expected = srv->commandConfigGetHandler("", ConstElementPtr());
// } catch (const std::exception& ex) {
// ADD_FAILURE() << "Exception thrown on get: " << ex.what() << endl;
// }
ConstElementPtr result;
int rcode;
// Configuration is written to test file.
try {
result = srv->commandConfigWriteHandler("", ConstElementPtr());
result = parseAnswerText(rcode, result);
} catch (const std::exception& ex) {
ADD_FAILURE() << "Exception thrown on write: " << ex.what() << endl;
}
ASSERT_EQ(CONTROL_RESULT_SUCCESS, rcode);
ASSERT_EQ("Configuration written to test-config.json successful", result->stringValue());
// Save written configuration.
// ConstElementPtr actual_json;
// {
// Parser4Context parser;
// actual_json = parser.parseFile(TEST_FILE, Parser4Context::PARSER_DHCP4);
// if (!actual_json) {
// ADD_FAILURE() << "Invalid configuration in written file " << TEST_FILE << endl;
// }
// }
// Configuration is reloaded from test file.
try {
result = srv->commandConfigReloadHandler("", ConstElementPtr());
result = parseAnswerText(rcode, result);
} catch (const std::exception& ex) {
ADD_FAILURE() << "Exception thrown on reload: " << ex.what() << endl;
}
ASSERT_EQ(CONTROL_RESULT_SUCCESS, rcode);
ASSERT_EQ("Configuration successful.", result->stringValue());
// Save reloaded configuration.
// ConstElementPtr actual;
// try {
// expected = srv->commandConfigGetHandler("", ConstElementPtr());
// } catch (const std::exception& ex) {
// ADD_FAILURE() << "Exception thrown on get after reload: " << ex.what() << endl;
// }
// Check initial configuration with reloaded configuration.
// expectEqWithDiff(expected_json, actual_json);
// Check initial configuration with reloaded configuration.
// expectEqWithDiff(expected, actual);
}
} // End of anonymous namespace

View File

@@ -124,6 +124,7 @@ private:
/// (that was sent from some yet unspecified sender).
static void sessionReader(void);
protected:
/// @brief Handler for processing 'shutdown' command
///
/// This handler processes shutdown command, which initializes shutdown
@@ -342,6 +343,7 @@ private:
commandStatisticSetMaxSampleAgeAllHandler(const std::string& command,
isc::data::ConstElementPtr args);
private:
/// @brief Reclaims expired IPv6 leases and reschedules timer.
///
/// This is a wrapper method for @c AllocEngine::reclaimExpiredLeases6.

View File

@@ -55,15 +55,14 @@ Parser6Context::parseCommon() {
isc_throw(Dhcp6ParseError, "Parser abort");
}
scanEnd();
}
catch (...) {
} catch (...) {
scanEnd();
throw;
}
if (stack_.size() == 1) {
return (stack_[0]);
} else {
isc_throw(Dhcp6ParseError, "Expected exactly one terminal Element expected, found "
isc_throw(Dhcp6ParseError, "Expected exactly one terminal Element, found "
<< stack_.size());
}
}

View File

@@ -25,6 +25,7 @@
#endif
#include <log/logger_support.h>
#include <testutils/test_to_element.h>
#include <util/stopwatch.h>
#include <boost/pointer_cast.hpp>
@@ -52,6 +53,7 @@ using namespace isc::db::test;
using namespace isc::dhcp;
using namespace isc::dhcp::test;
using namespace isc::hooks;
using namespace isc::test;
namespace {
@@ -173,7 +175,7 @@ typedef boost::shared_ptr<TestCBControlDHCPv6> TestCBControlDHCPv6Ptr;
///
/// Exposes internal fields and installs stub implementation of the
/// @c CBControlDHCPv6 object.
class NakedControlledDhcpv6Srv: public ControlledDhcpv6Srv {
class NakedControlledDhcpv6Srv : public ControlledDhcpv6Srv {
public:
/// @brief Constructor.
@@ -182,10 +184,22 @@ public:
// We're replacing the @c CBControlDHCPv6 instance with our
// stub implementation used in tests.
cb_control_.reset(new TestCBControlDHCPv6());
CfgMgr::instance().setFamily(AF_INET6);
}
using ControlledDhcpv6Srv::commandConfigGetHandler;
using ControlledDhcpv6Srv::commandConfigSetHandler;
using ControlledDhcpv6Srv::commandConfigReloadHandler;
using ControlledDhcpv6Srv::commandConfigWriteHandler;
};
/// @brief test class for Kea configuration backend
///
/// This class is used for testing Kea configuration backend.
/// It is very simple and currently focuses on reading
/// config file from disk. It is expected to be expanded in the
/// near future.
class JSONFileBackendTest : public dhcp::test::BaseServerTest {
public:
JSONFileBackendTest() {
@@ -286,7 +300,6 @@ public:
EXPECT_EQ(0, cb_control->getDatabaseCurrentConfigFetchCalls());
EXPECT_EQ(1, cb_control->getDatabaseStagingConfigFetchCalls());
if (call_command) {
// The case where there is no backend is tested in the
// controlled server tests so we have only to verify
@@ -796,7 +809,6 @@ TEST_F(JSONFileBackendTest, timers) {
duid_expired, 1, 50, 60, SubnetID(1)));
lease_expired->cltt_ = time(NULL) - 100;
// Create expired-reclaimed lease. The lease has expired 1000 - 60 seconds
// ago. It should be removed from the lease database when the "flush" timer
// goes off.
@@ -1062,7 +1074,6 @@ testBackendReconfiguration(const std::string& backend_first,
LeaseMgrFactory::instance().getType());
}
// This test verifies that backend specification can be added on
// server reconfiguration.
TEST_F(JSONFileBackendMySQLTest, reconfigureBackendUndefinedToMySQL) {
@@ -1083,4 +1094,94 @@ TEST_F(JSONFileBackendMySQLTest, reconfigureBackendMemfileToMySQL) {
#endif
/// @brief Test that all-keys.json config file can be loaded, written to disk
/// and reloaded.
TEST_F(JSONFileBackendTest, DISABLED_loadWriteReloadTest) {
// Create server first.
boost::scoped_ptr<NakedControlledDhcpv6Srv> srv;
ASSERT_NO_THROW(
srv.reset(new NakedControlledDhcpv6Srv());
);
try {
srv->init(CFG_EXAMPLES"/all-keys.json");
} catch (const std::exception& ex) {
ADD_FAILURE() << "Exception thrown on load: " << ex.what() << endl;
}
// Save initial configuration.
// ConstElementPtr expected_json;
// Read contents of the file and parse it as JSON.
// {
// Parser6Context parser;
// expected_json = parser.parseFile(CFG_EXAMPLES"/all-keys.json", Parser6Context::PARSER_DHCP6);
// if (!expected_json) {
// ADD_FAILURE() << "Invalid configuration in " << CFG_EXAMPLES"/all-keys.json" << endl;
// }
// }
// Set test file used write and reload configuration.
srv->setConfigFile(TEST_FILE);
// Save initial configuration to check it with the reloaded configuration.
// ConstElementPtr expected;
// try {
// expected = srv->commandConfigGetHandler("", ConstElementPtr());
// } catch (const std::exception& ex) {
// ADD_FAILURE() << "Exception thrown on get: " << ex.what() << endl;
// }
ConstElementPtr result;
int rcode;
// Configuration is written to test file.
try {
result = srv->commandConfigWriteHandler("", ConstElementPtr());
result = parseAnswerText(rcode, result);
} catch (const std::exception& ex) {
ADD_FAILURE() << "Exception thrown on write: " << ex.what() << endl;
}
ASSERT_EQ(CONTROL_RESULT_SUCCESS, rcode);
ASSERT_EQ("Configuration written to test-config.json successful", result->stringValue());
// Save written configuration.
// ConstElementPtr actual_json;
// {
// Parser6Context parser;
// actual_json = parser.parseFile(TEST_FILE, Parser6Context::PARSER_DHCP6);
// if (!actual_json) {
// ADD_FAILURE() << "Invalid configuration in written file " << TEST_FILE << endl;
// }
// }
// Configuration is reloaded from test file.
try {
result = srv->commandConfigReloadHandler("", ConstElementPtr());
result = parseAnswerText(rcode, result);
} catch (const std::exception& ex) {
ADD_FAILURE() << "Exception thrown on reload: " << ex.what() << endl;
}
ASSERT_EQ(CONTROL_RESULT_SUCCESS, rcode);
ASSERT_EQ("Configuration successful.", result->stringValue());
// Save reloaded configuration.
// ConstElementPtr actual;
// try {
// expected = srv->commandConfigGetHandler("", ConstElementPtr());
// } catch (const std::exception& ex) {
// ADD_FAILURE() << "Exception thrown on get after reload: " << ex.what() << endl;
// }
// Check initial configuration with reloaded configuration.
// expectEqWithDiff(expected_json, actual_json);
// Check initial configuration with reloaded configuration.
// expectEqWithDiff(expected, actual);
}
} // End of anonymous namespace

View File

@@ -57,15 +57,14 @@ ParserContext::parseCommon() {
isc_throw(ParseError, "Parser abort");
}
scanEnd();
}
catch (...) {
} catch (...) {
scanEnd();
throw;
}
if (stack_.size() == 1) {
return (stack_[0]);
} else {
isc_throw(ParseError, "Expected exactly one terminal Element expected, found "
isc_throw(ParseError, "Expected exactly one terminal Element, found "
<< stack_.size());
}
}

View File

@@ -241,7 +241,8 @@ DatabaseConnection::toElement(const ParameterMap& params) {
.arg(keyword).arg(value);
}
} else if ((keyword == "persist") ||
(keyword == "readonly")) {
(keyword == "readonly") ||
(keyword == "retry-on-startup")) {
if (value == "true") {
result->set(keyword, isc::data::Element::create(true));
} else if (value == "false") {
@@ -256,7 +257,6 @@ DatabaseConnection::toElement(const ParameterMap& params) {
(keyword == "host") ||
(keyword == "name") ||
(keyword == "on-fail") ||
(keyword == "retry-on-startup") ||
(keyword == "trust-anchor") ||
(keyword == "cert-file") ||
(keyword == "key-file") ||

View File

@@ -536,6 +536,7 @@ TEST(DatabaseConnection, toElementDbAccessStringValid) {
"\"port\" : 300, \n"
"\"readonly\" : false, \n"
"\"reconnect-wait-time\": 99, \n"
"\"retry-on-startup\" : true, \n"
"\"type\": \"memfile\", \n"
"\"user\": \"user_str\", \n"
"\"max-row-errors\": 50, \n"