diff options
Diffstat (limited to 'src/lib/yang/tests/translator_host_unittests.cc')
-rw-r--r-- | src/lib/yang/tests/translator_host_unittests.cc | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/src/lib/yang/tests/translator_host_unittests.cc b/src/lib/yang/tests/translator_host_unittests.cc new file mode 100644 index 0000000..26fd202 --- /dev/null +++ b/src/lib/yang/tests/translator_host_unittests.cc @@ -0,0 +1,188 @@ +// Copyright (C) 2018-2021 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 <yang/translator_host.h> +#include <yang/yang_models.h> +#include <yang/tests/sysrepo_setup.h> + +#include <gtest/gtest.h> +#include <sstream> + +using namespace std; +using namespace isc; +using namespace isc::data; +using namespace isc::yang; +using namespace isc::yang::test; +using namespace sysrepo; + +namespace { + +/// @brief Translator name. +extern char const host_reservations[] = "host reservations"; + +/// @brief Test fixture class for @ref TranslatorHosts. +class TranslatorHostsTestv4 : + public GenericTranslatorTest<host_reservations, TranslatorHosts> { +public: + + /// Constructor. + TranslatorHostsTestv4() { + model_ = KEA_DHCP4_SERVER; + } +}; + +class TranslatorHostsTestv6 : + public GenericTranslatorTest<host_reservations, TranslatorHosts> { +public: + + /// Constructor. + TranslatorHostsTestv6() { + model_ = KEA_DHCP6_SERVER; + } +}; + +// This test verifies that an empty host reservation list can be properly +// translated from YANG to JSON. +TEST_F(TranslatorHostsTestv6, getEmpty) { + // Get the host reservation list and check if it is empty. + const string& xpath = + "/kea-dhcp6-server:config/subnet6[id='111']"; + ConstElementPtr hosts; + EXPECT_NO_THROW(hosts = t_obj_->getHosts(xpath)); + ASSERT_FALSE(hosts); +} + +// This test verifies that one host reservation can be properly +// translated from YANG to JSON. +TEST_F(TranslatorHostsTestv6, get) { + // Create the subnet 2001:db8::/48 #111. + const string& xpath = + "/kea-dhcp6-server:config/subnet6[id='111']"; + S_Val v_subnet(new Val("2001:db8::/48", SR_STRING_T)); + const string& subnet = xpath + "/subnet"; + EXPECT_NO_THROW(sess_->set_item(subnet.c_str(), v_subnet)); + + // Create the host reservation for 2001:db8::1. + ostringstream shost; + shost << xpath + "/host[identifier-type='hw-address']" + << "[identifier='00:01:02:03:04:05']"; + const string& xaddr = shost.str() + "/ip-addresses"; + S_Val s_addr(new Val("2001:db8::1")); + EXPECT_NO_THROW(sess_->set_item(xaddr.c_str(), s_addr)); + + // Get the host. + ConstElementPtr host; + EXPECT_NO_THROW(host = t_obj_->getHost(shost.str())); + ASSERT_TRUE(host); + ElementPtr expected = Element::createMap(); + ElementPtr addresses = Element::createList(); + addresses->add(Element::create(string("2001:db8::1"))); + expected->set("hw-address", Element::create(string("00:01:02:03:04:05"))); + expected->set("ip-addresses", addresses); + EXPECT_TRUE(expected->equals(*host)); + + // Get the host reservation list and check if the host reservation + // is in it. + ConstElementPtr hosts; + EXPECT_NO_THROW(hosts = t_obj_->getHosts(xpath)); + ASSERT_TRUE(hosts); + ASSERT_EQ(Element::list, hosts->getType()); + ASSERT_EQ(1, hosts->size()); + EXPECT_TRUE(host->equals(*hosts->get(0))); +} + +// This test verifies that an empty host reservation list can be properly +// translated from JSON to YANG. +TEST_F(TranslatorHostsTestv6, setEmpty) { + // Create the subnet 2001:db8::/48 #111. + const string& xpath = + "/kea-dhcp6-server:config/subnet6[id='111']"; + S_Val v_subnet(new Val("2001:db8::/48", SR_STRING_T)); + const string& subnet = xpath + "/subnet"; + EXPECT_NO_THROW(sess_->set_item(subnet.c_str(), v_subnet)); + + // Set empty list. + ConstElementPtr hosts = Element::createList(); + EXPECT_NO_THROW(t_obj_->setHosts(xpath, hosts)); + + // Get it back. + hosts.reset(); + EXPECT_NO_THROW(hosts = t_obj_->getHosts(xpath)); + ASSERT_FALSE(hosts); +} + +// This test verifies that one host reservation can be properly +// translated from JSON to YANG. +TEST_F(TranslatorHostsTestv4, set) { + // Create the subnet 10.0.0.0/14 #111. + const string& xpath = + "/kea-dhcp4-server:config/subnet4[id='111']"; + S_Val v_subnet(new Val("10.0.0.0/24", SR_STRING_T)); + const string& subnet = xpath + "/subnet"; + EXPECT_NO_THROW(sess_->set_item(subnet.c_str(), v_subnet)); + + // Set one host. + ElementPtr hosts = Element::createList(); + ElementPtr host = Element::createMap(); + host->set("flex-id", Element::create(string("00:ff"))); + host->set("ip-address", Element::create(string("10.0.0.1"))); + host->set("hostname", Element::create(string("foo"))); + hosts->add(host); + EXPECT_NO_THROW(t_obj_->setHosts(xpath, hosts)); + + // Get it back. + hosts.reset(); + EXPECT_NO_THROW(hosts = t_obj_->getHosts(xpath)); + ASSERT_TRUE(hosts); + ASSERT_EQ(Element::list, hosts->getType()); + ASSERT_EQ(1, hosts->size()); + EXPECT_TRUE(host->equals(*hosts->get(0))); + + // Check it validates. + EXPECT_NO_THROW(sess_->validate()); +} + +// This test verifies that several host reservations can be properly +// translated from YANG to JSON. +TEST_F(TranslatorHostsTestv6, getMany) { + // Create the subnet 2001:db8::/48 #111. + const string& xpath = + "/kea-dhcp6-server:config/subnet6[id='111']"; + S_Val v_subnet(new Val("2001:db8::/48", SR_STRING_T)); + const string& subnet = xpath + "/subnet"; + EXPECT_NO_THROW(sess_->set_item(subnet.c_str(), v_subnet)); + + // Create the host reservation for 2001:db8::1. + ostringstream shost; + shost << xpath + "/host[identifier-type='hw-address']" + << "[identifier='00:01:02:03:04:05']"; + const string& xaddr = shost.str() + "/ip-addresses"; + S_Val s_addr(new Val("2001:db8::1")); + EXPECT_NO_THROW(sess_->set_item(xaddr.c_str(), s_addr)); + + // Create another reservation for 2001:db8::2 + ostringstream shost2; + shost2 << xpath + "/host[identifier-type='hw-address']" + << "[identifier='00:01:0a:0b:0c:0d']"; + const string xaddr2 = shost2.str() + "/ip-addresses"; + S_Val s_addr2(new Val("2001:db8::2")); + EXPECT_NO_THROW(sess_->set_item(xaddr2.c_str(), s_addr2)); + + // Get the host. + ConstElementPtr hosts; + EXPECT_NO_THROW(hosts = t_obj_->getHosts(xpath)); + ASSERT_TRUE(hosts); + + EXPECT_EQ(hosts->str(), + "[ { \"hw-address\": \"00:01:02:03:04:05\", " + "\"ip-addresses\": [ \"2001:db8::1\" ] }, " + "{ \"hw-address\": \"00:01:0a:0b:0c:0d\", " + "\"ip-addresses\": [ \"2001:db8::2\" ] } ]"); +} + +}; // end of anonymous namespace |