]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#3583] Added syntax UTs
authorFrancis Dupont <fdupont@isc.org>
Mon, 14 Oct 2024 15:45:19 +0000 (17:45 +0200)
committerThomas Markwalder <tmark@isc.org>
Tue, 15 Oct 2024 17:51:57 +0000 (13:51 -0400)
src/bin/dhcp4/tests/classify_unittest.cc
src/bin/dhcp4/tests/config_parser_unittest.cc
src/bin/dhcp4/tests/get_config_unittest.cc
src/bin/dhcp6/tests/classify_unittest.cc
src/bin/dhcp6/tests/config_parser_unittest.cc
src/bin/dhcp6/tests/get_config_unittest.cc

index 86007cc7cee254223c09e311e641b85f921c9639..340190b0266f68ce267fc7a90bfa8d5f9350c3d3 100644 (file)
@@ -1752,7 +1752,7 @@ TEST_F(ClassifyTest, vendorOptionClassTagTest) {
             "code": 103,
             "type": "string"
         }],
-        "option-data": [{ 
+        "option-data": [{
             "space": "vendor-4491",
             "code": 101,
             "csv-format": true,
@@ -1801,7 +1801,7 @@ TEST_F(ClassifyTest, vendorOptionClassTagTest) {
     // Add the ORO sub-option requesting all three sub-options.
     boost::shared_ptr<OptionUint8Array> vendor_oro(new OptionUint8Array(Option::V4,
                                                                         DOCSIS3_V4_ORO));
-    vendor_oro->addValue(101); 
+    vendor_oro->addValue(101);
     vendor_oro->addValue(102);
     vendor_oro->addValue(103);
     vendor->addOption(vendor_oro);
@@ -1832,7 +1832,7 @@ TEST_F(ClassifyTest, vendorOptionClassTagTest) {
     EXPECT_TRUE(vendor_resp->getOption(103));
 }
 
-// Verifies that a requested VIVCO suboption can be gated by 
+// Verifies that a requested VIVCO suboption can be gated by
 // option class tagging.
 TEST_F(ClassifyTest, vivcoOptionClassTagTest) {
     IfaceMgrTestConfig test_config(true);
@@ -1926,7 +1926,7 @@ TEST_F(ClassifyTest, vivcoOptionClassTagTest) {
     ASSERT_FALSE(tmp);
 }
 
-// Verifies that requested VIVSO suboption can be gated by 
+// Verifies that requested VIVSO suboption can be gated by
 // option class tagging.
 TEST_F(ClassifyTest, vivsoOptionClassTagTest) {
     IfaceMgrTestConfig test_config(true);
@@ -2105,7 +2105,7 @@ TEST_F(ClassifyTest, basicOptionClassTagTest) {
     tmp = response1->getOption(DHO_DOMAIN_NAME_SERVERS);
     EXPECT_TRUE(tmp);
 
-    // Verify that server id is present and is the configured value. 
+    // Verify that server id is present and is the configured value.
     checkServerIdentifier(response1, "192.0.2.0");
 
     // Try again with a client id that does not match "melon".
index 8c81dfad8e20047f80e10fa24cb7de1325fb3d38..0d2a2548d1c6acaa650e428dbbab98b8ea047b12 100644 (file)
@@ -8013,7 +8013,71 @@ TEST_F(Dhcp4ParserTest, storeDdnsConflictResolutionMode) {
     }
 }
 
-//This test verifies that duplicates in option-data.client-classes
+// This test verifies that class tagging can occur at any scope.
+TEST_F(Dhcp4ParserTest, classTagging) {
+    std::string config = "{ " + genIfaceConfig() + ","
+        R"^(
+        "option-data": [{
+             "name": "domain-name",
+             "data": "example.com",
+             "client-classes": [ "in-global" ]
+        }],
+        "valid-lifetime": 4000,
+        "rebind-timer": 2000,
+        "renew-timer": 1000,
+        "shared-networks": [{
+            "name": "foo",
+            "subnet4": [{
+                "id": 1,
+                "subnet": "192.0.2.0/24",
+                "option-data": [{
+                    "name": "domain-name",
+                    "data": "example.com",
+                    "client-classes": [ "in-subnet" ]
+                }],
+                "pools": [{
+                    "pool": "192.0.2.0/28",
+                    "option-data": [{
+                        "name": "domain-name",
+                        "data": "example.com",
+                        "client-classes": [ "in-pool" ]
+                     }]
+                }],
+                "reservations": [{
+                    "hw-address": "AA:BB:CC:DD:EE:FF",
+                    "option-data": [{
+                        "name": "domain-name",
+                        "data": "example.com",
+                        "client-classes": [ "in-reservation" ]
+                    }]
+               }]
+            }],
+            "option-data": [{
+                "name": "domain-name",
+                "data": "example.com",
+                "client-classes": [ "in-network" ]
+            }]
+        }],
+        "client-classes": [{
+            "name": "foo",
+            "option-data": [{
+                "name": "domain-name",
+                "data": "example.com",
+                "client-classes": [ "in-class" ]
+            }]
+        }]
+        })^";
+
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
+    extractConfig(config);
+
+    ConstElementPtr status;
+    ASSERT_NO_THROW(status = configureDhcp4Server(*srv_, json));
+    checkResult(status, 0);
+}
+
+// This test verifies that duplicates in option-data.client-classes
 // are ignored and do not affect class order.
 TEST_F(Dhcp4ParserTest, optionClientClassesDuplicateCheck) {
     std::string config = "{ " + genIfaceConfig() + ","
index 4f0119078ba78732f09186aa0b5d7b59cacb025e..c7a65db94d7d4ff35ae671fe6cb45204f91b2f9f 100644 (file)
@@ -2471,6 +2471,102 @@ const char* EXTRACTED_CONFIGS[] = {
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
+"    }\n",
+    // CONFIGURATION 78
+"{\n"
+"        \"client-classes\": [\n"
+"            {\n"
+"                \"name\": \"foo\",\n"
+"                \"option-data\": [\n"
+"                    {\n"
+"                        \"client-classes\": [ \"in-class\" ],\n"
+"                        \"data\": \"example.com\",\n"
+"                        \"name\": \"domain-name\"\n"
+"                    }\n"
+"                ]\n"
+"            }\n"
+"        ],\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"option-data\": [\n"
+"            {\n"
+"                \"client-classes\": [ \"in-global\" ],\n"
+"                \"data\": \"example.com\",\n"
+"                \"name\": \"domain-name\"\n"
+"            }\n"
+"        ],\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"renew-timer\": 1000,\n"
+"        \"shared-networks\": [\n"
+"            {\n"
+"                \"name\": \"foo\",\n"
+"                \"option-data\": [\n"
+"                    {\n"
+"                        \"client-classes\": [ \"in-network\" ],\n"
+"                        \"data\": \"example.com\",\n"
+"                        \"name\": \"domain-name\"\n"
+"                    }\n"
+"                ],\n"
+"                \"subnet4\": [\n"
+"                    {\n"
+"                        \"id\": 1,\n"
+"                        \"option-data\": [\n"
+"                            {\n"
+"                                \"client-classes\": [ \"in-subnet\" ],\n"
+"                                \"data\": \"example.com\",\n"
+"                                \"name\": \"domain-name\"\n"
+"                            }\n"
+"                        ],\n"
+"                        \"pools\": [\n"
+"                            {\n"
+"                                \"option-data\": [\n"
+"                                    {\n"
+"                                        \"client-classes\": [ \"in-pool\" ],\n"
+"                                        \"data\": \"example.com\",\n"
+"                                        \"name\": \"domain-name\"\n"
+"                                    }\n"
+"                                ],\n"
+"                                \"pool\": \"192.0.2.0/28\"\n"
+"                            }\n"
+"                        ],\n"
+"                        \"reservations\": [\n"
+"                            {\n"
+"                                \"hw-address\": \"AA:BB:CC:DD:EE:FF\",\n"
+"                                \"option-data\": [\n"
+"                                    {\n"
+"                                        \"client-classes\": [ \"in-reservation\" ],\n"
+"                                        \"data\": \"example.com\",\n"
+"                                        \"name\": \"domain-name\"\n"
+"                                    }\n"
+"                                ]\n"
+"                            }\n"
+"                        ],\n"
+"                        \"subnet\": \"192.0.2.0/24\"\n"
+"                    }\n"
+"                ]\n"
+"            }\n"
+"        ],\n"
+"        \"valid-lifetime\": 4000\n"
+"    }\n",
+    // CONFIGURATION 79
+"{\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"option-data\": [\n"
+"            {\n"
+"                \"client-classes\": [ \"foo\", \"bar\", \"foo\", \"bar\" ],\n"
+"                \"data\": \"example.com\",\n"
+"                \"name\": \"domain-name\"\n"
+"            }\n"
+"        ],\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"renew-timer\": 1000,\n"
+"        \"subnet4\": [ ],\n"
+"        \"valid-lifetime\": 400\n"
 "    }\n"
 };
 
@@ -12674,6 +12770,321 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t1-percent\": 0.5,\n"
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 4000\n"
+"    }\n",
+    // CONFIGURATION 78
+"{\n"
+"        \"allocator\": \"iterative\",\n"
+"        \"authoritative\": false,\n"
+"        \"boot-file-name\": \"\",\n"
+"        \"calculate-tee-times\": false,\n"
+"        \"client-classes\": [\n"
+"            {\n"
+"                \"boot-file-name\": \"\",\n"
+"                \"name\": \"foo\",\n"
+"                \"next-server\": \"0.0.0.0\",\n"
+"                \"option-data\": [\n"
+"                    {\n"
+"                        \"always-send\": false,\n"
+"                        \"client-classes\": [ \"in-class\" ],\n"
+"                        \"code\": 15,\n"
+"                        \"csv-format\": true,\n"
+"                        \"data\": \"example.com\",\n"
+"                        \"name\": \"domain-name\",\n"
+"                        \"never-send\": false,\n"
+"                        \"space\": \"dhcp4\"\n"
+"                    }\n"
+"                ],\n"
+"                \"option-def\": [ ],\n"
+"                \"server-hostname\": \"\"\n"
+"            }\n"
+"        ],\n"
+"        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
+"        \"ddns-generated-prefix\": \"myhost\",\n"
+"        \"ddns-override-client-update\": false,\n"
+"        \"ddns-override-no-update\": false,\n"
+"        \"ddns-qualifying-suffix\": \"\",\n"
+"        \"ddns-replace-client-name\": \"never\",\n"
+"        \"ddns-send-updates\": true,\n"
+"        \"ddns-update-on-renew\": false,\n"
+"        \"decline-probation-period\": 86400,\n"
+"        \"dhcp-ddns\": {\n"
+"            \"enable-updates\": false,\n"
+"            \"max-queue-size\": 1024,\n"
+"            \"ncr-format\": \"JSON\",\n"
+"            \"ncr-protocol\": \"UDP\",\n"
+"            \"sender-ip\": \"0.0.0.0\",\n"
+"            \"sender-port\": 0,\n"
+"            \"server-ip\": \"127.0.0.1\",\n"
+"            \"server-port\": 53001\n"
+"        },\n"
+"        \"dhcp-queue-control\": {\n"
+"            \"capacity\": 64,\n"
+"            \"enable-queue\": false,\n"
+"            \"queue-type\": \"kea-ring4\"\n"
+"        },\n"
+"        \"dhcp4o6-port\": 0,\n"
+"        \"early-global-reservations-lookup\": false,\n"
+"        \"echo-client-id\": true,\n"
+"        \"expired-leases-processing\": {\n"
+"            \"flush-reclaimed-timer-wait-time\": 25,\n"
+"            \"hold-reclaimed-time\": 3600,\n"
+"            \"max-reclaim-leases\": 100,\n"
+"            \"max-reclaim-time\": 250,\n"
+"            \"reclaim-timer-wait-time\": 10,\n"
+"            \"unwarned-reclaim-cycles\": 5\n"
+"        },\n"
+"        \"hooks-libraries\": [ ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"hostname-char-replacement\": \"\",\n"
+"        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"ip-reservations-unique\": true,\n"
+"        \"lease-database\": {\n"
+"            \"type\": \"memfile\"\n"
+"        },\n"
+"        \"match-client-id\": true,\n"
+"        \"multi-threading\": {\n"
+"            \"enable-multi-threading\": true,\n"
+"            \"packet-queue-size\": 64,\n"
+"            \"thread-pool-size\": 0\n"
+"        },\n"
+"        \"next-server\": \"0.0.0.0\",\n"
+"        \"option-data\": [\n"
+"            {\n"
+"                \"always-send\": false,\n"
+"                \"client-classes\": [ \"in-global\" ],\n"
+"                \"code\": 15,\n"
+"                \"csv-format\": true,\n"
+"                \"data\": \"example.com\",\n"
+"                \"name\": \"domain-name\",\n"
+"                \"never-send\": false,\n"
+"                \"space\": \"dhcp4\"\n"
+"            }\n"
+"        ],\n"
+"        \"option-def\": [ ],\n"
+"        \"parked-packet-limit\": 256,\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"renew-timer\": 1000,\n"
+"        \"reservations-global\": false,\n"
+"        \"reservations-in-subnet\": true,\n"
+"        \"reservations-lookup-first\": false,\n"
+"        \"reservations-out-of-pool\": false,\n"
+"        \"sanity-checks\": {\n"
+"            \"extended-info-checks\": \"fix\",\n"
+"            \"lease-checks\": \"warn\"\n"
+"        },\n"
+"        \"server-hostname\": \"\",\n"
+"        \"server-tag\": \"\",\n"
+"        \"shared-networks\": [\n"
+"            {\n"
+"                \"allocator\": \"iterative\",\n"
+"                \"calculate-tee-times\": false,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
+"                \"name\": \"foo\",\n"
+"                \"option-data\": [\n"
+"                    {\n"
+"                        \"always-send\": false,\n"
+"                        \"client-classes\": [ \"in-network\" ],\n"
+"                        \"code\": 15,\n"
+"                        \"csv-format\": true,\n"
+"                        \"data\": \"example.com\",\n"
+"                        \"name\": \"domain-name\",\n"
+"                        \"never-send\": false,\n"
+"                        \"space\": \"dhcp4\"\n"
+"                    }\n"
+"                ],\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"store-extended-info\": false,\n"
+"                \"subnet4\": [\n"
+"                    {\n"
+"                        \"4o6-interface\": \"\",\n"
+"                        \"4o6-interface-id\": \"\",\n"
+"                        \"4o6-subnet\": \"\",\n"
+"                        \"allocator\": \"iterative\",\n"
+"                        \"calculate-tee-times\": false,\n"
+"                        \"id\": 1,\n"
+"                        \"max-valid-lifetime\": 4000,\n"
+"                        \"min-valid-lifetime\": 4000,\n"
+"                        \"option-data\": [\n"
+"                            {\n"
+"                                \"always-send\": false,\n"
+"                                \"client-classes\": [ \"in-subnet\" ],\n"
+"                                \"code\": 15,\n"
+"                                \"csv-format\": true,\n"
+"                                \"data\": \"example.com\",\n"
+"                                \"name\": \"domain-name\",\n"
+"                                \"never-send\": false,\n"
+"                                \"space\": \"dhcp4\"\n"
+"                            }\n"
+"                        ],\n"
+"                        \"pools\": [\n"
+"                            {\n"
+"                                \"option-data\": [\n"
+"                                    {\n"
+"                                        \"always-send\": false,\n"
+"                                        \"client-classes\": [ \"in-pool\" ],\n"
+"                                        \"code\": 15,\n"
+"                                        \"csv-format\": true,\n"
+"                                        \"data\": \"example.com\",\n"
+"                                        \"name\": \"domain-name\",\n"
+"                                        \"never-send\": false,\n"
+"                                        \"space\": \"dhcp4\"\n"
+"                                    }\n"
+"                                ],\n"
+"                                \"pool\": \"192.0.2.0/28\"\n"
+"                            }\n"
+"                        ],\n"
+"                        \"rebind-timer\": 2000,\n"
+"                        \"relay\": {\n"
+"                            \"ip-addresses\": [ ]\n"
+"                        },\n"
+"                        \"renew-timer\": 1000,\n"
+"                        \"reservations\": [\n"
+"                            {\n"
+"                                \"boot-file-name\": \"\",\n"
+"                                \"client-classes\": [ ],\n"
+"                                \"hostname\": \"\",\n"
+"                                \"hw-address\": \"aa:bb:cc:dd:ee:ff\",\n"
+"                                \"next-server\": \"0.0.0.0\",\n"
+"                                \"option-data\": [\n"
+"                                    {\n"
+"                                        \"always-send\": false,\n"
+"                                        \"client-classes\": [ \"in-reservation\" ],\n"
+"                                        \"code\": 15,\n"
+"                                        \"csv-format\": true,\n"
+"                                        \"data\": \"example.com\",\n"
+"                                        \"name\": \"domain-name\",\n"
+"                                        \"never-send\": false,\n"
+"                                        \"space\": \"dhcp4\"\n"
+"                                    }\n"
+"                                ],\n"
+"                                \"server-hostname\": \"\"\n"
+"                            }\n"
+"                        ],\n"
+"                        \"store-extended-info\": false,\n"
+"                        \"subnet\": \"192.0.2.0/24\",\n"
+"                        \"t1-percent\": 0.5,\n"
+"                        \"t2-percent\": 0.875,\n"
+"                        \"valid-lifetime\": 4000\n"
+"                    }\n"
+"                ],\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.875,\n"
+"                \"valid-lifetime\": 4000\n"
+"            }\n"
+"        ],\n"
+"        \"stash-agent-options\": false,\n"
+"        \"statistic-default-sample-age\": 0,\n"
+"        \"statistic-default-sample-count\": 20,\n"
+"        \"store-extended-info\": false,\n"
+"        \"subnet4\": [ ],\n"
+"        \"t1-percent\": 0.5,\n"
+"        \"t2-percent\": 0.875,\n"
+"        \"valid-lifetime\": 4000\n"
+"    }\n",
+    // CONFIGURATION 79
+"{\n"
+"        \"allocator\": \"iterative\",\n"
+"        \"authoritative\": false,\n"
+"        \"boot-file-name\": \"\",\n"
+"        \"calculate-tee-times\": false,\n"
+"        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
+"        \"ddns-generated-prefix\": \"myhost\",\n"
+"        \"ddns-override-client-update\": false,\n"
+"        \"ddns-override-no-update\": false,\n"
+"        \"ddns-qualifying-suffix\": \"\",\n"
+"        \"ddns-replace-client-name\": \"never\",\n"
+"        \"ddns-send-updates\": true,\n"
+"        \"ddns-update-on-renew\": false,\n"
+"        \"decline-probation-period\": 86400,\n"
+"        \"dhcp-ddns\": {\n"
+"            \"enable-updates\": false,\n"
+"            \"max-queue-size\": 1024,\n"
+"            \"ncr-format\": \"JSON\",\n"
+"            \"ncr-protocol\": \"UDP\",\n"
+"            \"sender-ip\": \"0.0.0.0\",\n"
+"            \"sender-port\": 0,\n"
+"            \"server-ip\": \"127.0.0.1\",\n"
+"            \"server-port\": 53001\n"
+"        },\n"
+"        \"dhcp-queue-control\": {\n"
+"            \"capacity\": 64,\n"
+"            \"enable-queue\": false,\n"
+"            \"queue-type\": \"kea-ring4\"\n"
+"        },\n"
+"        \"dhcp4o6-port\": 0,\n"
+"        \"early-global-reservations-lookup\": false,\n"
+"        \"echo-client-id\": true,\n"
+"        \"expired-leases-processing\": {\n"
+"            \"flush-reclaimed-timer-wait-time\": 25,\n"
+"            \"hold-reclaimed-time\": 3600,\n"
+"            \"max-reclaim-leases\": 100,\n"
+"            \"max-reclaim-time\": 250,\n"
+"            \"reclaim-timer-wait-time\": 10,\n"
+"            \"unwarned-reclaim-cycles\": 5\n"
+"        },\n"
+"        \"hooks-libraries\": [ ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"hostname-char-replacement\": \"\",\n"
+"        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"ip-reservations-unique\": true,\n"
+"        \"lease-database\": {\n"
+"            \"type\": \"memfile\"\n"
+"        },\n"
+"        \"match-client-id\": true,\n"
+"        \"multi-threading\": {\n"
+"            \"enable-multi-threading\": true,\n"
+"            \"packet-queue-size\": 64,\n"
+"            \"thread-pool-size\": 0\n"
+"        },\n"
+"        \"next-server\": \"0.0.0.0\",\n"
+"        \"option-data\": [\n"
+"            {\n"
+"                \"always-send\": false,\n"
+"                \"client-classes\": [ \"foo\", \"bar\" ],\n"
+"                \"code\": 15,\n"
+"                \"csv-format\": true,\n"
+"                \"data\": \"example.com\",\n"
+"                \"name\": \"domain-name\",\n"
+"                \"never-send\": false,\n"
+"                \"space\": \"dhcp4\"\n"
+"            }\n"
+"        ],\n"
+"        \"option-def\": [ ],\n"
+"        \"parked-packet-limit\": 256,\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"renew-timer\": 1000,\n"
+"        \"reservations-global\": false,\n"
+"        \"reservations-in-subnet\": true,\n"
+"        \"reservations-lookup-first\": false,\n"
+"        \"reservations-out-of-pool\": false,\n"
+"        \"sanity-checks\": {\n"
+"            \"extended-info-checks\": \"fix\",\n"
+"            \"lease-checks\": \"warn\"\n"
+"        },\n"
+"        \"server-hostname\": \"\",\n"
+"        \"server-tag\": \"\",\n"
+"        \"shared-networks\": [ ],\n"
+"        \"stash-agent-options\": false,\n"
+"        \"statistic-default-sample-age\": 0,\n"
+"        \"statistic-default-sample-count\": 20,\n"
+"        \"store-extended-info\": false,\n"
+"        \"subnet4\": [ ],\n"
+"        \"t1-percent\": 0.5,\n"
+"        \"t2-percent\": 0.875,\n"
+"        \"valid-lifetime\": 400\n"
 "    }\n"
 };
 
index cd757ff6ff76bd3c504748e57d5bda01ba00fcf2..f86364b77b2b6168fe0b8b040bf359a070c6ba6b 100644 (file)
@@ -2975,7 +2975,7 @@ TEST_F(ClassifyTest, requestedOptionClassTag) {
     oro->addValue(1251);
     query->addOption(oro);
 
-    // Classify the query. 
+    // Classify the query.
     srv.classifyPacket(query);
 
     // Verify query is in class "right".
@@ -3048,7 +3048,7 @@ TEST_F(ClassifyTest, vendorClassOptionClassTag) {
     OptionPtr clientid2(new Option(Option::V6, D6O_CLIENTID, buf));
     query->addOption(clientid2);
 
-    // Classify the query. 
+    // Classify the query.
     srv.classifyPacket(query);
 
     // Verify query is in class "melon".
@@ -3064,7 +3064,7 @@ TEST_F(ClassifyTest, vendorClassOptionClassTag) {
     // Create a SOLICIT that does not match class "right".
     query = createSolicit();
 
-    // Classify the query. 
+    // Classify the query.
     srv.classifyPacket(query);
 
     // Verify query is in not class "melon".
@@ -3079,7 +3079,7 @@ TEST_F(ClassifyTest, vendorClassOptionClassTag) {
 }
 
 // Verifies that D6O_VENDOR_OPTS option can be gated by option class
-// tagging. Note that class-tagging only suppresses this option when 
+// tagging. Note that class-tagging only suppresses this option when
 // none of the vendor's sub-options are being returned.
 TEST_F(ClassifyTest, persistedVendorOptsOptionClassTag) {
     IfaceMgrTestConfig test_config(true);
@@ -3122,7 +3122,7 @@ TEST_F(ClassifyTest, persistedVendorOptsOptionClassTag) {
     // Create a SOLICIT that does not match class.
     Pkt6Ptr query = createSolicit();
 
-    // Classify the query. 
+    // Classify the query.
     srv.classifyPacket(query);
 
     // Verify query is not in class "melon".
@@ -3145,7 +3145,7 @@ TEST_F(ClassifyTest, persistedVendorOptsOptionClassTag) {
     OptionPtr clientid2(new Option(Option::V6, D6O_CLIENTID, buf));
     query->addOption(clientid2);
 
-    // Classify the query. 
+    // Classify the query.
     srv.classifyPacket(query);
 
     // Verify query is in class "melon".
@@ -3200,7 +3200,7 @@ TEST_F(ClassifyTest, requestedVendorOptionsClassTag) {
             "code": 103,
             "type": "string"
         }],
-        "option-data": [{ 
+        "option-data": [{
             "space": "vendor-4491",
             "code": 101,
             "csv-format": true,
@@ -3251,7 +3251,7 @@ TEST_F(ClassifyTest, requestedVendorOptionsClassTag) {
     vendor_oro->addValue(103);
     vendor->addOption(vendor_oro);
 
-    // Classify the query. 
+    // Classify the query.
     srv.classifyPacket(query);
 
     // Verify query is in class "melon".
index 1d7c73616c8be49dc40f3425a69ea780e87a4929..eb16ecea4cd5a5f4756f528423321a00a5f4a5d2 100644 (file)
@@ -8987,6 +8987,81 @@ TEST_F(Dhcp6ParserTest, storeDdnsConflictResolutionMode) {
     }
 }
 
+// This test verifies that class tagging can occur at any scope.
+TEST_F(Dhcp6ParserTest, classTagging) {
+    std::string config = "{ " + genIfaceConfig() + ","
+        R"^(
+        "option-data": [{
+             "name": "domain-search",
+             "data": "example.com",
+             "client-classes": [ "in-global" ]
+        }],
+        "valid-lifetime": 4000,
+        "preferred-lifetime": 3000,
+        "rebind-timer": 2000,
+        "renew-timer": 1000,
+        "shared-networks": [{
+            "name": "foo",
+            "subnet6": [{
+                "id": 1,
+                "subnet": "2001:db8::/32",
+                "option-data": [{
+                    "name": "domain-search",
+                    "data": "example.com",
+                    "client-classes": [ "in-subnet" ]
+                }],
+                "pools": [{
+                    "pool": "2001:db8::/64",
+                    "option-data": [{
+                        "name": "domain-search",
+                        "data": "example.com",
+                        "client-classes": [ "in-pool" ]
+                     }]
+                }],
+                "pd-pools": [{
+                    "prefix": "3001:db8::",
+                    "prefix-len": 56,
+                    "delegated-len": 64,
+                    "option-data": [{
+                        "name": "domain-search",
+                        "data": "example.com",
+                        "client-classes": [ "in-pd-pool" ]
+                    }]
+                }],
+                "reservations": [{
+                    "hw-address": "AA:BB:CC:DD:EE:FF",
+                    "option-data": [{
+                        "name": "domain-search",
+                        "data": "example.com",
+                        "client-classes": [ "in-reservation" ]
+                    }]
+               }]
+            }],
+            "option-data": [{
+                "name": "domain-search",
+                "data": "example.com",
+                "client-classes": [ "in-network" ]
+            }]
+        }],
+        "client-classes": [{
+            "name": "foo",
+            "option-data": [{
+                "name": "domain-search",
+                "data": "example.com",
+                "client-classes": [ "in-class" ]
+            }]
+        }]
+        })^";
+
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP6(config));
+    extractConfig(config);
+
+    ConstElementPtr status;
+    ASSERT_NO_THROW(status = configureDhcp6Server(srv_, json));
+    checkResult(status, 0);
+}
+
 // This test verifies that duplicates in option-data.client-classes
 // are ignored and do not affect class order.
 TEST_F(Dhcp6ParserTest, optionClientClassesDuplicateCheck) {
index d37d27ed5bf69b8a100177895f40c4684ecc63b3..03afd03dbfd00a1881f6bec99d3d57a7d939fc77 100644 (file)
@@ -2453,6 +2453,117 @@ const char* EXTRACTED_CONFIGS[] = {
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
+"    }\n",
+    // CONFIGURATION 76
+"{\n"
+"        \"client-classes\": [\n"
+"            {\n"
+"                \"name\": \"foo\",\n"
+"                \"option-data\": [\n"
+"                    {\n"
+"                        \"client-classes\": [ \"in-class\" ],\n"
+"                        \"data\": \"example.com\",\n"
+"                        \"name\": \"domain-search\"\n"
+"                    }\n"
+"                ]\n"
+"            }\n"
+"        ],\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"option-data\": [\n"
+"            {\n"
+"                \"client-classes\": [ \"in-global\" ],\n"
+"                \"data\": \"example.com\",\n"
+"                \"name\": \"domain-search\"\n"
+"            }\n"
+"        ],\n"
+"        \"preferred-lifetime\": 3000,\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"renew-timer\": 1000,\n"
+"        \"shared-networks\": [\n"
+"            {\n"
+"                \"name\": \"foo\",\n"
+"                \"option-data\": [\n"
+"                    {\n"
+"                        \"client-classes\": [ \"in-network\" ],\n"
+"                        \"data\": \"example.com\",\n"
+"                        \"name\": \"domain-search\"\n"
+"                    }\n"
+"                ],\n"
+"                \"subnet6\": [\n"
+"                    {\n"
+"                        \"id\": 1,\n"
+"                        \"option-data\": [\n"
+"                            {\n"
+"                                \"client-classes\": [ \"in-subnet\" ],\n"
+"                                \"data\": \"example.com\",\n"
+"                                \"name\": \"domain-search\"\n"
+"                            }\n"
+"                        ],\n"
+"                        \"pd-pools\": [\n"
+"                            {\n"
+"                                \"delegated-len\": 64,\n"
+"                                \"option-data\": [\n"
+"                                    {\n"
+"                                        \"client-classes\": [ \"in-pd-pool\" ],\n"
+"                                        \"data\": \"example.com\",\n"
+"                                        \"name\": \"domain-search\"\n"
+"                                    }\n"
+"                                ],\n"
+"                                \"prefix\": \"3001:db8::\",\n"
+"                                \"prefix-len\": 56\n"
+"                            }\n"
+"                        ],\n"
+"                        \"pools\": [\n"
+"                            {\n"
+"                                \"option-data\": [\n"
+"                                    {\n"
+"                                        \"client-classes\": [ \"in-pool\" ],\n"
+"                                        \"data\": \"example.com\",\n"
+"                                        \"name\": \"domain-search\"\n"
+"                                    }\n"
+"                                ],\n"
+"                                \"pool\": \"2001:db8::/64\"\n"
+"                            }\n"
+"                        ],\n"
+"                        \"reservations\": [\n"
+"                            {\n"
+"                                \"hw-address\": \"AA:BB:CC:DD:EE:FF\",\n"
+"                                \"option-data\": [\n"
+"                                    {\n"
+"                                        \"client-classes\": [ \"in-reservation\" ],\n"
+"                                        \"data\": \"example.com\",\n"
+"                                        \"name\": \"domain-search\"\n"
+"                                    }\n"
+"                                ]\n"
+"                            }\n"
+"                        ],\n"
+"                        \"subnet\": \"2001:db8::/32\"\n"
+"                    }\n"
+"                ]\n"
+"            }\n"
+"        ],\n"
+"        \"valid-lifetime\": 4000\n"
+"    }\n",
+    // CONFIGURATION 77
+"{\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"option-data\": [\n"
+"            {\n"
+"                \"client-classes\": [ \"foo\", \"bar\", \"foo\", \"bar\" ],\n"
+"                \"data\": \"example.com\",\n"
+"                \"name\": \"domain-search\"\n"
+"            }\n"
+"        ],\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"renew-timer\": 1000,\n"
+"        \"subnet6\": [ ],\n"
+"        \"valid-lifetime\": 400\n"
 "    }\n"
 };
 
@@ -12805,6 +12916,350 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t1-percent\": 0.5,\n"
 "        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
+"    }\n",
+    // CONFIGURATION 76
+"{\n"
+"        \"allocator\": \"iterative\",\n"
+"        \"calculate-tee-times\": true,\n"
+"        \"client-classes\": [\n"
+"            {\n"
+"                \"name\": \"foo\",\n"
+"                \"option-data\": [\n"
+"                    {\n"
+"                        \"always-send\": false,\n"
+"                        \"client-classes\": [ \"in-class\" ],\n"
+"                        \"code\": 24,\n"
+"                        \"csv-format\": true,\n"
+"                        \"data\": \"example.com\",\n"
+"                        \"name\": \"domain-search\",\n"
+"                        \"never-send\": false,\n"
+"                        \"space\": \"dhcp6\"\n"
+"                    }\n"
+"                ]\n"
+"            }\n"
+"        ],\n"
+"        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
+"        \"ddns-generated-prefix\": \"myhost\",\n"
+"        \"ddns-override-client-update\": false,\n"
+"        \"ddns-override-no-update\": false,\n"
+"        \"ddns-qualifying-suffix\": \"\",\n"
+"        \"ddns-replace-client-name\": \"never\",\n"
+"        \"ddns-send-updates\": true,\n"
+"        \"ddns-update-on-renew\": false,\n"
+"        \"decline-probation-period\": 86400,\n"
+"        \"dhcp-ddns\": {\n"
+"            \"enable-updates\": false,\n"
+"            \"max-queue-size\": 1024,\n"
+"            \"ncr-format\": \"JSON\",\n"
+"            \"ncr-protocol\": \"UDP\",\n"
+"            \"sender-ip\": \"0.0.0.0\",\n"
+"            \"sender-port\": 0,\n"
+"            \"server-ip\": \"127.0.0.1\",\n"
+"            \"server-port\": 53001\n"
+"        },\n"
+"        \"dhcp-queue-control\": {\n"
+"            \"capacity\": 64,\n"
+"            \"enable-queue\": false,\n"
+"            \"queue-type\": \"kea-ring6\"\n"
+"        },\n"
+"        \"dhcp4o6-port\": 0,\n"
+"        \"early-global-reservations-lookup\": false,\n"
+"        \"expired-leases-processing\": {\n"
+"            \"flush-reclaimed-timer-wait-time\": 25,\n"
+"            \"hold-reclaimed-time\": 3600,\n"
+"            \"max-reclaim-leases\": 100,\n"
+"            \"max-reclaim-time\": 250,\n"
+"            \"reclaim-timer-wait-time\": 10,\n"
+"            \"unwarned-reclaim-cycles\": 5\n"
+"        },\n"
+"        \"hooks-libraries\": [ ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
+"        \"hostname-char-replacement\": \"\",\n"
+"        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"ip-reservations-unique\": true,\n"
+"        \"lease-database\": {\n"
+"            \"type\": \"memfile\"\n"
+"        },\n"
+"        \"mac-sources\": [ \"any\" ],\n"
+"        \"multi-threading\": {\n"
+"            \"enable-multi-threading\": true,\n"
+"            \"packet-queue-size\": 64,\n"
+"            \"thread-pool-size\": 0\n"
+"        },\n"
+"        \"option-data\": [\n"
+"            {\n"
+"                \"always-send\": false,\n"
+"                \"client-classes\": [ \"in-global\" ],\n"
+"                \"code\": 24,\n"
+"                \"csv-format\": true,\n"
+"                \"data\": \"example.com\",\n"
+"                \"name\": \"domain-search\",\n"
+"                \"never-send\": false,\n"
+"                \"space\": \"dhcp6\"\n"
+"            }\n"
+"        ],\n"
+"        \"option-def\": [ ],\n"
+"        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"preferred-lifetime\": 3000,\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
+"        \"renew-timer\": 1000,\n"
+"        \"reservations-global\": false,\n"
+"        \"reservations-in-subnet\": true,\n"
+"        \"reservations-lookup-first\": false,\n"
+"        \"reservations-out-of-pool\": false,\n"
+"        \"sanity-checks\": {\n"
+"            \"extended-info-checks\": \"fix\",\n"
+"            \"lease-checks\": \"warn\"\n"
+"        },\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
+"        \"server-tag\": \"\",\n"
+"        \"shared-networks\": [\n"
+"            {\n"
+"                \"allocator\": \"iterative\",\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"max-preferred-lifetime\": 3000,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-preferred-lifetime\": 3000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
+"                \"name\": \"foo\",\n"
+"                \"option-data\": [\n"
+"                    {\n"
+"                        \"always-send\": false,\n"
+"                        \"client-classes\": [ \"in-network\" ],\n"
+"                        \"code\": 24,\n"
+"                        \"csv-format\": true,\n"
+"                        \"data\": \"example.com\",\n"
+"                        \"name\": \"domain-search\",\n"
+"                        \"never-send\": false,\n"
+"                        \"space\": \"dhcp6\"\n"
+"                    }\n"
+"                ],\n"
+"                \"pd-allocator\": \"iterative\",\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"store-extended-info\": false,\n"
+"                \"subnet6\": [\n"
+"                    {\n"
+"                        \"allocator\": \"iterative\",\n"
+"                        \"calculate-tee-times\": true,\n"
+"                        \"id\": 1,\n"
+"                        \"max-preferred-lifetime\": 3000,\n"
+"                        \"max-valid-lifetime\": 4000,\n"
+"                        \"min-preferred-lifetime\": 3000,\n"
+"                        \"min-valid-lifetime\": 4000,\n"
+"                        \"option-data\": [\n"
+"                            {\n"
+"                                \"always-send\": false,\n"
+"                                \"client-classes\": [ \"in-subnet\" ],\n"
+"                                \"code\": 24,\n"
+"                                \"csv-format\": true,\n"
+"                                \"data\": \"example.com\",\n"
+"                                \"name\": \"domain-search\",\n"
+"                                \"never-send\": false,\n"
+"                                \"space\": \"dhcp6\"\n"
+"                            }\n"
+"                        ],\n"
+"                        \"pd-allocator\": \"iterative\",\n"
+"                        \"pd-pools\": [\n"
+"                            {\n"
+"                                \"delegated-len\": 64,\n"
+"                                \"option-data\": [\n"
+"                                    {\n"
+"                                        \"always-send\": false,\n"
+"                                        \"client-classes\": [ \"in-pd-pool\" ],\n"
+"                                        \"code\": 24,\n"
+"                                        \"csv-format\": true,\n"
+"                                        \"data\": \"example.com\",\n"
+"                                        \"name\": \"domain-search\",\n"
+"                                        \"never-send\": false,\n"
+"                                        \"space\": \"dhcp6\"\n"
+"                                    }\n"
+"                                ],\n"
+"                                \"prefix\": \"3001:db8::\",\n"
+"                                \"prefix-len\": 56\n"
+"                            }\n"
+"                        ],\n"
+"                        \"pools\": [\n"
+"                            {\n"
+"                                \"option-data\": [\n"
+"                                    {\n"
+"                                        \"always-send\": false,\n"
+"                                        \"client-classes\": [ \"in-pool\" ],\n"
+"                                        \"code\": 24,\n"
+"                                        \"csv-format\": true,\n"
+"                                        \"data\": \"example.com\",\n"
+"                                        \"name\": \"domain-search\",\n"
+"                                        \"never-send\": false,\n"
+"                                        \"space\": \"dhcp6\"\n"
+"                                    }\n"
+"                                ],\n"
+"                                \"pool\": \"2001:db8::/64\"\n"
+"                            }\n"
+"                        ],\n"
+"                        \"preferred-lifetime\": 3000,\n"
+"                        \"rebind-timer\": 2000,\n"
+"                        \"relay\": {\n"
+"                            \"ip-addresses\": [ ]\n"
+"                        },\n"
+"                        \"renew-timer\": 1000,\n"
+"                        \"reservations\": [\n"
+"                            {\n"
+"                                \"client-classes\": [ ],\n"
+"                                \"hostname\": \"\",\n"
+"                                \"hw-address\": \"aa:bb:cc:dd:ee:ff\",\n"
+"                                \"ip-addresses\": [ ],\n"
+"                                \"option-data\": [\n"
+"                                    {\n"
+"                                        \"always-send\": false,\n"
+"                                        \"client-classes\": [ \"in-reservation\" ],\n"
+"                                        \"code\": 24,\n"
+"                                        \"csv-format\": true,\n"
+"                                        \"data\": \"example.com\",\n"
+"                                        \"name\": \"domain-search\",\n"
+"                                        \"never-send\": false,\n"
+"                                        \"space\": \"dhcp6\"\n"
+"                                    }\n"
+"                                ],\n"
+"                                \"prefixes\": [ ]\n"
+"                            }\n"
+"                        ],\n"
+"                        \"store-extended-info\": false,\n"
+"                        \"subnet\": \"2001:db8::/32\",\n"
+"                        \"t1-percent\": 0.5,\n"
+"                        \"t2-percent\": 0.8,\n"
+"                        \"valid-lifetime\": 4000\n"
+"                    }\n"
+"                ],\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
+"            }\n"
+"        ],\n"
+"        \"statistic-default-sample-age\": 0,\n"
+"        \"statistic-default-sample-count\": 20,\n"
+"        \"store-extended-info\": false,\n"
+"        \"subnet6\": [ ],\n"
+"        \"t1-percent\": 0.5,\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 4000\n"
+"    }\n",
+    // CONFIGURATION 77
+"{\n"
+"        \"allocator\": \"iterative\",\n"
+"        \"calculate-tee-times\": true,\n"
+"        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
+"        \"ddns-generated-prefix\": \"myhost\",\n"
+"        \"ddns-override-client-update\": false,\n"
+"        \"ddns-override-no-update\": false,\n"
+"        \"ddns-qualifying-suffix\": \"\",\n"
+"        \"ddns-replace-client-name\": \"never\",\n"
+"        \"ddns-send-updates\": true,\n"
+"        \"ddns-update-on-renew\": false,\n"
+"        \"decline-probation-period\": 86400,\n"
+"        \"dhcp-ddns\": {\n"
+"            \"enable-updates\": false,\n"
+"            \"max-queue-size\": 1024,\n"
+"            \"ncr-format\": \"JSON\",\n"
+"            \"ncr-protocol\": \"UDP\",\n"
+"            \"sender-ip\": \"0.0.0.0\",\n"
+"            \"sender-port\": 0,\n"
+"            \"server-ip\": \"127.0.0.1\",\n"
+"            \"server-port\": 53001\n"
+"        },\n"
+"        \"dhcp-queue-control\": {\n"
+"            \"capacity\": 64,\n"
+"            \"enable-queue\": false,\n"
+"            \"queue-type\": \"kea-ring6\"\n"
+"        },\n"
+"        \"dhcp4o6-port\": 0,\n"
+"        \"early-global-reservations-lookup\": false,\n"
+"        \"expired-leases-processing\": {\n"
+"            \"flush-reclaimed-timer-wait-time\": 25,\n"
+"            \"hold-reclaimed-time\": 3600,\n"
+"            \"max-reclaim-leases\": 100,\n"
+"            \"max-reclaim-time\": 250,\n"
+"            \"reclaim-timer-wait-time\": 10,\n"
+"            \"unwarned-reclaim-cycles\": 5\n"
+"        },\n"
+"        \"hooks-libraries\": [ ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
+"        \"hostname-char-replacement\": \"\",\n"
+"        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"ip-reservations-unique\": true,\n"
+"        \"lease-database\": {\n"
+"            \"type\": \"memfile\"\n"
+"        },\n"
+"        \"mac-sources\": [ \"any\" ],\n"
+"        \"multi-threading\": {\n"
+"            \"enable-multi-threading\": true,\n"
+"            \"packet-queue-size\": 64,\n"
+"            \"thread-pool-size\": 0\n"
+"        },\n"
+"        \"option-data\": [\n"
+"            {\n"
+"                \"always-send\": false,\n"
+"                \"client-classes\": [ \"foo\", \"bar\" ],\n"
+"                \"code\": 24,\n"
+"                \"csv-format\": true,\n"
+"                \"data\": \"example.com\",\n"
+"                \"name\": \"domain-search\",\n"
+"                \"never-send\": false,\n"
+"                \"space\": \"dhcp6\"\n"
+"            }\n"
+"        ],\n"
+"        \"option-def\": [ ],\n"
+"        \"parked-packet-limit\": 256,\n"
+"        \"pd-allocator\": \"iterative\",\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
+"        \"renew-timer\": 1000,\n"
+"        \"reservations-global\": false,\n"
+"        \"reservations-in-subnet\": true,\n"
+"        \"reservations-lookup-first\": false,\n"
+"        \"reservations-out-of-pool\": false,\n"
+"        \"sanity-checks\": {\n"
+"            \"extended-info-checks\": \"fix\",\n"
+"            \"lease-checks\": \"warn\"\n"
+"        },\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
+"        \"server-tag\": \"\",\n"
+"        \"shared-networks\": [ ],\n"
+"        \"statistic-default-sample-age\": 0,\n"
+"        \"statistic-default-sample-count\": 20,\n"
+"        \"store-extended-info\": false,\n"
+"        \"subnet6\": [ ],\n"
+"        \"t1-percent\": 0.5,\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 400\n"
 "    }\n"
 };