From: Tomek Mrugalski Date: Thu, 22 Dec 2011 13:07:40 +0000 (+0100) Subject: [1230] Implemented tests for DISCOVER and OFFER packet handling X-Git-Tag: trac2351_base~310^2~13^2~7 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=01a1b2f4d210c62fc1d7a9b53e7967057e93d331;p=thirdparty%2Fkea.git [1230] Implemented tests for DISCOVER and OFFER packet handling - added tests for processDiscover(), processOffer() in dhcpv4_srv - added test for setUintX in OptionTest - updates Pkt4Test (now unpack checks if mandatory Message Type option is present) --- diff --git a/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc b/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc index bb6bedee19..48182acb38 100644 --- a/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc +++ b/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc @@ -23,10 +23,12 @@ #include #include #include +#include using namespace std; using namespace isc; using namespace isc::dhcp; +using namespace isc::asiolink; namespace { const char* const INTERFACE_FILE = "interfaces.txt"; @@ -66,6 +68,30 @@ public: fakeifaces.close(); } + void MessageCheck(const boost::shared_ptr& q, + const boost::shared_ptr& a) { + ASSERT_TRUE(q); + ASSERT_TRUE(a); + + EXPECT_EQ(q->getHops(), a->getHops()); + EXPECT_EQ(q->getIface(), a->getIface()); + EXPECT_EQ(q->getIndex(), a->getIndex()); + EXPECT_EQ(q->getGiaddr(), a->getGiaddr()); + + // check that bare minimum of required options are there + EXPECT_TRUE(a->getOption(DHO_SUBNET_MASK)); + EXPECT_TRUE(a->getOption(DHO_ROUTERS)); + EXPECT_TRUE(a->getOption(DHO_DHCP_SERVER_IDENTIFIER)); + EXPECT_TRUE(a->getOption(DHO_DHCP_LEASE_TIME)); + EXPECT_TRUE(a->getOption(DHO_SUBNET_MASK)); + EXPECT_TRUE(a->getOption(DHO_ROUTERS)); + EXPECT_TRUE(a->getOption(DHO_DOMAIN_NAME)); + EXPECT_TRUE(a->getOption(DHO_DOMAIN_NAME_SERVERS)); + + // check that something is offered + EXPECT_TRUE(a->getYiaddr().toText() != "0.0.0.0"); + } + ~Dhcpv4SrvTest() { unlink(INTERFACE_FILE); }; @@ -85,37 +111,115 @@ TEST_F(Dhcpv4SrvTest, basic) { TEST_F(Dhcpv4SrvTest, processDiscover) { NakedDhcpv4Srv* srv = new NakedDhcpv4Srv(); + vector mac; + mac.resize(6); + for (int i = 0; i < 6; i++) { + mac[i] = 255 - i; + } boost::shared_ptr pkt(new Pkt4(DHCPDISCOVER, 1234)); + boost::shared_ptr offer; + + pkt->setIface("eth0"); + pkt->setIndex(17); + pkt->setHWAddr(1, 6, mac); + pkt->setRemoteAddr(IOAddress("192.0.2.56")); + pkt->setGiaddr(IOAddress("192.0.2.67")); + + // let's make it a relayed message + pkt->setHops(3); + pkt->setRemotePort(DHCP4_SERVER_PORT); // should not throw EXPECT_NO_THROW( - srv->processDiscover(pkt); + offer = srv->processDiscover(pkt); ); // should return something - EXPECT_TRUE(srv->processDiscover(pkt)); + ASSERT_TRUE(offer); + + EXPECT_EQ(DHCPOFFER, offer->getType()); + + // this is relayed message. It should be sent back to relay address. + EXPECT_EQ(pkt->getGiaddr(), offer->getRemoteAddr()); + + MessageCheck(pkt, offer); + + // now repeat the test for directly sent message + pkt->setHops(0); + pkt->setGiaddr(IOAddress("0.0.0.0")); + pkt->setRemotePort(DHCP4_CLIENT_PORT); + + EXPECT_NO_THROW( + offer = srv->processDiscover(pkt); + ); + + // should return something + ASSERT_TRUE(offer); + + EXPECT_EQ(DHCPOFFER, offer->getType()); + + // this is direct message. It should be sent back to origin, not + // to relay. + EXPECT_EQ(pkt->getRemoteAddr(), offer->getRemoteAddr()); + + MessageCheck(pkt, offer); - // TODO: Implement more reasonable tests before starting - // work on processSomething() method. delete srv; } TEST_F(Dhcpv4SrvTest, processRequest) { NakedDhcpv4Srv* srv = new NakedDhcpv4Srv(); + vector mac; + mac.resize(6); + for (int i = 0; i < 6; i++) { + mac[i] = i*10; + } - boost::shared_ptr pkt(new Pkt4(DHCPREQUEST, 1234)); + boost::shared_ptr req(new Pkt4(DHCPREQUEST, 1234)); + boost::shared_ptr ack; + + req->setIface("eth0"); + req->setIndex(17); + req->setHWAddr(1, 6, mac); + req->setRemoteAddr(IOAddress("192.0.2.56")); + req->setGiaddr(IOAddress("192.0.2.67")); // should not throw + ASSERT_NO_THROW( + ack = srv->processRequest(req); + ); + + // should return something + ASSERT_TRUE(ack); + + EXPECT_EQ(DHCPACK, ack->getType()); + + // this is relayed message. It should be sent back to relay address. + EXPECT_EQ(req->getGiaddr(), ack->getRemoteAddr()); + + MessageCheck(req, ack); + + // now repeat the test for directly sent message + req->setHops(0); + req->setGiaddr(IOAddress("0.0.0.0")); + req->setRemotePort(DHCP4_CLIENT_PORT); + EXPECT_NO_THROW( - srv->processRequest(pkt); + ack = srv->processDiscover(req); ); // should return something - EXPECT_TRUE(srv->processRequest(pkt)); + ASSERT_TRUE(ack); + + EXPECT_EQ(DHCPOFFER, ack->getType()); + + // this is direct message. It should be sent back to origin, not + // to relay. + EXPECT_EQ(ack->getRemoteAddr(), req->getRemoteAddr()); + + MessageCheck(req, ack); - // TODO: Implement more reasonable tests before starting - // work on processSomething() method. delete srv; } diff --git a/src/lib/dhcp/tests/iface_mgr_unittest.cc b/src/lib/dhcp/tests/iface_mgr_unittest.cc index 2e326bc1ba..67d809ec8f 100644 --- a/src/lib/dhcp/tests/iface_mgr_unittest.cc +++ b/src/lib/dhcp/tests/iface_mgr_unittest.cc @@ -405,6 +405,12 @@ TEST_F(IfaceMgrTest, sendReceive4) { sendPkt->setYiaddr(IOAddress("192.0.2.3")); sendPkt->setGiaddr(IOAddress("192.0.2.4")); + // unpack() now checks if mandatory DHCP_MESSAGE_TYPE is present + boost::shared_ptr