diff options
author | Francis Dupont <fdupont@isc.org> | 2019-04-10 23:05:24 +0200 |
---|---|---|
committer | Francis Dupont <fdupont@isc.org> | 2019-04-18 16:48:12 +0200 |
commit | 6253228c00d76e14146e137e879fda5d533371fc (patch) | |
tree | a23cecb98da77e9f2e541ebe0f1e3f74f5ba53ea /src/lib/dhcp | |
parent | [564-customer-request-relax-constraints-on-allowable-option-types-to-permit-o... (diff) | |
download | kea-6253228c00d76e14146e137e879fda5d533371fc.tar.xz kea-6253228c00d76e14146e137e879fda5d533371fc.zip |
[564-customer-request-relax-constraints-on-allowable-option-types-to-permit-option-type-0-and-255] Removed the 1..254 check and added tests
Diffstat (limited to 'src/lib/dhcp')
-rw-r--r-- | src/lib/dhcp/tests/libdhcp++_unittest.cc | 85 | ||||
-rw-r--r-- | src/lib/dhcp/tests/option_unittest.cc | 4 |
2 files changed, 89 insertions, 0 deletions
diff --git a/src/lib/dhcp/tests/libdhcp++_unittest.cc b/src/lib/dhcp/tests/libdhcp++_unittest.cc index 43f64e7bbe..90471943e2 100644 --- a/src/lib/dhcp/tests/libdhcp++_unittest.cc +++ b/src/lib/dhcp/tests/libdhcp++_unittest.cc @@ -1016,6 +1016,91 @@ TEST_F(LibDhcpTest, unpackSubOptions4) { EXPECT_EQ(0x0, option_bar->getValue()); } +// Verifies that options 0 (PAD) and 255 (END) are handled as PAD and END +// in and only in the dhcp4 space. +TEST_F(LibDhcpTest, unpackPadEnd) { + // Create option definition for the container. + OptionDefinitionPtr opt_def(new OptionDefinition("container", 200, + "empty", "my-space")); + // Create option definition for option 0. + OptionDefinitionPtr opt_def0(new OptionDefinition("zero", 0, "uint8")); + + // Create option definition for option 255. + OptionDefinitionPtr opt_def255(new OptionDefinition("max", 255, "uint8")); + + // Create option definition for another option. + OptionDefinitionPtr opt_def2(new OptionDefinition("my-option", 1, + "string")); + + // Register created option definitions as runtime option definitions. + OptionDefSpaceContainer defs; + ASSERT_NO_THROW(defs.addItem(opt_def, DHCP4_OPTION_SPACE)); + ASSERT_NO_THROW(defs.addItem(opt_def0, "my-space")); + ASSERT_NO_THROW(defs.addItem(opt_def255, "my-space")); + ASSERT_NO_THROW(defs.addItem(opt_def2, "my-space")); + LibDHCP::setRuntimeOptionDefs(defs); + LibDHCP::commitRuntimeOptionDefs(); + + // Create the buffer holding the structure of options. + const uint8_t raw_data[] = { + // Add a PAD + 0x00, // option code = 0 (PAD) + // Container option starts here. + 0xc8, // option code = 200 (container) + 0x0b, // option length = 11 + // Suboption 0. + 0x00, 0x01, 0x00, // code = 0, length = 1, content = 0 + // Suboption 255. + 0xff, 0x01, 0xff, // code = 255, length = 1, content = 255 + // Suboption 1. + 0x01, 0x03, 0x66, 0x6f, 0x6f, // code = 1, length = 2, content = "foo" + // END + 0xff + }; + size_t raw_data_len = sizeof(raw_data) / sizeof(uint8_t); + OptionBuffer buf(raw_data, raw_data + raw_data_len); + + // Parse options. + OptionCollection options; + list<uint16_t> deferred; + ASSERT_NO_THROW(LibDHCP::unpackOptions4(buf, DHCP4_OPTION_SPACE, + options, deferred)); + + // There should be one top level option. + ASSERT_EQ(1, options.size()); + + // Get it. + OptionPtr option = options.begin()->second; + ASSERT_TRUE(option); + EXPECT_EQ(200, option->getType()); + + // There should be 3 suboptions. + EXPECT_EQ(3, option->getOptions().size()); + + // Get suboption 0. + boost::shared_ptr<OptionInt<uint8_t> > sub0 = + boost::dynamic_pointer_cast<OptionInt<uint8_t> > + (option->getOption(0)); + ASSERT_TRUE(sub0); + EXPECT_EQ(0, sub0->getType()); + EXPECT_EQ(0, sub0->getValue()); + + // Get suboption 255. + boost::shared_ptr<OptionInt<uint8_t> > sub255 = + boost::dynamic_pointer_cast<OptionInt<uint8_t> > + (option->getOption(255)); + ASSERT_TRUE(sub255); + EXPECT_EQ(255, sub255->getType()); + EXPECT_EQ(255, sub255->getValue()); + + // Get suboption 1. + boost::shared_ptr<OptionString> sub = + boost::dynamic_pointer_cast<OptionString>(option->getOption(1)); + ASSERT_TRUE(sub); + EXPECT_EQ(1, sub->getType()); + EXPECT_EQ("foo", sub->getValue()); +} + // Verifies that an Host Name (option 12), will be dropped when empty, // while subsequent options will still be unpacked. TEST_F(LibDhcpTest, emptyHostName) { diff --git a/src/lib/dhcp/tests/option_unittest.cc b/src/lib/dhcp/tests/option_unittest.cc index a86a26d882..62a69c5a88 100644 --- a/src/lib/dhcp/tests/option_unittest.cc +++ b/src/lib/dhcp/tests/option_unittest.cc @@ -71,6 +71,10 @@ TEST_F(OptionTest, v4_basic) { // V4 options have type 0...255 EXPECT_THROW(opt.reset(new Option(Option::V4, 256)), OutOfRange); + + // 0 / PAD and 255 / END are no longer forbidden + EXPECT_NO_THROW(opt.reset(new Option(Option::V4, 0))); + EXPECT_NO_THROW(opt.reset(new Option(Option::V4, 255))); } const uint8_t dummyPayload[] = |