2
0
mirror of https://gitlab.isc.org/isc-projects/kea synced 2025-09-05 08:25:16 +00:00
Files
kea/src/bin/dhcp6/tests/dhcp6_srv_unittest.cc
Tomek Mrugalski ebb759a07c Fix for distcheck and dhcp6 tests on NetBSD
- Fixed distcheck complaining about file left in src/bin/dhcp4
- Fixed socket binding problem in src/lib/dhcp/tests/iface_mgr
- Fixed OSError problem in src/bin/dhcp6/tests/dhcp6_test.py on NetBSD
2011-12-14 18:32:41 +01:00

146 lines
4.6 KiB
C++

// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
// PERFORMANCE OF THIS SOFTWARE.
#include <config.h>
#include <iostream>
#include <sstream>
#include <arpa/inet.h>
#include <gtest/gtest.h>
#include "dhcp/dhcp6.h"
#include "dhcp6/dhcp6_srv.h"
#include "dhcp/option6_ia.h"
using namespace std;
using namespace isc;
using namespace isc::dhcp;
// namespace has to be named, because friends are defined in Dhcpv6Srv class
// Maybe it should be isc::test?
namespace test {
class NakedDhcpv6Srv: public Dhcpv6Srv {
// "naked" Interface Manager, exposes internal fields
public:
NakedDhcpv6Srv():Dhcpv6Srv(DHCP6_SERVER_PORT + 10000) { }
boost::shared_ptr<Pkt6>
processSolicit(boost::shared_ptr<Pkt6>& request) {
return Dhcpv6Srv::processSolicit(request);
}
boost::shared_ptr<Pkt6>
processRequest(boost::shared_ptr<Pkt6>& request) {
return Dhcpv6Srv::processRequest(request);
}
};
class Dhcpv6SrvTest : public ::testing::Test {
public:
Dhcpv6SrvTest() {
}
};
TEST_F(Dhcpv6SrvTest, basic) {
// srv has stubbed interface detection. It will read
// interfaces.txt instead. It will pretend to have detected
// fe80::1234 link-local address on eth0 interface. Obviously
// an attempt to bind this socket will fail.
Dhcpv6Srv* srv = NULL;
ASSERT_NO_THROW( {
// open an unpriviledged port
srv = new Dhcpv6Srv(DHCP6_SERVER_PORT + 10000);
});
delete srv;
}
TEST_F(Dhcpv6SrvTest, Solicit_basic) {
NakedDhcpv6Srv* srv = NULL;
ASSERT_NO_THROW( srv = new NakedDhcpv6Srv(); );
// a dummy content for client-id
boost::shared_array<uint8_t> clntDuid(new uint8_t[32]);
for (int i = 0; i < 32; i++)
clntDuid[i] = 100 + i;
boost::shared_ptr<Pkt6> sol =
boost::shared_ptr<Pkt6>(new Pkt6(DHCPV6_SOLICIT,
1234, Pkt6::UDP));
boost::shared_ptr<Option6IA> ia =
boost::shared_ptr<Option6IA>(new Option6IA(D6O_IA_NA, 234));
ia->setT1(1501);
ia->setT2(2601);
sol->addOption(ia);
// Let's not send address in solicit yet
// boost::shared_ptr<Option6IAAddr> addr(new Option6IAAddr(D6O_IAADDR,
// IOAddress("2001:db8:1234:ffff::ffff"), 5001, 7001));
// ia->addOption(addr);
// sol->addOption(ia);
// constructed very simple SOLICIT message with:
// - client-id option (mandatory)
// - IA option (a request for address, without any addresses)
// expected returned ADVERTISE message:
// - copy of client-id
// - server-id
// - IA that includes IAADDR
boost::shared_ptr<Option> clientid =
boost::shared_ptr<Option>(new Option(Option::V6, D6O_CLIENTID,
clntDuid, 0, 16));
sol->addOption(clientid);
boost::shared_ptr<Pkt6> reply = srv->processSolicit(sol);
// check if we get response at all
ASSERT_TRUE( reply != boost::shared_ptr<Pkt6>() );
EXPECT_EQ( DHCPV6_ADVERTISE, reply->getType() );
EXPECT_EQ( 1234, reply->getTransid() );
boost::shared_ptr<Option> tmp = reply->getOption(D6O_IA_NA);
ASSERT_TRUE( tmp );
Option6IA* reply_ia = dynamic_cast<Option6IA*> ( tmp.get() );
EXPECT_EQ( 234, reply_ia->getIAID() );
// check that there's an address included
EXPECT_TRUE( reply_ia->getOption(D6O_IAADDR));
// check that server included our own client-id
tmp = reply->getOption(D6O_CLIENTID);
ASSERT_TRUE( tmp );
EXPECT_EQ(clientid->getType(), tmp->getType() );
ASSERT_EQ(clientid->len(), tmp->len() );
EXPECT_TRUE( clientid->getData() == tmp->getData() );
// check that server included its server-id
tmp = reply->getOption(D6O_SERVERID);
EXPECT_EQ(tmp->getType(), srv->getServerID()->getType() );
ASSERT_EQ(tmp->len(), srv->getServerID()->len() );
EXPECT_TRUE(tmp->getData() == srv->getServerID()->getData());
// more checks to be implemented
delete srv;
}
}