Browse Source

[3036] Test creating on-wire data from an option with empty domain name.

Marcin Siodelski 11 years ago
parent
commit
a8dfa35d56

+ 8 - 5
src/lib/dhcp/option6_client_fqdn.cc

@@ -437,11 +437,14 @@ Option6ClientFqdn::toText(int indent) {
 
 uint16_t
 Option6ClientFqdn::len() {
-    // If domain name is partial, the NULL terminating character
-    // is not included and the option length have to be adjusted.
-    uint16_t domain_name_length = impl_->domain_name_type_ == FULL ?
-        impl_->domain_name_->getLength() : impl_->domain_name_->getLength() - 1;
-
+    uint16_t domain_name_length = 0;
+    if (impl_->domain_name_) {
+        // If domain name is partial, the NULL terminating character
+        // is not included and the option. Length has to be adjusted.
+        domain_name_length = impl_->domain_name_type_ == FULL ?
+            impl_->domain_name_->getLength() :
+            impl_->domain_name_->getLength() - 1;
+    }
     return (getHeaderLen() + FLAG_FIELD_LEN + domain_name_length);
 }
 

+ 28 - 0
src/lib/dhcp/tests/option6_client_fqdn_unittest.cc

@@ -622,6 +622,34 @@ TEST(Option6ClientFqdnTest, packPartial) {
     EXPECT_EQ(0, memcmp(ref_data, buf.getData(), buf.getLength()));
 }
 
+// This test verifies that it is possible to encode the option which carries
+// empty domain-name in the wire format.
+TEST(Option6ClientFqdnTest, packEmpty) {
+    // Create option instance. Check that constructor doesn't throw.
+    const uint8_t flags = Option6ClientFqdn::FLAG_S;
+    boost::scoped_ptr<Option6ClientFqdn> option;
+    ASSERT_NO_THROW(
+                    option.reset(new Option6ClientFqdn(flags))
+    );
+    ASSERT_TRUE(option);
+
+    // Prepare on-wire format of the option.
+    isc::util::OutputBuffer buf(5);
+    ASSERT_NO_THROW(option->pack(buf));
+
+    // Prepare reference data.
+    const uint8_t ref_data[] = {
+        0, 39, 0, 1,                         // header
+        Option6ClientFqdn::FLAG_S            // flags
+    };
+    size_t ref_data_size = sizeof(ref_data) / sizeof(ref_data[0]);
+
+    // Check if the buffer has the same length as the reference data,
+    // so as they can be compared directly.
+    ASSERT_EQ(ref_data_size, buf.getLength());
+    EXPECT_EQ(0, memcmp(ref_data, buf.getData(), buf.getLength()));
+}
+
 // This test verifies that on-wire option data holding fully qualified domain
 // name is parsed correctly.
 TEST(Option6ClientFqdnTest, unpack) {