// Copyright (C) 2022-2024 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
#include <config.h>
#include <cc/stamped_value.h>
#include <dhcpsrv/config_backend_dhcp4_mgr.h>
#include <pgsql_cb_dhcp4.h><--- Include file: not found. Please note: Cppcheck does not need standard library headers to get proper results.
#include <pgsql/testutils/pgsql_schema.h>
#include <dhcpsrv/testutils/generic_backend_unittest.h>
#include <boost/shared_ptr.hpp><--- Include file: not found. Please note: Cppcheck does not need standard library headers to get proper results.
#include <gtest/gtest.h><--- Include file: not found. Please note: Cppcheck does not need standard library headers to get proper results.
using namespace isc::data;
using namespace isc::dhcp;
using namespace isc::dhcp::test;
using namespace isc::db;
using namespace isc::db::test;
namespace {
/// @brief Test fixture class for @c PgSqlConfigBackendDHCPv4Mgr.
class PgSqlConfigBackendDHCPv4MgrTest : public GenericBackendTest {
public:
/// @brief Constructor.
PgSqlConfigBackendDHCPv4MgrTest() {
// Recreate a fresh mgr.
ConfigBackendDHCPv4Mgr::create();
// Ensure we have the proper schema with no transient data.
createPgSQLSchema();
}
/// @brief Destructor.
virtual ~PgSqlConfigBackendDHCPv4MgrTest() {
// Destroy the mgr.
ConfigBackendDHCPv4Mgr::destroy();
// If data wipe enabled, delete transient data otherwise destroy the schema.
destroyPgSQLSchema();
}
};
// This test verifies that PgSQL backend can be registered with and
// unregistered from the Config Backend Manager.
TEST_F(PgSqlConfigBackendDHCPv4MgrTest, factoryRegistration) {<--- syntax error
// Get the mgr singleton.
ConfigBackendDHCPv4Mgr& mgr = ConfigBackendDHCPv4Mgr::instance();
// With no factory registered, attempting to add a PgSQL db should fail.
ASSERT_THROW(mgr.addBackend(validPgSQLConnectionString()), InvalidType);
// Now we'll register the PgSQL factory.
ASSERT_NO_THROW(PgSqlConfigBackendDHCPv4::registerBackendType());
// With the factory registered, attempting to add a PgSQL db should succeed.
ASSERT_NO_THROW(mgr.addBackend(validPgSQLConnectionString()));
// Create a PgSQL backend selector for convenience.
BackendSelector pgsql(BackendSelector::Type::POSTGRESQL);
// Should be able to create a global parameter.
StampedValuePtr server_tag = StampedValue::create("server-tag", "whale");
ASSERT_NO_THROW(mgr.getPool()->createUpdateGlobalParameter4(pgsql, ServerSelector::ALL(),
server_tag));
// Verify parameter can be fetched.
server_tag.reset();
ASSERT_NO_THROW(server_tag = mgr.getPool()->getGlobalParameter4(pgsql, ServerSelector::ALL(),
"server-tag"));
ASSERT_TRUE(server_tag);
EXPECT_EQ("server-tag", server_tag->getName());
EXPECT_EQ("whale", server_tag->getValue());
// Now we'll unregister PgSQL.
ASSERT_NO_THROW(PgSqlConfigBackendDHCPv4::unregisterBackendType());
// With no factory registered, attempting to add a PgSQL db should fail.
ASSERT_THROW(mgr.addBackend(validPgSQLConnectionString()), InvalidType);
// Attempting to read the global parameter should fail.
ASSERT_THROW(mgr.getPool()->getGlobalParameter4(pgsql, ServerSelector::ALL(), "server-tag"),
NoSuchDatabase);
}
}