EXPECT_FALSE(offer->getYiaddr().isV4Zero());
}
-// Checks if the client-class field is indeed used for pool selection.
-TEST_F(Dhcpv4SrvTest, clientPoolClassify) {
- IfaceMgrTestConfig test_config(true);
- IfaceMgr::instance().openSockets4();
-
- NakedDhcpv4Srv srv(0);
-
- // This test configures 2 pools.
- // The second pool does not play any role here. The client's
- // IP address belongs to the first pool, so only that first
- // pool is being tested.
- string config = "{ \"interfaces-config\": {"
- " \"interfaces\": [ \"*\" ]"
- "},"
- "\"rebind-timer\": 2000, "
- "\"renew-timer\": 1000, "
- "\"subnet4\": [ "
- "{ \"pools\": [ { "
- " \"pool\": \"192.0.2.1 - 192.0.2.100\", "
- " \"client-class\": \"foo\" }, "
- " { \"pool\": \"192.0.3.1 - 192.0.3.100\", "
- " \"client-class\": \"xyzzy\" } ], "
- " \"subnet\": \"192.0.0.0/16\" } "
- "],"
- "\"valid-lifetime\": 4000 }";
-
- ConstElementPtr json;
- ASSERT_NO_THROW(json = parseDHCP4(config, true));
-
- ConstElementPtr status;
- EXPECT_NO_THROW(status = configureDhcp4Server(srv, json));
-
- CfgMgr::instance().commit();
-
- // check if returned status is OK
- ASSERT_TRUE(status);
- comment_ = config::parseAnswer(rcode_, status);
- ASSERT_EQ(0, rcode_);
-
- // Create a simple packet that we'll use for classification
- Pkt4Ptr dis = Pkt4Ptr(new Pkt4(DHCPDISCOVER, 1234));
- dis->setRemoteAddr(IOAddress("192.0.2.1"));
- dis->setCiaddr(IOAddress("192.0.2.1"));
- dis->setIface("eth0");
- OptionPtr clientid = generateClientId();
- dis->addOption(clientid);
-
- // This discover does not belong to foo class, so it will not
- // be serviced
- Pkt4Ptr offer = srv.processDiscover(dis);
- EXPECT_FALSE(offer);
-
- // Let's add the packet to bar class and try again.
- dis->addClass("bar");
-
- // Still not supported, because it belongs to wrong class.
- offer = srv.processDiscover(dis);
- EXPECT_FALSE(offer);
-
- // Let's add it to matching class.
- dis->addClass("foo");
-
- // This time it should work
- offer = srv.processDiscover(dis);
- ASSERT_TRUE(offer);
- EXPECT_EQ(DHCPOFFER, offer->getType());
- EXPECT_FALSE(offer->getYiaddr().isV4Zero());
-}
-
// Verifies last resort option 43 is backward compatible
TEST_F(Dhcpv4SrvTest, option43LastResort) {
IfaceMgrTestConfig test_config(true);
EXPECT_TRUE(pool->clientSupported(three_classes));
}
-// This test checks that handling for multiple client-classes is valid.
-TEST(Pool4Test, clientClasses) {
- // Create a pool.
- Pool4Ptr pool(new Pool4(IOAddress("192.0.2.0"),
- IOAddress("192.0.2.255")));
-
- // This client does not belong to any class.
- isc::dhcp::ClientClasses no_class;
-
- // This client belongs to foo only.
- isc::dhcp::ClientClasses foo_class;
- foo_class.insert("foo");
-
- // This client belongs to bar only. I like that client.
- isc::dhcp::ClientClasses bar_class;
- bar_class.insert("bar");
-
- // No class restrictions defined, any client should be supported
- EXPECT_EQ(0, pool->getClientClasses().size());
- EXPECT_TRUE(pool->clientSupported(no_class));
- EXPECT_TRUE(pool->clientSupported(foo_class));
- EXPECT_TRUE(pool->clientSupported(bar_class));
-
- // Let's allow clients belonging to "bar" or "foo" class.
- pool->allowClientClass("bar");
- pool->allowClientClass("foo");
- EXPECT_EQ(2, pool->getClientClasses().size());
-
- // Class-less clients are to be rejected.
- EXPECT_FALSE(pool->clientSupported(no_class));
-
- // Clients in foo class should be accepted.
- EXPECT_TRUE(pool->clientSupported(foo_class));
-
- // Clients in bar class should be accepted as well.
- EXPECT_TRUE(pool->clientSupported(bar_class));
-}
-
// This test checks that handling for require-client-classes is valid.
TEST(Pool4Test, requiredClasses) {
// Create a pool.
EXPECT_TRUE(pool.clientSupported(three_classes));
}
-// This test checks that handling for multiple client-classes is valid.
-TEST(Pool6Test, clientClasses) {
- // Create a pool.
- Pool6 pool(Lease::TYPE_NA, IOAddress("2001:db8::1"),
- IOAddress("2001:db8::2"));
-
- // This client does not belong to any class.
- isc::dhcp::ClientClasses no_class;
-
- // This client belongs to foo only.
- isc::dhcp::ClientClasses foo_class;
- foo_class.insert("foo");
-
- // This client belongs to bar only. I like that client.
- isc::dhcp::ClientClasses bar_class;
- bar_class.insert("bar");
-
- // No class restrictions defined, any client should be supported
- EXPECT_EQ(0, pool.getClientClasses().size());
- EXPECT_TRUE(pool.clientSupported(no_class));
- EXPECT_TRUE(pool.clientSupported(foo_class));
- EXPECT_TRUE(pool.clientSupported(bar_class));
-
- // Let's allow clients belonging to "bar" or "foo" class.
- pool.allowClientClass("bar");
- pool.allowClientClass("foo");
- EXPECT_EQ(2, pool.getClientClasses().size());
-
- // Class-less clients are to be rejected.
- EXPECT_FALSE(pool.clientSupported(no_class));
-
- // Clients in foo class should be accepted.
- EXPECT_TRUE(pool.clientSupported(foo_class));
-
- // Clients in bar class should be accepted as well.
- EXPECT_TRUE(pool.clientSupported(bar_class));
-}
-
// This test checks that handling for require-client-classes is valid.
TEST(Pool6Test, requiredClasses) {
// Create a pool.