From: Francis Dupont Date: Mon, 14 Oct 2024 15:45:19 +0000 (+0200) Subject: [#3583] Added syntax UTs X-Git-Tag: Kea-2.7.4~62 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d959d41d27cbd1f8e116a8c8cfc2e764dad2e637;p=thirdparty%2Fkea.git [#3583] Added syntax UTs --- diff --git a/src/bin/dhcp4/tests/classify_unittest.cc b/src/bin/dhcp4/tests/classify_unittest.cc index 86007cc7ce..340190b026 100644 --- a/src/bin/dhcp4/tests/classify_unittest.cc +++ b/src/bin/dhcp4/tests/classify_unittest.cc @@ -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 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". diff --git a/src/bin/dhcp4/tests/config_parser_unittest.cc b/src/bin/dhcp4/tests/config_parser_unittest.cc index 8c81dfad8e..0d2a2548d1 100644 --- a/src/bin/dhcp4/tests/config_parser_unittest.cc +++ b/src/bin/dhcp4/tests/config_parser_unittest.cc @@ -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() + "," diff --git a/src/bin/dhcp4/tests/get_config_unittest.cc b/src/bin/dhcp4/tests/get_config_unittest.cc index 4f0119078b..c7a65db94d 100644 --- a/src/bin/dhcp4/tests/get_config_unittest.cc +++ b/src/bin/dhcp4/tests/get_config_unittest.cc @@ -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" }; diff --git a/src/bin/dhcp6/tests/classify_unittest.cc b/src/bin/dhcp6/tests/classify_unittest.cc index cd757ff6ff..f86364b77b 100644 --- a/src/bin/dhcp6/tests/classify_unittest.cc +++ b/src/bin/dhcp6/tests/classify_unittest.cc @@ -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". diff --git a/src/bin/dhcp6/tests/config_parser_unittest.cc b/src/bin/dhcp6/tests/config_parser_unittest.cc index 1d7c73616c..eb16ecea4c 100644 --- a/src/bin/dhcp6/tests/config_parser_unittest.cc +++ b/src/bin/dhcp6/tests/config_parser_unittest.cc @@ -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) { diff --git a/src/bin/dhcp6/tests/get_config_unittest.cc b/src/bin/dhcp6/tests/get_config_unittest.cc index d37d27ed5b..03afd03dbf 100644 --- a/src/bin/dhcp6/tests/get_config_unittest.cc +++ b/src/bin/dhcp6/tests/get_config_unittest.cc @@ -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" };