]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#3587] Added UTs to test deprecation
authorThomas Markwalder <tmark@isc.org>
Thu, 17 Oct 2024 19:46:39 +0000 (15:46 -0400)
committerThomas Markwalder <tmark@isc.org>
Mon, 28 Oct 2024 11:58:38 +0000 (07:58 -0400)
/src/bin/dhcp4/tests/config_parser_unittest.cc
    TEST_F(Dhcp4ParserTest, deprecatedRequireClientClassesCheck)
    TEST_F(Dhcp4ParserTest, deprecatedOnlyIfRequiredCheck) - consolidated tests

/src/bin/dhcp6/tests/config_parser_unittest.cc
    TEST_F(Dhcp6ParserTest, deprecatedRequireClientClassesCheck)
    TEST_F(Dhcp6ParserTest, deprecatedOnlyIfRequiredCheck) - consolidated tests

/src/lib/dhcpsrv/parsers/base_network_parser.cc
    fixed typo

/src/lib/dhcpsrv/parsers/client_class_def_parser.cc
    fixed typo

/src/lib/dhcpsrv/tests/client_class_def_parser_unittest.cc
    TEST_F(ClientClassDefParserTest, deprecatedOnlyIfRequired)  - new test

/src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc
    TEST_F(DhcpParserTest, deprecatedRequireClientClassesSubnet4)
    TEST_F(DhcpParserTest, deprecatedRequireClientClassesSubnet6)
    TEST_F(DhcpParserTest, deprecatedRequireClientClassesPool4)
    TEST_F(DhcpParserTest, deprecatedRequireClientClassesPool6) - new tests

/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc
    TEST_F(SharedNetwork4ParserTest, deprecatedRequireClientClasses)
    TEST_F(SharedNetwork6ParserTest, deprecatedRequireClientClasses) - new tests

src/bin/dhcp4/tests/config_parser_unittest.cc
src/bin/dhcp6/tests/config_parser_unittest.cc
src/lib/dhcpsrv/parsers/base_network_parser.cc
src/lib/dhcpsrv/parsers/client_class_def_parser.cc
src/lib/dhcpsrv/tests/client_class_def_parser_unittest.cc
src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc
src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc

index 8e8d1616727ab8bb44e9f44480d8f947ec285db8..5af406ca6253bd03b7a754d5db24b71b27a5e7b3 100644 (file)
@@ -8111,9 +8111,12 @@ TEST_F(Dhcp4ParserTest, optionClientClassesDuplicateCheck) {
     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,
@@ -8143,12 +8146,9 @@ TEST_F(Dhcp4ParserTest, deprecatedRequireClientClassesCheck) {
     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,
@@ -8162,20 +8162,20 @@ TEST_F(Dhcp4ParserTest, deprecatedRequireClientClassesCheck2) {
         "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,
@@ -8203,12 +8203,9 @@ TEST_F(Dhcp4ParserTest, deprecatedOnlyIfRequiredCheck) {
     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,
@@ -8221,15 +8218,13 @@ TEST_F(Dhcp4ParserTest, deprecatedOnlyIfRequiredCheck2) {
         "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
index b0ec9d399af2a5790719750a305f7e8bd72b6708..0d542609b3be1ba96898c39b848720c164580636 100644 (file)
@@ -9096,9 +9096,11 @@ TEST_F(Dhcp6ParserTest, optionClientClassesDuplicateCheck) {
     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,
@@ -9128,12 +9130,9 @@ TEST_F(Dhcp6ParserTest, deprecatedRequireClientClassesCheck) {
     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,
@@ -9147,21 +9146,20 @@ TEST_F(Dhcp6ParserTest, deprecatedRequireClientClassesCheck2) {
         "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,
@@ -9189,12 +9187,9 @@ TEST_F(Dhcp6ParserTest, deprecatedOnlyIfRequiredCheck) {
     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,
@@ -9207,15 +9202,13 @@ TEST_F(Dhcp6ParserTest, deprecatedOnlyIfRequiredCheck2) {
         "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
index 01da86dcd4895565e20a926590af00fe89278d4b..d9ad7758ec238ea792dabe9c9507f23274bc792d 100644 (file)
@@ -264,7 +264,7 @@ BaseNetworkParser::getAdditionalClassesElem(ConstElementPtr params,
         } 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.");
         }
     }
 
index fbe0f188f1ceb5aeda5c82e3481813ecda40c156..2b34797dd2d77c45b8e1d359f20a99d6c429a9f1 100644 (file)
@@ -181,7 +181,7 @@ ClientClassDefParser::parse(ClientClassDictionaryPtr& class_dictionary,
         } 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.");
         }
     }
             
index 80da5f3b3b71cb515f279662a89c51614aff7716..c0fb848903004ee0000cb9f7735123e79f7f016d 100644 (file)
@@ -2148,4 +2148,34 @@ TEST_F(ClientClassDefParserTest, offerLftInvalid) {
                      " (<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
index d9fa7332040f83e0c1f265ea7d6991b913a3c805..109b83294e55ee57024a17839d249599a3e6178b 100644 (file)
@@ -34,6 +34,7 @@
 #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>
@@ -3736,5 +3737,183 @@ TEST_F(ParseConfigTest, subnet4InvalidOfferLft) {
     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
index a5cfa258eb2ab4dcf0e679ad1381a6e837c6ca21..67745d9d698de6bf633de01e383296c6ff6fab76 100644 (file)
@@ -1043,5 +1043,92 @@ TEST_F(SharedNetwork6ParserTest, parseFLQAllocatorPD) {
     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