// 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 #include 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 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_)); } } } }