// create option instance.
ASSERT_EQ(buf_in.size(), buf_out.size());
EXPECT_TRUE(std::equal(buf_in.begin(), buf_in.end(), buf_out.begin()));
+
+ // Check that option with "no data" is rejected.
+ EXPECT_THROW(
+ option.reset(new OptionCustom(opt_def, Option::V4, OptionBuffer())),
+ isc::OutOfRange
+ );
}
// The purpose of this test is to verify that an option definition comprising
// with 0. It is expected to be 'false'.
ASSERT_NO_THROW(value = option->readBoolean(0));
EXPECT_FALSE(value);
+
+ // Check that the option with "no data" is rejected.
+ EXPECT_THROW(
+ option.reset(new OptionCustom(opt_def, Option::V6, OptionBuffer())),
+ isc::OutOfRange
+ );
}
// The purpose of this test is to verify that the option definition comprising
int16_t value = 0;
ASSERT_NO_THROW(value = option->readInteger<int16_t>(0));
EXPECT_EQ(-234, value);
+
+ // Check that the option is not created when a buffer is
+ // too short (1 byte instead of 2 bytes).
+ EXPECT_THROW(
+ option.reset(new OptionCustom(opt_def, Option::V6, buf.begin(), buf.begin() + 1)),
+ isc::OutOfRange
+ );
}
-// The purpose of this test is to verify that truncated option buffer
-// can't be used to form option holding an integer data.
-TEST_F(OptionCustomTest, int32DataTruncated) {
+// The purpose of this test is to verify that the option definition comprising
+// 32-bit signed integer value can be used to create an instance of custom option.
+TEST_F(OptionCustomTest, int32Data) {
OptionDefinition opt_def("OPTION_FOO", 1000, "int32");
- // Put two integer values into the buffer. One of
- // them will be ignored by the option's constructor.
OptionBuffer buf;
writeInt<int32_t>(-234, buf);
writeInt<int32_t>(100, buf);
// Create custom option.
boost::scoped_ptr<OptionCustom> option;
-
- // The length of the provided buffer is equal to 2*sizeof(uint32_t) so
- // both values will be processed by constructor. Second one should be
- // dropped.
- EXPECT_NO_THROW(
- option.reset(new OptionCustom(opt_def, Option::V6, buf.begin(), buf.begin() + 8));
+ ASSERT_NO_THROW(
+ option.reset(new OptionCustom(opt_def, Option::V6, buf));
);
+ ASSERT_TRUE(option);
- // The option buffer's length is sufficient to keep only one uint32_t
- // but this is ok since option needs only one value anyway.
- EXPECT_NO_THROW(
- option.reset(new OptionCustom(opt_def, Option::V6, buf.begin(), buf.begin() + 4));
- );
+ // We should have just one data field.
+ ASSERT_EQ(1, option->getDataFieldsNum());
- // The option buffer's length is equal to sizeof(uint32_t) so it should
- // be processed successfuly.
- EXPECT_NO_THROW(
- option.reset(new OptionCustom(opt_def, Option::V6, buf.begin(), buf.begin() + 4));
- );
+ // Initialize value to 0 explicitely to make sure that is
+ // modified by readInteger function to expected -234.
+ int32_t value = 0;
+ ASSERT_NO_THROW(value = option->readInteger<int32_t>(0));
+ EXPECT_EQ(-234, value);
- // The option bufferis now 1 byte too short. Expect exception being thrown.
+ // Check that the option is not created when a buffer is
+ // too short (3 bytes instead of 4 bytes).
EXPECT_THROW(
option.reset(new OptionCustom(opt_def, Option::V6, buf.begin(), buf.begin() + 3)),
isc::OutOfRange
ASSERT_NO_THROW(address = option->readAddress(0));
EXPECT_EQ("192.168.100.50", address.toText());
+
+ // Check that option is not created if the provided buffer is
+ // too short (use 3 bytes instead of 4).
+ EXPECT_THROW(
+ option.reset(new OptionCustom(opt_def, Option::V4, buf.begin(), buf.begin() + 3)),
+ isc::OutOfRange
+ );
}
// The purpose of this test is to verify that the option definition comprising
ASSERT_NO_THROW(address = option->readAddress(0));
EXPECT_EQ("2001:db8:1::100", address.toText());
+
+ // Check that option is not created if the provided buffer is
+ // too short (use 15 bytes instead of 16).
+ EXPECT_THROW(
+ option.reset(new OptionCustom(opt_def, Option::V4, buf.begin(),
+ buf.begin() + 15)),
+ isc::OutOfRange
+ );
}
// The purpose of this test is to verify that the option definition comprising
ASSERT_NO_THROW(value = option->readString(0));
EXPECT_EQ("hello world!", value);
+
+ // Check that option will not be created if empty buffer is provided.
+ EXPECT_THROW(
+ option.reset(new OptionCustom(opt_def, Option::V6, OptionBuffer())),
+ isc::OutOfRange
+ );
}
// The purpose of this test is to verify that the option definition comprising
bool value4 = false;
ASSERT_NO_THROW(value4 = option->readBoolean(4));
EXPECT_TRUE(value4);
-}
-
-// The purpose of this test is to verify that truncated buffer can't
-// be used to create an instance of the option which holds an array
-// of values.
-TEST_F(OptionCustomTest, uint16DataArrayTruncated) {
- OptionDefinition opt_def("OPTION_FOO", 1000, "uint16", true);
- OptionBuffer buf;
- for (int i = 0; i < 3; ++i) {
- writeInt<uint16_t>(i, buf);
- }
-
- // Create custom option using the input buffer.
- boost::scoped_ptr<OptionCustom> option;
-
- // Provide a buffer of a length of 4. This should succeed because exactly two
- // uint16_t values fit into it.
- EXPECT_NO_THROW(
- option.reset(new OptionCustom(opt_def, Option::V6, buf.begin(), buf.begin() + 4));
- );
-
- // Provide a buffer of a length of 3. This should succeed because one uint16_t
- // value fits into it despite the second one is truncated.
- EXPECT_NO_THROW(
- option.reset(new OptionCustom(opt_def, Option::V6, buf.begin(), buf.begin() + 3));
- );
-
- // Provide a buffer of a length of 2. This should succeed because still
- // one uint16_t fits into it.
- EXPECT_NO_THROW(
- option.reset(new OptionCustom(opt_def, Option::V6, buf.begin(), buf.begin() + 2));
- );
-
- // Provide truncated buffer. This should cause the exception.
+ // Check that empty buffer can't be used to create option holding
+ // array of boolean values.
EXPECT_THROW(
- option.reset(new OptionCustom(opt_def, Option::V6, buf.begin(), buf.begin() + 1)),
- isc::OutOfRange
+ option.reset(new OptionCustom(opt_def, Option::V6, OptionBuffer())),
+ isc::OutOfRange
);
}
ASSERT_NO_THROW(value = option->readInteger<uint32_t>(i));
EXPECT_EQ(values[i], value);
}
+
+ // Check that too short buffer can't be used to create the option.
+ // Using buffer having length of 3 bytes. The length of 4 bytes is
+ // a minimal length to create the option with single uint32_t value.
+ EXPECT_THROW(
+ option.reset(new OptionCustom(opt_def, Option::V6, buf.begin(),
+ buf.begin() + 3)),
+ isc::OutOfRange
+ );
+
}
// The purpose of this test is to verify that the option definition comprising
// Use the input buffer to create custom option.
boost::scoped_ptr<OptionCustom> option;
ASSERT_NO_THROW(
- option.reset(new OptionCustom(opt_def, Option::V4, buf.begin(), buf.begin() + 13));
+ option.reset(new OptionCustom(opt_def, Option::V4, buf));
);
ASSERT_TRUE(option);
ASSERT_NO_THROW(address = option->readAddress(i));
EXPECT_EQ(addresses[i].toText(), address.toText());
}
+
+ // Check that it is ok if buffer length is not a multiple of IPv4
+ // address length. Resize it by two bytes.
+ buf.resize(buf.size() + 2);
+ EXPECT_NO_THROW(
+ option.reset(new OptionCustom(opt_def, Option::V4, buf));
+ );
+
+ // Check that option is not created when the provided buffer
+ // is too short. At least a buffer length of 4 bytes is needed.
+ EXPECT_THROW(
+ option.reset(new OptionCustom(opt_def, Option::V4, buf.begin(),
+ buf.begin() + 2)),
+ isc::OutOfRange
+ );
}
// The purpose of this test is to verify that the option definition comprising
// Use the input buffer to create custom option.
boost::scoped_ptr<OptionCustom> option;
ASSERT_NO_THROW(
- option.reset(new OptionCustom(opt_def, Option::V6, buf.begin(), buf.begin() + 50));
+ option.reset(new OptionCustom(opt_def, Option::V6, buf));
);
ASSERT_TRUE(option);
ASSERT_NO_THROW(address = option->readAddress(i));
EXPECT_EQ(addresses[i].toText(), address.toText());
}
+
+ // Check that it is ok if buffer length is not a multiple of IPv6
+ // address length. Resize it by two bytes.
+ buf.resize(buf.size() + 2);
+ EXPECT_NO_THROW(
+ option.reset(new OptionCustom(opt_def, Option::V6, buf));
+ );
+
+ // Check that option is not created when the provided buffer
+ // is too short. At least a buffer length of 16 bytes is needed.
+ EXPECT_THROW(
+ option.reset(new OptionCustom(opt_def, Option::V6, buf.begin(),
+ buf.begin() + 15)),
+ isc::OutOfRange
+ );
}
// The purpose of this test is to verify that the option definition comprising
boost::scoped_ptr<OptionCustom> option;
ASSERT_NO_THROW(
- option.reset(new OptionCustom(opt_def, Option::V6, buf.begin(), buf.begin() + 27));
+ option.reset(new OptionCustom(opt_def, Option::V6, buf.begin(), buf.end()));
);
ASSERT_TRUE(option);
// Use the input buffer to create custom option.
boost::scoped_ptr<OptionCustom> option;
ASSERT_NO_THROW(
- option.reset(new OptionCustom(opt_def, Option::V4, buf.begin(), buf.begin() + 13));
+ option.reset(new OptionCustom(opt_def, Option::V4, buf.begin(), buf.end()));
);
ASSERT_TRUE(option);
// Use the input buffer to create custom option.
boost::scoped_ptr<OptionCustom> option;
ASSERT_NO_THROW(
- option.reset(new OptionCustom(opt_def, Option::V6, buf.begin(), buf.begin() + 50));
+ option.reset(new OptionCustom(opt_def, Option::V6, buf.begin(), buf.end()));
);
ASSERT_TRUE(option);