diff options
Diffstat (limited to 'src/bin/dhcp6/tests/dhcp6_message_test.cc')
-rw-r--r-- | src/bin/dhcp6/tests/dhcp6_message_test.cc | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/src/bin/dhcp6/tests/dhcp6_message_test.cc b/src/bin/dhcp6/tests/dhcp6_message_test.cc new file mode 100644 index 0000000..b47e242 --- /dev/null +++ b/src/bin/dhcp6/tests/dhcp6_message_test.cc @@ -0,0 +1,83 @@ +// Copyright (C) 2014-2020 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 <dhcp6/tests/dhcp6_message_test.h> + +using namespace isc::asiolink; + +namespace isc { +namespace dhcp { +namespace test { + +Dhcpv6MessageTest::Dhcpv6MessageTest() + : Dhcpv6SrvTest(), + iface_mgr_test_config_(true) { +} + +IOAddress +Dhcpv6MessageTest::bumpAddress(const IOAddress& input_addr) { + return (bumpByteInAddress(input_addr, V6ADDRESS_LEN - 1)); +} + +IOAddress +Dhcpv6MessageTest::bumpByteInAddress(const IOAddress& input_addr, + const size_t byte_num) { + std::vector<uint8_t> input_addr_buffer = input_addr.toBytes(); + if (input_addr_buffer.size() > byte_num) { + ++input_addr_buffer[byte_num]; + return (IOAddress::fromBytes(AF_INET6, &input_addr_buffer[0])); + } + return (input_addr); +} + +IOAddress +Dhcpv6MessageTest::bumpSubnet(const IOAddress& input_addr) { + return (bumpByteInAddress(input_addr, 0)); +} + +void +Dhcpv6MessageTest::requestLease(const std::string& config, + const int subnets_num, + Dhcp6Client& client) { + // Configure the server. + configure(config, *client.getServer()); + // Make sure we ended-up having expected number of subnets configured. + const Subnet6Collection* subnets = + CfgMgr::instance().getCurrentCfg()->getCfgSubnets6()->getAll(); + ASSERT_EQ(subnets_num, subnets->size()); + // Do the actual 4-way exchange. + ASSERT_NO_THROW(client.doSARR()); + // Simulate aging of leases, by moving their cltt_ back by 1000s. + client.fastFwdTime(1000); + // Make sure that we have obtained a lease that belongs to one of the + // subnets. + ASSERT_EQ(1, client.getLeaseNum()); + Lease6 lease_client = client.getLease(0); + + // Check if the lease belongs to one of the available pools. + bool pool_found = false; + auto subnet = subnets->begin(); + for (int i = 0; i < subnets_num; ++i, ++subnet) { + ASSERT_TRUE(subnet != subnets->end()); + if ((*subnet)->getPool(lease_client.type_, lease_client.addr_)) { + pool_found = true; + break; + } + } + ASSERT_TRUE(pool_found); + + // Check that the client's lease matches the information on the server + // side. + Lease6Ptr lease_server = checkLease(lease_client); + ASSERT_TRUE(lease_server); + // And that status code was OK. + ASSERT_EQ(STATUS_Success, client.getStatusCode(lease_client.iaid_)); +} + +} +} +} |