EXPECT_EQ(*cclasses, "bar");
}
-// This test verifies that require-client-classes gets translated
-// to evaluate-additional-classes.
+// This test verifies that deprecated require-client-classes
+// gets handled properly.
TEST_F(Dhcp4ParserTest, deprecatedRequireClientClassesCheck) {
+
+ // Verify that require-client-classes gets translated
+ // to additional classes.
std::string config = "{ " + genIfaceConfig() + ","
R"^(
"rebind-timer": 2000,
EXPECT_EQ(1, cclass_list.size());
auto cclasses = cclass_list.begin();
EXPECT_EQ(*cclasses, "foo");
-}
-// This test verifies that users cannot specify both
-// require-client-classes and evaluate-addtional-classes.
-TEST_F(Dhcp4ParserTest, deprecatedRequireClientClassesCheck2) {
- std::string config = "{ " + genIfaceConfig() + ","
+ // Now verify that users cannot specify both.
+ config = "{ " + genIfaceConfig() + ","
R"^(
"rebind-timer": 2000,
"renew-timer": 1000,
"valid-lifetime": 400
})^";
- ConstElementPtr json;
ASSERT_NO_THROW(json = parseDHCP4(config));
extractConfig(config);
- ConstElementPtr status;
ASSERT_NO_THROW(status = configureDhcp4Server(*srv_, json));
checkResult(status, 1,
"subnet configuration failed: cannot specify both 'require-client-classes'"
- " and 'evaluate-additional-classes'. Use only the latter.");
+ " and 'evaluate-additional-classes'. Use only the latter.");
}
-// This test verifies that only-if-required gets translated
-// to only-in-additional-list.
+// This test verifies that deprecated only-if-required
+// gets handled properly.
TEST_F(Dhcp4ParserTest, deprecatedOnlyIfRequiredCheck) {
+ // Verifies that only-if-required gets translated
+ // to only-in-additional-list.
std::string config = "{ " + genIfaceConfig() + ","
R"^(
"rebind-timer": 2000,
ClientClassDefPtr class_def = dictionary->findClass("foo");
ASSERT_TRUE(class_def);
EXPECT_TRUE(class_def->getAdditional());
-}
-// This test verifies that users cannot specify both
-// only-if-required and only-in-additional-list.
-TEST_F(Dhcp4ParserTest, deprecatedOnlyIfRequiredCheck2) {
- std::string config = "{ " + genIfaceConfig() + ","
+ // Now verify that users cannot specify both.
+ config = "{ " + genIfaceConfig() + ","
R"^(
"rebind-timer": 2000,
"renew-timer": 1000,
"valid-lifetime": 400
})^";
- ConstElementPtr json;
ASSERT_NO_THROW(json = parseDHCP4(config));
extractConfig(config);
- ConstElementPtr status;
ASSERT_NO_THROW(status = configureDhcp4Server(*srv_, json));
checkResult(status, 1,
"cannot specify both 'only-if-required' and"
- " 'only-in-additional-list'. Use only the latter.");
+ " 'only-in-additional-list'. Use only the latter.");
}
} // namespace
EXPECT_EQ(*cclasses, "bar");
}
-// This test verifies that require-client-classes gets translated
-// to evaluate-additional-classes.
+// This test verifies that deprecated require-client-classes
+// gets handled properly.
TEST_F(Dhcp6ParserTest, deprecatedRequireClientClassesCheck) {
+ // Verify that require-client-classes gets translated
+ // to evaluate-additional-classes.
std::string config = "{ " + genIfaceConfig() + ","
R"^(
"rebind-timer": 2000,
EXPECT_EQ(1, cclass_list.size());
auto cclasses = cclass_list.begin();
EXPECT_EQ(*cclasses, "foo");
-}
-// This test verifies that users cannot specify both
-// require-client-classes and evaluate-addtional-classes.
-TEST_F(Dhcp6ParserTest, deprecatedRequireClientClassesCheck2) {
- std::string config = "{ " + genIfaceConfig() + ","
+ // Now verify that users cannot specify both.
+ config = "{ " + genIfaceConfig() + ","
R"^(
"rebind-timer": 2000,
"renew-timer": 1000,
"valid-lifetime": 400
})^";
-
- ConstElementPtr json;
ASSERT_NO_THROW(json = parseDHCP6(config));
extractConfig(config);
- ConstElementPtr status;
ASSERT_NO_THROW(status = configureDhcp6Server(srv_, json));
- checkResult(status, 1,
+ checkResult(status, 1,
"subnet configuration failed: cannot specify both 'require-client-classes'"
- " and 'evaluate-additional-classes'. Use only the latter.");
+ " and 'evaluate-additional-classes'. Use only the latter.");
}
-// This test verifies that only-if-required gets translated
-// to only-in-additional-list.
+// This test verifies that deprecated only-if-required
+// gets handled properly.
TEST_F(Dhcp6ParserTest, deprecatedOnlyIfRequiredCheck) {
+ // Verify that only-if-required gets translated
+ // to only-in-additional-list.
std::string config = "{ " + genIfaceConfig() + ","
R"^(
"rebind-timer": 2000,
ClientClassDefPtr class_def = dictionary->findClass("foo");
ASSERT_TRUE(class_def);
EXPECT_TRUE(class_def->getAdditional());
-}
-// This test verifies that users cannot specify both
-// only-if-required and only-in-additional-list.
-TEST_F(Dhcp6ParserTest, deprecatedOnlyIfRequiredCheck2) {
- std::string config = "{ " + genIfaceConfig() + ","
+ // Now verify that users cannot specify both.
+ config = "{ " + genIfaceConfig() + ","
R"^(
"rebind-timer": 2000,
"renew-timer": 1000,
"valid-lifetime": 400
})^";
- ConstElementPtr json;
ASSERT_NO_THROW(json = parseDHCP6(config));
extractConfig(config);
- ConstElementPtr status;
ASSERT_NO_THROW(status = configureDhcp6Server(srv_, json));
- checkResult(status, 1,
+ checkResult(status, 1,
"cannot specify both 'only-if-required' and"
- " 'only-in-additional-list'. Use only the latter.");
+ " 'only-in-additional-list'. Use only the latter.");
}
} // namespace
} else {
isc_throw(isc::dhcp::DhcpConfigError,
"cannot specify both 'require-client-classes' and "
- "'evaluate-additional-classes'. Use only the latter.");
+ "'evaluate-additional-classes'. Use only the latter.");
}
}
} else {
isc_throw(isc::dhcp::DhcpConfigError,
"cannot specify both 'only-if-required' and "
- "'only-in-additional-list'. Use only the latter.");
+ "'only-in-additional-list'. Use only the latter.");
}
}
" (<string>:3:23)");
}
+TEST_F(ClientClassDefParserTest, deprecatedOnlyIfRequired) {
+ // Valid entry.
+ std::string cfg_text =
+ R"^({
+ "name": "foo",
+ "only-if-required": true
+ })^";
+
+ ClientClassDefPtr cclass;
+ ASSERT_NO_THROW(cclass = parseClientClassDef(cfg_text, AF_INET));
+
+ // Class should exist.
+ ASSERT_TRUE(cclass);
+ EXPECT_EQ("foo", cclass->getName());
+ ASSERT_TRUE(cclass->getAdditional());
+
+ // Invalid entry specifies both parameters.
+ std::string cfg_text2 =
+ R"^({
+ "name": "foo",
+ "only-if-required": true,
+ "only-in-additional-list": true
+ })^";
+
+ ASSERT_THROW_MSG(cclass = parseClientClassDef(cfg_text2, AF_INET),
+ DhcpConfigError,
+ "cannot specify both 'only-if-required' and "
+ "'only-in-additional-list'. Use only the latter.");
+}
+
} // end of anonymous namespace
#include <exceptions/exceptions.h>
#include <hooks/hooks_parser.h>
#include <hooks/hooks_manager.h>
+#include <testutils/gtest_utils.h>
#include <testutils/test_to_element.h>
#include <gtest/gtest.h>
ASSERT_NE(0, rcode);
}
+// Verify that deprecated require-client-classes is handled properly
+// by Subnet4 parser.
+TEST_F(DhcpParserTest, deprecatedRequireClientClassesSubnet4) {
+ // Valid entry.
+ std::string config =
+ R"^({
+ "id": 1,
+ "subnet": "192.0.2.0/24",
+ "require-client-classes": [ "one", "two" ]
+ })^";
+
+ ElementPtr config_element = Element::fromJSON(config);
+
+ // Parse configuration specified above.
+ Subnet4ConfigParser parser(AF_INET);
+ Subnet4Ptr subnet;
+
+ ASSERT_NO_THROW(subnet = parser.parse(config_element));
+ ASSERT_TRUE(subnet);
+
+ const auto cclasses = subnet->getAdditionalClasses();
+ EXPECT_EQ(cclasses.size(), 2);
+ auto cclass = cclasses.begin();
+ EXPECT_EQ(*cclass, "one");
+ ++cclass;
+ EXPECT_EQ(*cclass, "two");
+
+ // Invalid entry specifies both parameters.
+ config =
+ R"^({
+ "id": 1,
+ "subnet": "192.0.2.0/24",
+ "require-client-classes": [ "one", "two" ],
+ "evaluate-additional-classes": [ "one", "two" ]
+ })^";
+
+ config_element = Element::fromJSON(config);
+
+ // Should throw a complaint.
+ ASSERT_THROW_MSG(parser.parse(config_element),
+ DhcpConfigError,
+ "subnet configuration failed: "
+ "cannot specify both 'require-client-classes' and"
+ " 'evaluate-additional-classes'. Use only the latter.");
+}
+
+// Verify that deprecated require-client-classes is handled properly
+// by Subnet6 parser.
+TEST_F(DhcpParserTest, deprecatedRequireClientClassesSubnet6) {
+ // Valid entry.
+ std::string config =
+ R"^({
+ "id": 1,
+ "subnet": "2001:db8::/64",
+ "require-client-classes": [ "one", "two" ]
+ })^";
+
+ ElementPtr config_element = Element::fromJSON(config);
+
+ // Parse configuration specified above.
+ Subnet6ConfigParser parser(AF_INET);
+ Subnet6Ptr subnet;
+
+ ASSERT_NO_THROW(subnet = parser.parse(config_element));
+ ASSERT_TRUE(subnet);
+
+ const auto cclasses = subnet->getAdditionalClasses();
+ EXPECT_EQ(cclasses.size(), 2);
+ auto cclass = cclasses.begin();
+ EXPECT_EQ(*cclass, "one");
+ ++cclass;
+ EXPECT_EQ(*cclass, "two");
+
+ // Invalid entry specifies both parameters.
+ config =
+ R"^({
+ "id": 1,
+ "subnet": "2001:db8::/64",
+ "require-client-classes": [ "one", "two" ],
+ "evaluate-additional-classes": [ "one", "two" ]
+ })^";
+
+ config_element = Element::fromJSON(config);
+
+ // Should throw a complaint.
+ ASSERT_THROW_MSG(parser.parse(config_element),
+ DhcpConfigError,
+ "subnet configuration failed: "
+ "cannot specify both 'require-client-classes' and"
+ " 'evaluate-additional-classes'. Use only the latter.");
+}
+
+// Verify that deprecated require-client-classes is handled properly
+// by Pool4 parser.
+TEST_F(DhcpParserTest, deprecatedRequireClientClassesPool4) {
+ // Valid entry.
+ std::string config =
+ R"^({
+ "pool": "192.0.2.0/24",
+ "require-client-classes": [ "one", "two" ]
+ })^";
+
+ ElementPtr config_element = Element::fromJSON(config);
+
+ // Parse configuration specified above.
+ Pool4Parser parser;
+ PoolStoragePtr pools(new PoolStorage());
+
+ ASSERT_NO_THROW(parser.parse(pools, config_element, AF_INET));
+ EXPECT_EQ(1, pools->size());
+
+ const auto cclasses = (*pools)[0]->getAdditionalClasses();
+ EXPECT_EQ(cclasses.size(), 2);
+ auto cclass = cclasses.begin();
+ EXPECT_EQ(*cclass, "one");
+ ++cclass;
+ EXPECT_EQ(*cclass, "two");
+
+ // Invalid entry specifies both parameters.
+ config =
+ R"^({
+ "pool": "192.0.2.0/24",
+ "require-client-classes": [ "one", "two" ],
+ "evaluate-additional-classes": [ "one", "two" ]
+ })^";
+
+ config_element = Element::fromJSON(config);
+
+ // Should throw a complaint.
+ ASSERT_THROW_MSG(parser.parse(pools, config_element, AF_INET),
+ DhcpConfigError,
+ "cannot specify both 'require-client-classes' and"
+ " 'evaluate-additional-classes'. Use only the latter.");
+}
+
+// Verify that deprecated require-client-classes is handled properly
+// by Pool6 parser. We only test TYPE_NA and as the same code is
+// used for either v6 pool type.
+TEST_F(DhcpParserTest, deprecatedRequireClientClassesPool6) {
+ // Valid entry.
+ std::string config =
+ R"^({
+ "pool": "2001:db8::/64",
+ "require-client-classes": [ "one", "two" ]
+ })^";
+
+ ElementPtr config_element = Element::fromJSON(config);
+
+ // Parse configuration specified above.
+ Pool6Parser parser;
+ PoolStoragePtr pools(new PoolStorage());
+
+ ASSERT_NO_THROW(parser.parse(pools, config_element, AF_INET6, Lease::TYPE_NA));
+ EXPECT_EQ(1, pools->size());
+
+ const auto cclasses = (*pools)[0]->getAdditionalClasses();
+ EXPECT_EQ(cclasses.size(), 2);
+ auto cclass = cclasses.begin();
+ EXPECT_EQ(*cclass, "one");
+ ++cclass;
+ EXPECT_EQ(*cclass, "two");
+
+ // Invalid entry specifies both parameters.
+ config =
+ R"^({
+ "pool": "2001:db8::/64",
+ "require-client-classes": [ "one", "two" ],
+ "evaluate-additional-classes": [ "one", "two" ]
+ })^";
+
+ config_element = Element::fromJSON(config);
+
+ // Should throw a complaint.
+ ASSERT_THROW_MSG(parser.parse(pools, config_element, AF_INET6, Lease::TYPE_NA),
+ DhcpConfigError,
+ "cannot specify both 'require-client-classes' and"
+ " 'evaluate-additional-classes'. Use only the latter.");
+}
} // Anonymous namespace
EXPECT_EQ("flq", network->getPdAllocatorType().get());
}
+// Verify that deprecated require-client-classes is handled properly
+// by v4 parser.
+TEST_F(SharedNetwork4ParserTest, deprecatedRequireClientClasses) {
+ // Valid entry.
+ std::string config =
+ R"^({
+ "name": "foo",
+ "require-client-classes": [ "one", "two" ]
+ })^";
+
+ ElementPtr config_element = Element::fromJSON(config);
+
+ // Parse configuration specified above.
+ SharedNetwork4Parser parser;
+ SharedNetwork4Ptr network;
+
+ ASSERT_NO_THROW(network = parser.parse(config_element));
+ ASSERT_TRUE(network);
+
+ const auto cclasses = network->getAdditionalClasses();
+ EXPECT_EQ(cclasses.size(), 2);
+ auto cclass = cclasses.begin();
+ EXPECT_EQ(*cclass, "one");
+ ++cclass;
+ EXPECT_EQ(*cclass, "two");
+
+ // Invalid entry specifies both parameters.
+ config =
+ R"^({
+ "name": "foo",
+ "require-client-classes": [ "one", "two" ],
+ "evaluate-additional-classes": [ "one", "two" ]
+ })^";
+
+ config_element = Element::fromJSON(config);
+
+ // Should throw a complaint.
+ ASSERT_THROW_MSG(parser.parse(config_element),
+ DhcpConfigError,
+ "cannot specify both 'require-client-classes' and"
+ " 'evaluate-additional-classes'. Use only the latter.");
+}
+
+
+// Verify that deprecated require-client-classes is handled properly
+// by v6 parser.
+TEST_F(SharedNetwork6ParserTest, deprecatedRequireClientClasses) {
+ // Valid entry.
+ std::string config =
+ R"^({
+ "name": "foo",
+ "require-client-classes": [ "one", "two" ]
+ })^";
+
+ ElementPtr config_element = Element::fromJSON(config);
+
+ // Parse configuration specified above.
+ SharedNetwork6Parser parser;
+ SharedNetwork6Ptr network;
+
+ ASSERT_NO_THROW(network = parser.parse(config_element));
+ ASSERT_TRUE(network);
+
+ const auto cclasses = network->getAdditionalClasses();
+ EXPECT_EQ(cclasses.size(), 2);
+ auto cclass = cclasses.begin();
+ EXPECT_EQ(*cclass, "one");
+ ++cclass;
+ EXPECT_EQ(*cclass, "two");
+
+ // Invalid entry specifies both parameters.
+ config =
+ R"^({
+ "name": "foo",
+ "require-client-classes": [ "one", "two" ],
+ "evaluate-additional-classes": [ "one", "two" ]
+ })^";
+
+ config_element = Element::fromJSON(config);
+
+ // Should throw a complaint.
+ ASSERT_THROW_MSG(parser.parse(config_element),
+ DhcpConfigError,
+ "cannot specify both 'require-client-classes' and"
+ " 'evaluate-additional-classes'. Use only the latter."
+ " (<string>:1:2)");
+}
} // end of anonymous namespace