// Create an instance of the source option.
boost::scoped_ptr<Option4ClientFqdn> option;
ASSERT_NO_THROW(
- option.reset(new Option4ClientFqdn(Option4ClientFqdn::FLAG_S,
+ option.reset(new Option4ClientFqdn(FLAG_S | FLAG_E,
Option4ClientFqdn::RCODE_SERVER(),
"",
Option4ClientFqdn::PARTIAL))
EXPECT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_O));
EXPECT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_N));
EXPECT_TRUE(option->getFlag(Option4ClientFqdn::FLAG_S));
+ EXPECT_TRUE(option->getFlag(Option4ClientFqdn::FLAG_E));
EXPECT_TRUE(option->getDomainName().empty());
EXPECT_EQ(Option4ClientFqdn::PARTIAL, option->getDomainNameType());
// Constructor should not accept empty fully qualified domain name.
- EXPECT_THROW(Option4ClientFqdn(Option4ClientFqdn::FLAG_S,
+ EXPECT_THROW(Option4ClientFqdn(FLAG_S | FLAG_E,
Option4ClientFqdn::RCODE_CLIENT(),
"",
Option4ClientFqdn::FULL),
InvalidOption4ClientFqdnDomainName);
// This check is similar to previous one, but using domain-name comprising
// a single space character. This should be treated as empty domain-name.
- EXPECT_THROW(Option4ClientFqdn(Option4ClientFqdn::FLAG_S,
+ EXPECT_THROW(Option4ClientFqdn(FLAG_S | FLAG_E,
Option4ClientFqdn::RCODE_CLIENT(),
" ",
Option4ClientFqdn::FULL),
// Try different constructor.
ASSERT_NO_THROW(
- option.reset(new Option4ClientFqdn(Option4ClientFqdn::FLAG_O,
+ option.reset(new Option4ClientFqdn(FLAG_O | FLAG_E,
Option4ClientFqdn::RCODE_SERVER()))
);
ASSERT_TRUE(option);
EXPECT_TRUE(option->getFlag(Option4ClientFqdn::FLAG_O));
+ EXPECT_TRUE(option->getFlag(Option4ClientFqdn::FLAG_E));
EXPECT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_N));
EXPECT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_S));
EXPECT_TRUE(option->getDomainName().empty());
// Create an instance of the source option.
boost::scoped_ptr<Option4ClientFqdn> option;
ASSERT_NO_THROW(
- option.reset(new Option4ClientFqdn(Option4ClientFqdn::FLAG_S,
+ option.reset(new Option4ClientFqdn(FLAG_S | FLAG_E,
Option4ClientFqdn::RCODE_SERVER(),
"myhost.example.com",
Option4ClientFqdn::FULL))
// Verify that all parameters have been copied to the target object.
EXPECT_TRUE(option_copy->getFlag(Option4ClientFqdn::FLAG_S));
+ EXPECT_TRUE(option_copy->getFlag(Option4ClientFqdn::FLAG_E));
EXPECT_FALSE(option_copy->getFlag(Option4ClientFqdn::FLAG_O));
EXPECT_FALSE(option_copy->getFlag(Option4ClientFqdn::FLAG_N));
EXPECT_EQ("myhost.example.com.", option_copy->getDomainName());
// Create an option with different parameters.
ASSERT_NO_THROW(
- option.reset(new Option4ClientFqdn(Option4ClientFqdn::FLAG_O,
+ option.reset(new Option4ClientFqdn(FLAG_O | FLAG_E,
Option4ClientFqdn::RCODE_SERVER(),
"example",
Option4ClientFqdn::PARTIAL))
option.reset();
EXPECT_FALSE(option_copy->getFlag(Option4ClientFqdn::FLAG_S));
+ EXPECT_TRUE(option_copy->getFlag(Option4ClientFqdn::FLAG_E));
EXPECT_TRUE(option_copy->getFlag(Option4ClientFqdn::FLAG_O));
EXPECT_FALSE(option_copy->getFlag(Option4ClientFqdn::FLAG_N));
EXPECT_EQ("example", option_copy->getDomainName());
// This test verifies that the option in the on-wire format is parsed correctly.
TEST(Option4ClientFqdnTest, constructFromWire) {
const uint8_t in_data[] = {
- FLAG_S, // flags
+ FLAG_S | FLAG_E, // flags
0, // RCODE1
0, // RCODE2
6, 109, 121, 104, 111, 115, 116, // myhost.
ASSERT_TRUE(option);
EXPECT_TRUE(option->getFlag(Option4ClientFqdn::FLAG_S));
+ EXPECT_TRUE(option->getFlag(Option4ClientFqdn::FLAG_E));
EXPECT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_O));
EXPECT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_N));
EXPECT_EQ("myhost.example.com.", option->getDomainName());
// domain-name is parsed correctly.
TEST(Option4ClientFqdnTest, constructFromWirePartial) {
const uint8_t in_data[] = {
- FLAG_N, // flags
+ FLAG_N | FLAG_E, // flags
255, // RCODE1
255, // RCODE2
6, 109, 121, 104, 111, 115, 116 // myhost
ASSERT_TRUE(option);
EXPECT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_S));
+ EXPECT_TRUE(option->getFlag(Option4ClientFqdn::FLAG_E));
EXPECT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_O));
EXPECT_TRUE(option->getFlag(Option4ClientFqdn::FLAG_N));
EXPECT_EQ("myhost", option->getDomainName());
// assignment test. If these asserts do not fail, we can create options
// for the assignment test, do not surround them with asserts and be sure
// they will not throw.
- ASSERT_NO_THROW(Option4ClientFqdn(Option4ClientFqdn::FLAG_S,
+ ASSERT_NO_THROW(Option4ClientFqdn(FLAG_S | FLAG_E,
Option4ClientFqdn::RCODE_SERVER(),
"myhost.example.com",
Option4ClientFqdn::FULL));
- ASSERT_NO_THROW(Option4ClientFqdn(Option4ClientFqdn::FLAG_N,
+ ASSERT_NO_THROW(Option4ClientFqdn(FLAG_N | FLAG_E,
Option4ClientFqdn::RCODE_SERVER(),
"myhost",
Option4ClientFqdn::PARTIAL));
// Create options with the same parameters as tested above.
// Create first option.
- Option4ClientFqdn option(Option4ClientFqdn::FLAG_S,
+ Option4ClientFqdn option(FLAG_S | FLAG_E,
Option4ClientFqdn::RCODE_SERVER(),
"myhost.example.com",
Option4ClientFqdn::FULL);
// Verify that the values have been set correctly.
ASSERT_TRUE(option.getFlag(Option4ClientFqdn::FLAG_S));
+ ASSERT_TRUE(option.getFlag(Option4ClientFqdn::FLAG_E));
ASSERT_FALSE(option.getFlag(Option4ClientFqdn::FLAG_O));
ASSERT_FALSE(option.getFlag(Option4ClientFqdn::FLAG_N));
ASSERT_EQ("myhost.example.com.", option.getDomainName());
ASSERT_EQ(Option4ClientFqdn::FULL, option.getDomainNameType());
// Create a second option.
- Option4ClientFqdn option2(Option4ClientFqdn::FLAG_N,
+ Option4ClientFqdn option2(FLAG_N | FLAG_E,
Option4ClientFqdn::RCODE_SERVER(),
"myhost",
Option4ClientFqdn::PARTIAL);
// Verify tha the values have been set correctly.
ASSERT_FALSE(option2.getFlag(Option4ClientFqdn::FLAG_S));
+ ASSERT_TRUE(option2.getFlag(Option4ClientFqdn::FLAG_E));
ASSERT_FALSE(option2.getFlag(Option4ClientFqdn::FLAG_O));
ASSERT_TRUE(option2.getFlag(Option4ClientFqdn::FLAG_N));
ASSERT_EQ("myhost", option2.getDomainName());
// Both options should now have the same values.
EXPECT_TRUE(option2.getFlag(Option4ClientFqdn::FLAG_S));
+ EXPECT_TRUE(option2.getFlag(Option4ClientFqdn::FLAG_E));
EXPECT_FALSE(option2.getFlag(Option4ClientFqdn::FLAG_O));
EXPECT_FALSE(option2.getFlag(Option4ClientFqdn::FLAG_N));
EXPECT_EQ(option.getDomainName(), option2.getDomainName());
// First, check that constructor does not throw when valid domain name
// is specified. That way we eliminate the possibility that constructor
// always throws exception.
- ASSERT_NO_THROW(Option4ClientFqdn(0, Option4ClientFqdn::RCODE_CLIENT(),
+ ASSERT_NO_THROW(Option4ClientFqdn(FLAG_E, Option4ClientFqdn::RCODE_CLIENT(),
"myhost.example.com"));
// Specify invalid domain name and expect that exception is thrown.
- EXPECT_THROW(Option4ClientFqdn(0, Option4ClientFqdn::RCODE_CLIENT(),
+ EXPECT_THROW(Option4ClientFqdn(FLAG_E, Option4ClientFqdn::RCODE_CLIENT(),
"my...host.example.com"),
InvalidOption4ClientFqdnDomainName);
}
TEST(Option4ClientFqdnTest, getFlag) {
boost::scoped_ptr<Option4ClientFqdn> option;
ASSERT_NO_THROW(
- option.reset(new Option4ClientFqdn(0, Option4ClientFqdn::RCODE_CLIENT(),
+ option.reset(new Option4ClientFqdn(FLAG_E,
+ Option4ClientFqdn::RCODE_CLIENT(),
"myhost.example.com"))
);
ASSERT_TRUE(option);
// Create option instance. Check that constructor doesn't throw.
boost::scoped_ptr<Option4ClientFqdn> option;
ASSERT_NO_THROW(
- option.reset(new Option4ClientFqdn(0, Option4ClientFqdn::RCODE_CLIENT(),
+ option.reset(new Option4ClientFqdn(0,
+ Option4ClientFqdn::RCODE_CLIENT(),
"myhost.example.com"))
);
ASSERT_TRUE(option);
ASSERT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_N));
ASSERT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_S));
ASSERT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_O));
+ ASSERT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_E));
+
+ // Set E = 1
+ ASSERT_NO_THROW(option->setFlag(Option4ClientFqdn::FLAG_E, true));
+ ASSERT_TRUE(option->getFlag(Option4ClientFqdn::FLAG_E));
// Set N = 1
ASSERT_NO_THROW(option->setFlag(Option4ClientFqdn::FLAG_N, true));
ASSERT_THROW(option->setFlag(Option4ClientFqdn::FLAG_S, true),
InvalidOption4ClientFqdnFlags);
+ // Set E = 0
+ ASSERT_NO_THROW(option->setFlag(Option4ClientFqdn::FLAG_N, false));
+ ASSERT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_N));
+
// Set N = 0
ASSERT_NO_THROW(option->setFlag(Option4ClientFqdn::FLAG_N, false));
ASSERT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_N));
true),
InvalidOption4ClientFqdnFlags);
- flags = 0x14;
+ flags = 0x18;
ASSERT_THROW(option->setFlag(static_cast<Option4ClientFqdn::Flag>(flags),
true),
InvalidOption4ClientFqdnFlags);
TEST(Option4ClientFqdnTest, resetFlags) {
boost::scoped_ptr<Option4ClientFqdn> option;
ASSERT_NO_THROW(
- option.reset(new Option4ClientFqdn(Option4ClientFqdn::FLAG_S |
- Option4ClientFqdn::FLAG_O,
+ option.reset(new Option4ClientFqdn(FLAG_S | FLAG_O | FLAG_E,
Option4ClientFqdn::RCODE_CLIENT(),
"myhost.example.com",
Option4ClientFqdn::FULL))
ASSERT_TRUE(option->getFlag(Option4ClientFqdn::FLAG_S));
ASSERT_TRUE(option->getFlag(Option4ClientFqdn::FLAG_O));
ASSERT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_N));
+ ASSERT_TRUE(option->getFlag(Option4ClientFqdn::FLAG_E));
option->resetFlags();
EXPECT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_S));
EXPECT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_O));
EXPECT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_N));
+ EXPECT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_E));
}
// This test verifies that current domain-name can be replaced with a new
TEST(Option4ClientFqdnTest, setDomainName) {
boost::scoped_ptr<Option4ClientFqdn> option;
ASSERT_NO_THROW(
- option.reset(new Option4ClientFqdn(Option4ClientFqdn::FLAG_S,
+ option.reset(new Option4ClientFqdn(FLAG_S | FLAG_E,
Option4ClientFqdn::RCODE_SERVER(),
"myhost.example.com",
Option4ClientFqdn::FULL))
TEST(Option4ClientFqdnTest, resetDomainName) {
boost::scoped_ptr<Option4ClientFqdn> option;
ASSERT_NO_THROW(
- option.reset(new Option4ClientFqdn(Option4ClientFqdn::FLAG_S,
+ option.reset(new Option4ClientFqdn(FLAG_S | FLAG_E,
Option4ClientFqdn::RCODE_CLIENT(),
"myhost.example.com",
Option4ClientFqdn::FULL))
// This test verifies on-wire format of the option is correctly created.
TEST(Option4ClientFqdnTest, pack) {
// Create option instance. Check that constructor doesn't throw.
- const uint8_t flags = Option4ClientFqdn::FLAG_S;
+ const uint8_t flags = FLAG_S | FLAG_E;
boost::scoped_ptr<Option4ClientFqdn> option;
ASSERT_NO_THROW(
option.reset(new Option4ClientFqdn(flags,
// Prepare reference data.
const uint8_t ref_data[] = {
81, 23, // header
- FLAG_S, // flags
+ FLAG_S | FLAG_E, // flags
0, // RCODE1
0, // RCODE2
6, 109, 121, 104, 111, 115, 116, // myhost.
// is correctly created.
TEST(Option4ClientFqdnTest, packPartial) {
// Create option instance. Check that constructor doesn't throw.
- const uint8_t flags = Option4ClientFqdn::FLAG_S;
+ const uint8_t flags = FLAG_S | FLAG_E;
boost::scoped_ptr<Option4ClientFqdn> option;
ASSERT_NO_THROW(
option.reset(new Option4ClientFqdn(flags,
// Prepare reference data.
const uint8_t ref_data[] = {
81, 10, // header
- FLAG_S, // flags
+ FLAG_S | FLAG_E, // flags
0, // RCODE1
0, // RCODE2
6, 109, 121, 104, 111, 115, 116 // myhost
// Create option instance. Check that constructor doesn't throw.
boost::scoped_ptr<Option4ClientFqdn> option;
ASSERT_NO_THROW(
- option.reset(new Option4ClientFqdn(Option4ClientFqdn::FLAG_O,
+ option.reset(new Option4ClientFqdn(FLAG_O | FLAG_E,
Option4ClientFqdn::RCODE_CLIENT(),
"myhost",
Option4ClientFqdn::PARTIAL))
EXPECT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_S));
EXPECT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_N));
EXPECT_TRUE(option->getFlag(Option4ClientFqdn::FLAG_O));
+ EXPECT_TRUE(option->getFlag(Option4ClientFqdn::FLAG_E));
EXPECT_EQ("myhost", option->getDomainName());
EXPECT_EQ(Option4ClientFqdn::PARTIAL, option->getDomainNameType());
const uint8_t in_data[] = {
- FLAG_S, // flags
+ FLAG_S | FLAG_E, // flags
0, // RCODE1
0, // RCODE2
6, 109, 121, 104, 111, 115, 116, // myhost.
EXPECT_TRUE(option->getFlag(Option4ClientFqdn::FLAG_S));
EXPECT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_N));
EXPECT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_O));
+ EXPECT_TRUE(option->getFlag(Option4ClientFqdn::FLAG_E));
EXPECT_EQ("myhost.example.com.", option->getDomainName());
EXPECT_EQ(Option4ClientFqdn::FULL, option->getDomainNameType());
}
// Create option instance. Check that constructor doesn't throw.
boost::scoped_ptr<Option4ClientFqdn> option;
ASSERT_NO_THROW(
- option.reset(new Option4ClientFqdn(Option4ClientFqdn::FLAG_O,
+ option.reset(new Option4ClientFqdn(FLAG_O | FLAG_E,
Option4ClientFqdn::RCODE_CLIENT(),
"myhost.example.com"))
);
EXPECT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_S));
EXPECT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_N));
EXPECT_TRUE(option->getFlag(Option4ClientFqdn::FLAG_O));
+ EXPECT_TRUE(option->getFlag(Option4ClientFqdn::FLAG_E));
EXPECT_EQ("myhost.example.com.", option->getDomainName());
EXPECT_EQ(Option4ClientFqdn::FULL, option->getDomainNameType());
const uint8_t in_data[] = {
- FLAG_S, // flags
+ FLAG_S | FLAG_E, // flags
0, // RCODE1
0, // RCODE2
6, 109, 121, 104, 111, 115, 116 // myhost
// Check that new values are correct.
EXPECT_TRUE(option->getFlag(Option4ClientFqdn::FLAG_S));
+ EXPECT_TRUE(option->getFlag(Option4ClientFqdn::FLAG_E));
EXPECT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_N));
EXPECT_FALSE(option->getFlag(Option4ClientFqdn::FLAG_O));
EXPECT_EQ("myhost", option->getDomainName());
TEST(Option4ClientFqdnTest, unpackTruncated) {
boost::scoped_ptr<Option4ClientFqdn> option;
ASSERT_NO_THROW(
- option.reset(new Option4ClientFqdn(Option4ClientFqdn::FLAG_O,
+ option.reset(new Option4ClientFqdn(FLAG_O | FLAG_E,
Option4ClientFqdn::RCODE_CLIENT()))
);
ASSERT_TRUE(option);
// toText method is correctly formatted.
TEST(Option4ClientFqdnTest, toText) {
// Create option instance. Check that constructor doesn't throw.
- uint8_t flags = Option4ClientFqdn::FLAG_N | Option4ClientFqdn::FLAG_O;
+ uint8_t flags = FLAG_N | FLAG_O | FLAG_E;
boost::scoped_ptr<Option4ClientFqdn> option;
ASSERT_NO_THROW(
option.reset(new Option4ClientFqdn(flags,
" type=81(CLIENT_FQDN)\n"
" flags:\n"
" N=1\n"
- " E=0\n"
+ " E=1\n"
" O=1\n"
" S=0\n"
" domain-name='myhost.example.com.' (full)\n";
// Create option instance. Check that constructor doesn't throw.
boost::scoped_ptr<Option4ClientFqdn> option;
ASSERT_NO_THROW(
- option.reset(new Option4ClientFqdn(0, Option4ClientFqdn::RCODE_CLIENT(),
+ option.reset(new Option4ClientFqdn(FLAG_E,
+ Option4ClientFqdn::RCODE_CLIENT(),
"myhost.example.com"))
);
ASSERT_TRUE(option);
// Let's check that the size will change when domain name of a different
// size is used.
ASSERT_NO_THROW(
- option.reset(new Option4ClientFqdn(0, Option4ClientFqdn::RCODE_CLIENT(),
+ option.reset(new Option4ClientFqdn(FLAG_E,
+ Option4ClientFqdn::RCODE_CLIENT(),
"example.com"))
);
ASSERT_TRUE(option);
EXPECT_EQ(18, option->len());
ASSERT_NO_THROW(
- option.reset(new Option4ClientFqdn(0, Option4ClientFqdn::RCODE_CLIENT(),
+ option.reset(new Option4ClientFqdn(FLAG_E,
+ Option4ClientFqdn::RCODE_CLIENT(),
"myhost",
Option4ClientFqdn::PARTIAL))
);