Browse Source

[3242] Adjusted unit tests to use correct subnets.

This change was necessary, because the recent changes to DHCPv4 imply that
subnet is selected for directly connected clients by matching the IPv4
address of the interface on which the message is received, with the
configured subnet.
Marcin Siodelski 11 years ago
parent
commit
a435b27fe1
2 changed files with 28 additions and 22 deletions
  1. 27 21
      src/bin/dhcp4/tests/dhcp4_srv_unittest.cc
  2. 1 1
      src/bin/dhcp4/tests/dhcp4_test_utils.cc

+ 27 - 21
src/bin/dhcp4/tests/dhcp4_srv_unittest.cc

@@ -66,7 +66,7 @@ TEST_F(Dhcpv4SrvFakeIfaceTest, adjustIfaceDataRelay) {
     boost::shared_ptr<Pkt4> req(new Pkt4(DHCPDISCOVER, 1234));
     boost::shared_ptr<Pkt4> req(new Pkt4(DHCPDISCOVER, 1234));
     // Set the giaddr to non-zero address and hops to non-zero value
     // Set the giaddr to non-zero address and hops to non-zero value
     // as if it was relayed.
     // as if it was relayed.
-    req->setGiaddr(IOAddress("192.0.2.1"));
+    req->setGiaddr(IOAddress("192.0.1.1"));
     req->setHops(2);
     req->setHops(2);
     // Set ciaddr to zero. This simulates the client which applies
     // Set ciaddr to zero. This simulates the client which applies
     // for the new lease.
     // for the new lease.
@@ -75,7 +75,7 @@ TEST_F(Dhcpv4SrvFakeIfaceTest, adjustIfaceDataRelay) {
     req->setFlags(0x0000);
     req->setFlags(0x0000);
 
 
     // Set local address, port and interface.
     // Set local address, port and interface.
-    req->setLocalAddr(IOAddress("192.0.3.1"));
+    req->setLocalAddr(IOAddress("192.0.2.1"));
     req->setLocalPort(1001);
     req->setLocalPort(1001);
     req->setIface("eth0");
     req->setIface("eth0");
     req->setIndex(1);
     req->setIndex(1);
@@ -84,7 +84,7 @@ TEST_F(Dhcpv4SrvFakeIfaceTest, adjustIfaceDataRelay) {
     // been created and new address allocated. This address is
     // been created and new address allocated. This address is
     // stored in yiaddr field.
     // stored in yiaddr field.
     boost::shared_ptr<Pkt4> resp(new Pkt4(DHCPOFFER, 1234));
     boost::shared_ptr<Pkt4> resp(new Pkt4(DHCPOFFER, 1234));
-    resp->setYiaddr(IOAddress("192.0.2.100"));
+    resp->setYiaddr(IOAddress("192.0.1.100"));
     // Clear the remote address.
     // Clear the remote address.
     resp->setRemoteAddr(IOAddress("0.0.0.0"));
     resp->setRemoteAddr(IOAddress("0.0.0.0"));
     // Set hops value for the response.
     // Set hops value for the response.
@@ -94,11 +94,11 @@ TEST_F(Dhcpv4SrvFakeIfaceTest, adjustIfaceDataRelay) {
     ASSERT_NO_THROW(NakedDhcpv4Srv::adjustIfaceData(req, resp));
     ASSERT_NO_THROW(NakedDhcpv4Srv::adjustIfaceData(req, resp));
 
 
     // Now the destination address should be relay's address.
     // Now the destination address should be relay's address.
-    EXPECT_EQ("192.0.2.1", resp->getRemoteAddr().toText());
+    EXPECT_EQ("192.0.1.1", resp->getRemoteAddr().toText());
     // The query has been relayed, so the response must be sent to the port 67.
     // The query has been relayed, so the response must be sent to the port 67.
     EXPECT_EQ(DHCP4_SERVER_PORT, resp->getRemotePort());
     EXPECT_EQ(DHCP4_SERVER_PORT, resp->getRemotePort());
     // Local address should be copied from the query message.
     // Local address should be copied from the query message.
-    EXPECT_EQ("192.0.3.1", resp->getLocalAddr().toText());
+    EXPECT_EQ("192.0.2.1", resp->getLocalAddr().toText());
     // The local port is always DHCPv4 server port 67.
     // The local port is always DHCPv4 server port 67.
     EXPECT_EQ(DHCP4_SERVER_PORT, resp->getLocalPort());
     EXPECT_EQ(DHCP4_SERVER_PORT, resp->getLocalPort());
     // We will send response over the same interface which was used to receive
     // We will send response over the same interface which was used to receive
@@ -109,18 +109,18 @@ TEST_F(Dhcpv4SrvFakeIfaceTest, adjustIfaceDataRelay) {
     // Let's do another test and set other fields: ciaddr and
     // Let's do another test and set other fields: ciaddr and
     // flags. By doing it, we want to make sure that the relay
     // flags. By doing it, we want to make sure that the relay
     // address will take precedence.
     // address will take precedence.
-    req->setGiaddr(IOAddress("192.0.2.50"));
+    req->setGiaddr(IOAddress("192.0.1.50"));
-    req->setCiaddr(IOAddress("192.0.2.11"));
+    req->setCiaddr(IOAddress("192.0.1.11"));
     req->setFlags(Pkt4::FLAG_BROADCAST_MASK);
     req->setFlags(Pkt4::FLAG_BROADCAST_MASK);
 
 
-    resp->setYiaddr(IOAddress("192.0.2.100"));
+    resp->setYiaddr(IOAddress("192.0.1.100"));
     // Clear remote address.
     // Clear remote address.
     resp->setRemoteAddr(IOAddress("0.0.0.0"));
     resp->setRemoteAddr(IOAddress("0.0.0.0"));
 
 
     ASSERT_NO_THROW(NakedDhcpv4Srv::adjustIfaceData(req, resp));
     ASSERT_NO_THROW(NakedDhcpv4Srv::adjustIfaceData(req, resp));
 
 
     // Response should be sent back to the relay address.
     // Response should be sent back to the relay address.
-    EXPECT_EQ("192.0.2.50", resp->getRemoteAddr().toText());
+    EXPECT_EQ("192.0.1.50", resp->getRemoteAddr().toText());
 }
 }
 
 
 // This test verifies that the destination address of the response message
 // This test verifies that the destination address of the response message
@@ -136,7 +136,7 @@ TEST_F(Dhcpv4SrvFakeIfaceTest, adjustIfaceDataRenew) {
     // Set ciaddr to non-zero address. The response should be sent to this
     // Set ciaddr to non-zero address. The response should be sent to this
     // address as the client is in renewing or rebinding state (it is fully
     // address as the client is in renewing or rebinding state (it is fully
     // configured).
     // configured).
-    req->setCiaddr(IOAddress("192.0.2.15"));
+    req->setCiaddr(IOAddress("192.0.1.15"));
     // Let's configure broadcast flag. It should be ignored because
     // Let's configure broadcast flag. It should be ignored because
     // we are responding directly to the client having an address
     // we are responding directly to the client having an address
     // and trying to extend his lease. Broadcast flag is only used
     // and trying to extend his lease. Broadcast flag is only used
@@ -147,7 +147,7 @@ TEST_F(Dhcpv4SrvFakeIfaceTest, adjustIfaceDataRenew) {
     // This is a direct message, so the hops should be cleared.
     // This is a direct message, so the hops should be cleared.
     req->setHops(0);
     req->setHops(0);
     // Set local unicast address as if we are renewing a lease.
     // Set local unicast address as if we are renewing a lease.
-    req->setLocalAddr(IOAddress("192.0.3.1"));
+    req->setLocalAddr(IOAddress("192.0.2.1"));
     // Request is received on the DHCPv4 server port.
     // Request is received on the DHCPv4 server port.
     req->setLocalPort(DHCP4_SERVER_PORT);
     req->setLocalPort(DHCP4_SERVER_PORT);
     // Set the interface. The response should be sent over the same interface.
     // Set the interface. The response should be sent over the same interface.
@@ -160,7 +160,7 @@ TEST_F(Dhcpv4SrvFakeIfaceTest, adjustIfaceDataRenew) {
     // it will actually get different address. The response
     // it will actually get different address. The response
     // should not be sent to this address but rather to ciaddr
     // should not be sent to this address but rather to ciaddr
     // as client still have ciaddr configured.
     // as client still have ciaddr configured.
-    resp->setYiaddr(IOAddress("192.0.2.13"));
+    resp->setYiaddr(IOAddress("192.0.1.13"));
     // Clear the remote address.
     // Clear the remote address.
     resp->setRemoteAddr(IOAddress("0.0.0.0"));
     resp->setRemoteAddr(IOAddress("0.0.0.0"));
     // Copy hops value from the query.
     // Copy hops value from the query.
@@ -169,13 +169,13 @@ TEST_F(Dhcpv4SrvFakeIfaceTest, adjustIfaceDataRenew) {
     ASSERT_NO_THROW(NakedDhcpv4Srv::adjustIfaceData(req, resp));
     ASSERT_NO_THROW(NakedDhcpv4Srv::adjustIfaceData(req, resp));
 
 
     // Check that server responds to ciaddr
     // Check that server responds to ciaddr
-    EXPECT_EQ("192.0.2.15", resp->getRemoteAddr().toText());
+    EXPECT_EQ("192.0.1.15", resp->getRemoteAddr().toText());
     // The query was non-relayed, so the response should be sent to a DHCPv4
     // The query was non-relayed, so the response should be sent to a DHCPv4
     // client port 68.
     // client port 68.
     EXPECT_EQ(DHCP4_CLIENT_PORT, resp->getRemotePort());
     EXPECT_EQ(DHCP4_CLIENT_PORT, resp->getRemotePort());
     // The response should be sent from the unicast address on which the
     // The response should be sent from the unicast address on which the
     // query has been received.
     // query has been received.
-    EXPECT_EQ("192.0.3.1", resp->getLocalAddr().toText());
+    EXPECT_EQ("192.0.2.1", resp->getLocalAddr().toText());
     // The response should be sent from the DHCPv4 server port.
     // The response should be sent from the DHCPv4 server port.
     EXPECT_EQ(DHCP4_SERVER_PORT, resp->getLocalPort());
     EXPECT_EQ(DHCP4_SERVER_PORT, resp->getLocalPort());
     // The interface data should match the data in the query.
     // The interface data should match the data in the query.
@@ -216,7 +216,7 @@ TEST_F(Dhcpv4SrvFakeIfaceTest, adjustIfaceDataSelect) {
     // Create a response.
     // Create a response.
     boost::shared_ptr<Pkt4> resp(new Pkt4(DHCPOFFER, 1234));
     boost::shared_ptr<Pkt4> resp(new Pkt4(DHCPOFFER, 1234));
     // Assign some new address for this client.
     // Assign some new address for this client.
-    resp->setYiaddr(IOAddress("192.0.2.13"));
+    resp->setYiaddr(IOAddress("192.0.1.13"));
     // Clear the remote address.
     // Clear the remote address.
     resp->setRemoteAddr(IOAddress("0.0.0.0"));
     resp->setRemoteAddr(IOAddress("0.0.0.0"));
     // Copy hops count.
     // Copy hops count.
@@ -244,7 +244,7 @@ TEST_F(Dhcpv4SrvFakeIfaceTest, adjustIfaceDataSelect) {
     // Although the query has been sent to the broadcast address, the
     // Although the query has been sent to the broadcast address, the
     // server should select a unicast address on the particular interface
     // server should select a unicast address on the particular interface
     // as a source address for the response.
     // as a source address for the response.
-    EXPECT_EQ("192.0.3.1", resp->getLocalAddr().toText());
+    EXPECT_EQ("192.0.2.1", resp->getLocalAddr().toText());
 
 
     // The response should be sent from the DHCPv4 server port.
     // The response should be sent from the DHCPv4 server port.
     EXPECT_EQ(DHCP4_SERVER_PORT, resp->getLocalPort());
     EXPECT_EQ(DHCP4_SERVER_PORT, resp->getLocalPort());
@@ -266,7 +266,7 @@ TEST_F(Dhcpv4SrvFakeIfaceTest, adjustIfaceDataSelect) {
     // address assigned for the client.
     // address assigned for the client.
     ASSERT_NO_THROW(NakedDhcpv4Srv::adjustIfaceData(req, resp));
     ASSERT_NO_THROW(NakedDhcpv4Srv::adjustIfaceData(req, resp));
 
 
-    EXPECT_EQ("192.0.2.13", resp->getRemoteAddr().toText());
+    EXPECT_EQ("192.0.1.13", resp->getRemoteAddr().toText());
 }
 }
 
 
 // This test verifies that the destination address of the response message
 // This test verifies that the destination address of the response message
@@ -296,7 +296,7 @@ TEST_F(Dhcpv4SrvFakeIfaceTest, adjustIfaceDataBroadcast) {
     // Create a response.
     // Create a response.
     boost::shared_ptr<Pkt4> resp(new Pkt4(DHCPOFFER, 1234));
     boost::shared_ptr<Pkt4> resp(new Pkt4(DHCPOFFER, 1234));
     // Assign some new address for this client.
     // Assign some new address for this client.
-    resp->setYiaddr(IOAddress("192.0.2.13"));
+    resp->setYiaddr(IOAddress("192.0.1.13"));
 
 
     // Clear the remote address.
     // Clear the remote address.
     resp->setRemoteAddr(IOAddress("0.0.0.0"));
     resp->setRemoteAddr(IOAddress("0.0.0.0"));
@@ -310,7 +310,7 @@ TEST_F(Dhcpv4SrvFakeIfaceTest, adjustIfaceDataBroadcast) {
     // Although the query has been sent to the broadcast address, the
     // Although the query has been sent to the broadcast address, the
     // server should select a unicast address on the particular interface
     // server should select a unicast address on the particular interface
     // as a source address for the response.
     // as a source address for the response.
-    EXPECT_EQ("192.0.3.1", resp->getLocalAddr().toText());
+    EXPECT_EQ("192.0.2.1", resp->getLocalAddr().toText());
 
 
     // The response should be sent from the DHCPv4 server port.
     // The response should be sent from the DHCPv4 server port.
     EXPECT_EQ(DHCP4_SERVER_PORT, resp->getLocalPort());
     EXPECT_EQ(DHCP4_SERVER_PORT, resp->getLocalPort());
@@ -1065,7 +1065,7 @@ TEST_F(Dhcpv4SrvFakeIfaceTest, acceptServerId) {
     // Add a server id being an IPv4 address configured on eth0 interface.
     // Add a server id being an IPv4 address configured on eth0 interface.
     // A DHCPv4 message holding this server identifier should be accepted.
     // A DHCPv4 message holding this server identifier should be accepted.
     OptionCustomPtr eth0_serverid(new OptionCustom(def, Option::V6));
     OptionCustomPtr eth0_serverid(new OptionCustom(def, Option::V6));
-    eth0_serverid->writeAddress(IOAddress("192.0.3.1"));
+    eth0_serverid->writeAddress(IOAddress("192.0.2.1"));
     ASSERT_NO_THROW(pkt->addOption(eth0_serverid));
     ASSERT_NO_THROW(pkt->addOption(eth0_serverid));
     EXPECT_TRUE(srv.acceptServerId(pkt));
     EXPECT_TRUE(srv.acceptServerId(pkt));
 
 
@@ -1766,7 +1766,13 @@ public:
         buf.push_back(1); // length (just one byte)
         buf.push_back(1); // length (just one byte)
         buf.push_back(static_cast<uint8_t>(DHCPDISCOVER));
         buf.push_back(static_cast<uint8_t>(DHCPDISCOVER));
 
 
-        return (Pkt4Ptr(new Pkt4(&buf[0], buf.size())));
+        Pkt4Ptr dis(new Pkt4(&buf[0], buf.size()));
+        // Interface must be selected for a Discover. Server will use the interface
+        // name to select a subnet for a client. This test is using fake interfaces
+        // and the fake eth0 interface has IPv4 address matching the subnet
+        // currently configured for this test.
+        dis->setIface("eth0");
+        return (dis);
     }
     }
 
 
     /// Test callback that stores received callout name and pkt4 value
     /// Test callback that stores received callout name and pkt4 value

+ 1 - 1
src/bin/dhcp4/tests/dhcp4_test_utils.cc

@@ -414,7 +414,7 @@ Dhcpv4SrvFakeIfaceTest::Dhcpv4SrvFakeIfaceTest()
 
 
     // Add fake interfaces.
     // Add fake interfaces.
     ifacemgr.addInterface(createIface("lo", 0, "127.0.0.1"));
     ifacemgr.addInterface(createIface("lo", 0, "127.0.0.1"));
-    ifacemgr.addInterface(createIface("eth0", 1, "192.0.3.1"));
+    ifacemgr.addInterface(createIface("eth0", 1, "192.0.2.1"));
     ifacemgr.addInterface(createIface("eth1", 2, "10.0.0.1"));
     ifacemgr.addInterface(createIface("eth1", 2, "10.0.0.1"));
 
 
     // In order to use fake interfaces we have to supply the custom
     // In order to use fake interfaces we have to supply the custom