Commit 757a5b14 authored by Marcin Siodelski's avatar Marcin Siodelski
Browse files

[2902] Added unit test checking reception of the packet over INET DGRAM.

parent c6302d0c
......@@ -27,9 +27,14 @@ using namespace isc::dhcp;
namespace {
/// Port number used by tests.
const uint16_t PORT = 10067;
/// Size of the buffer holding received packets.
const size_t RECV_BUF_SIZE = 2048;
/// This class handles has simple algorithm checking
/// presence of loopback interface and initializing
/// its index.
class PktFilterInetTest : public ::testing::Test {
public:
PktFilterInetTest() {
......@@ -185,4 +190,67 @@ TEST_F(PktFilterInetTest, send) {
EXPECT_EQ(pkt->getHlen(), rcvd_pkt->getHlen());
}
// This test verifies that the DHCPv4 packet is correctly received via
// INET datagram socket and that it matches sent packet.
TEST_F(PktFilterInetTest, receive) {
// Let's create a DHCPv4 packet.
Pkt4Ptr pkt(new Pkt4(DHCPOFFER, 0));
ASSERT_TRUE(pkt);
// Set required fields.
pkt->setLocalAddr(IOAddress("127.0.0.1"));
pkt->setRemotePort(PORT);
pkt->setLocalPort(PORT + 1);
pkt->setIndex(ifindex_);
pkt->setIface(ifname_);
pkt->setHops(6);
pkt->setSecs(42);
pkt->setCiaddr(IOAddress("192.0.2.1"));
pkt->setSiaddr(IOAddress("192.0.2.2"));
pkt->setYiaddr(IOAddress("192.0.2.3"));
pkt->setGiaddr(IOAddress("192.0.2.4"));
// Create the on-wire data.
ASSERT_NO_THROW(pkt->pack());
// Packet will be sent over loopback interface.
Iface iface(ifname_, ifindex_);
IOAddress addr("127.0.0.1");
// Create an instance of the class which we are testing.
PktFilterInet pkt_filter;
// Open socket. We don't check that the socket has appropriate
// options and family set because we have checked that in the
// openSocket test already.
socket_ = pkt_filter.openSocket(iface, addr, PORT, false, false);
ASSERT_GE(socket_, 0);
// Send the packet over the socket.
ASSERT_NO_THROW(pkt_filter.send(iface, socket_, pkt));
// Receive the packet.
SocketInfo socket_info(socket_, IOAddress("127.0.0.1"), PORT);
Pkt4Ptr rcvd_pkt = pkt_filter.receive(iface, socket_info);
// Check that the packet has been correctly received.
ASSERT_TRUE(rcvd_pkt);
// Parse the packet.
ASSERT_NO_THROW(rcvd_pkt->unpack());
// Verify that the received packet matches sent packet.
EXPECT_EQ(pkt->getHops(), rcvd_pkt->getHops());
EXPECT_EQ(pkt->getOp(), rcvd_pkt->getOp());
EXPECT_EQ(pkt->getSecs(), rcvd_pkt->getSecs());
EXPECT_EQ(pkt->getFlags(), rcvd_pkt->getFlags());
EXPECT_EQ(pkt->getCiaddr(), rcvd_pkt->getCiaddr());
EXPECT_EQ(pkt->getSiaddr(), rcvd_pkt->getSiaddr());
EXPECT_EQ(pkt->getYiaddr(), rcvd_pkt->getYiaddr());
EXPECT_EQ(pkt->getGiaddr(), rcvd_pkt->getGiaddr());
EXPECT_EQ(pkt->getTransid(), rcvd_pkt->getTransid());
EXPECT_TRUE(pkt->getSname() == rcvd_pkt->getSname());
EXPECT_TRUE(pkt->getFile() == rcvd_pkt->getFile());
EXPECT_EQ(pkt->getHtype(), rcvd_pkt->getHtype());
EXPECT_EQ(pkt->getHlen(), rcvd_pkt->getHlen());
}
} // anonymous namespace
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment