|
@@ -39,19 +39,19 @@ using namespace isc::util::encode;
|
|
using namespace isc::dns::rdata;
|
|
using namespace isc::dns::rdata;
|
|
|
|
|
|
namespace {
|
|
namespace {
|
|
|
|
+
|
|
|
|
+// Note: some tests can be shared with NSEC3PARAM. They are unified as
|
|
|
|
+// typed tests defined in nsec3param_like_unittest.
|
|
class Rdata_NSEC3_Test : public RdataTest {
|
|
class Rdata_NSEC3_Test : public RdataTest {
|
|
// there's nothing to specialize
|
|
// there's nothing to specialize
|
|
public:
|
|
public:
|
|
Rdata_NSEC3_Test() :
|
|
Rdata_NSEC3_Test() :
|
|
nsec3_txt("1 1 1 D399EAAB H9RSFB7FPF2L8HG35CMPC765TDK23RP6 "
|
|
nsec3_txt("1 1 1 D399EAAB H9RSFB7FPF2L8HG35CMPC765TDK23RP6 "
|
|
"NS SOA RRSIG DNSKEY NSEC3PARAM"),
|
|
"NS SOA RRSIG DNSKEY NSEC3PARAM"),
|
|
- nsec3_nosalt_txt("1 1 1 - H9RSFB7FPF2L8HG35CMPC765TDK23RP6 A" ),
|
|
|
|
- obuffer(0), renderer(obuffer)
|
|
|
|
|
|
+ nsec3_nosalt_txt("1 1 1 - H9RSFB7FPF2L8HG35CMPC765TDK23RP6 A" )
|
|
{}
|
|
{}
|
|
const string nsec3_txt;
|
|
const string nsec3_txt;
|
|
const string nsec3_nosalt_txt;
|
|
const string nsec3_nosalt_txt;
|
|
- OutputBuffer obuffer;
|
|
|
|
- MessageRenderer renderer;
|
|
|
|
};
|
|
};
|
|
|
|
|
|
TEST_F(Rdata_NSEC3_Test, fromText) {
|
|
TEST_F(Rdata_NSEC3_Test, fromText) {
|
|
@@ -59,20 +59,6 @@ TEST_F(Rdata_NSEC3_Test, fromText) {
|
|
// text and construct nsec3_txt. It will be tested against the wire format
|
|
// text and construct nsec3_txt. It will be tested against the wire format
|
|
// representation in the createFromWire test.
|
|
// representation in the createFromWire test.
|
|
|
|
|
|
- // Numeric parameters have possible maximum values. Unusual, but must
|
|
|
|
- // be accepted.
|
|
|
|
- EXPECT_NO_THROW(generic::NSEC3("255 255 65535 D399EAAB "
|
|
|
|
- "H9RSFB7FPF2L8HG35CMPC765TDK23RP6 "
|
|
|
|
- "NS SOA RRSIG DNSKEY NSEC3PARAM"));
|
|
|
|
-
|
|
|
|
- // 0-length salt
|
|
|
|
- EXPECT_EQ(0, generic::NSEC3(nsec3_nosalt_txt).getSalt().size());
|
|
|
|
-
|
|
|
|
- // salt that has the possible max length
|
|
|
|
- EXPECT_EQ(255, generic::NSEC3("1 1 1 " + string(255 * 2, '0') +
|
|
|
|
- " H9RSFB7FPF2L8HG35CMPC765TDK23RP6 "
|
|
|
|
- "NS").getSalt().size());
|
|
|
|
-
|
|
|
|
// hash that has the possible max length (see badText about the magic
|
|
// hash that has the possible max length (see badText about the magic
|
|
// numbers)
|
|
// numbers)
|
|
EXPECT_EQ(255, generic::NSEC3("1 1 1 D399EAAB " +
|
|
EXPECT_EQ(255, generic::NSEC3("1 1 1 D399EAAB " +
|
|
@@ -84,47 +70,20 @@ TEST_F(Rdata_NSEC3_Test, fromText) {
|
|
"1 1 1 D399EAAB H9RSFB7FPF2L8HG35CMPC765TDK23RP6"));
|
|
"1 1 1 D399EAAB H9RSFB7FPF2L8HG35CMPC765TDK23RP6"));
|
|
}
|
|
}
|
|
|
|
|
|
-TEST_F(Rdata_NSEC3_Test, toText) {
|
|
|
|
- // normal case
|
|
|
|
- const generic::NSEC3 rdata_nsec3(nsec3_txt);
|
|
|
|
- EXPECT_EQ(nsec3_txt, rdata_nsec3.toText());
|
|
|
|
-
|
|
|
|
- // empty salt case
|
|
|
|
- EXPECT_EQ(nsec3_nosalt_txt, generic::NSEC3(nsec3_nosalt_txt).toText());
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
TEST_F(Rdata_NSEC3_Test, badText) {
|
|
TEST_F(Rdata_NSEC3_Test, badText) {
|
|
EXPECT_THROW(generic::NSEC3("1 1 1 ADDAFEEE "
|
|
EXPECT_THROW(generic::NSEC3("1 1 1 ADDAFEEE "
|
|
"0123456789ABCDEFGHIJKLMNOPQRSTUV "
|
|
"0123456789ABCDEFGHIJKLMNOPQRSTUV "
|
|
"BIFF POW SPOON"),
|
|
"BIFF POW SPOON"),
|
|
InvalidRdataText);
|
|
InvalidRdataText);
|
|
- EXPECT_THROW(generic::NSEC3("1 1 1 ADDAFEE "
|
|
|
|
- "WXYZWXYZWXYZ=WXYZWXYZ==WXYZWXYZW A NS SOA"),
|
|
|
|
- BadValue); // bad hex
|
|
|
|
- EXPECT_THROW(generic::NSEC3("1 1 1 -- H9RSFB7FPF2L8HG35CMPC765TDK23RP6 "
|
|
|
|
- "A"),
|
|
|
|
- BadValue); // this shouldn't be confused a valid empty salt
|
|
|
|
EXPECT_THROW(generic::NSEC3("1 1 1 ADDAFEEE "
|
|
EXPECT_THROW(generic::NSEC3("1 1 1 ADDAFEEE "
|
|
"WXYZWXYZWXYZ=WXYZWXYZ==WXYZWXYZW A NS SOA"),
|
|
"WXYZWXYZWXYZ=WXYZWXYZ==WXYZWXYZW A NS SOA"),
|
|
BadValue); // bad base32hex
|
|
BadValue); // bad base32hex
|
|
- EXPECT_THROW(generic::NSEC3("1000000 1 1 ADDAFEEE "
|
|
|
|
- "0123456789ABCDEFGHIJKLMNOPQRSTUV A NS SOA"),
|
|
|
|
- InvalidRdataText);
|
|
|
|
- EXPECT_THROW(generic::NSEC3("1 1000000 1 ADDAFEEE "
|
|
|
|
- "0123456789ABCDEFGHIJKLMNOPQRSTUV A NS SOA"),
|
|
|
|
- InvalidRdataText);
|
|
|
|
EXPECT_THROW(generic::NSEC3("1 1 1000000 ADDAFEEE "
|
|
EXPECT_THROW(generic::NSEC3("1 1 1000000 ADDAFEEE "
|
|
"0123456789ABCDEFGHIJKLMNOPQRSTUV A NS SOA"),
|
|
"0123456789ABCDEFGHIJKLMNOPQRSTUV A NS SOA"),
|
|
InvalidRdataText);
|
|
InvalidRdataText);
|
|
|
|
|
|
- // There should be a space between "1" and "D399EAAB" (salt)
|
|
|
|
- EXPECT_THROW(generic::NSEC3(
|
|
|
|
- "1 1 1D399EAAB H9RSFB7FPF2L8HG35CMPC765TDK23RP6 "
|
|
|
|
- "NS SOA RRSIG DNSKEY NSEC3PARAM"), InvalidRdataText);
|
|
|
|
-
|
|
|
|
- // Salt is too long (possible max + 1 bytes)
|
|
|
|
- EXPECT_THROW(generic::NSEC3("1 1 1 " + string(256 * 2, '0') +
|
|
|
|
- " H9RSFB7FPF2L8HG35CMPC765TDK23RP6 NS"),
|
|
|
|
|
|
+ // Next hash shouldn't be padded
|
|
|
|
+ EXPECT_THROW(generic::NSEC3("1 1 1 ADDAFEEE CPNMU=== A NS SOA"),
|
|
InvalidRdataText);
|
|
InvalidRdataText);
|
|
|
|
|
|
// Hash is too long. Max = 255 bytes, base32-hex converts each 5 bytes
|
|
// Hash is too long. Max = 255 bytes, base32-hex converts each 5 bytes
|
|
@@ -136,34 +95,12 @@ TEST_F(Rdata_NSEC3_Test, badText) {
|
|
}
|
|
}
|
|
|
|
|
|
TEST_F(Rdata_NSEC3_Test, createFromWire) {
|
|
TEST_F(Rdata_NSEC3_Test, createFromWire) {
|
|
- // Normal case
|
|
|
|
- const generic::NSEC3 rdata_nsec3(nsec3_txt);
|
|
|
|
- EXPECT_EQ(0, rdata_nsec3.compare(
|
|
|
|
- *rdataFactoryFromFile(RRType::NSEC3(), RRClass::IN(),
|
|
|
|
- "rdata_nsec3_fromWire1")));
|
|
|
|
-
|
|
|
|
// A valid NSEC3 RR with empty type bitmap.
|
|
// A valid NSEC3 RR with empty type bitmap.
|
|
EXPECT_NO_THROW(rdataFactoryFromFile(RRType::NSEC3(), RRClass::IN(),
|
|
EXPECT_NO_THROW(rdataFactoryFromFile(RRType::NSEC3(), RRClass::IN(),
|
|
"rdata_nsec3_fromWire15.wire"));
|
|
"rdata_nsec3_fromWire15.wire"));
|
|
|
|
|
|
- // Too short RDLENGTH: it doesn't even contain the first 5 octets.
|
|
|
|
- EXPECT_THROW(rdataFactoryFromFile(RRType::NSEC3(), RRClass::IN(),
|
|
|
|
- "rdata_nsec3_fromWire2.wire"),
|
|
|
|
- DNSMessageFORMERR);
|
|
|
|
-
|
|
|
|
// Invalid bitmap cases are tested in Rdata_NSECBITMAP_Test.
|
|
// Invalid bitmap cases are tested in Rdata_NSECBITMAP_Test.
|
|
|
|
|
|
- // salt length is too large
|
|
|
|
- EXPECT_THROW(rdataFactoryFromFile(RRType::NSEC3(), RRClass::IN(),
|
|
|
|
- "rdata_nsec3_fromWire11.wire"),
|
|
|
|
- DNSMessageFORMERR);
|
|
|
|
-
|
|
|
|
- // empty salt. unusual, but valid.
|
|
|
|
- ConstRdataPtr rdata =
|
|
|
|
- rdataFactoryFromFile(RRType::NSEC3(), RRClass::IN(),
|
|
|
|
- "rdata_nsec3_fromWire13.wire");
|
|
|
|
- EXPECT_EQ(0, dynamic_cast<const generic::NSEC3&>(*rdata).getSalt().size());
|
|
|
|
-
|
|
|
|
// hash length is too large
|
|
// hash length is too large
|
|
EXPECT_THROW(rdataFactoryFromFile(RRType::NSEC3(), RRClass::IN(),
|
|
EXPECT_THROW(rdataFactoryFromFile(RRType::NSEC3(), RRClass::IN(),
|
|
"rdata_nsec3_fromWire12.wire"),
|
|
"rdata_nsec3_fromWire12.wire"),
|
|
@@ -193,37 +130,6 @@ TEST_F(Rdata_NSEC3_Test, createFromWire) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-template <typename OUTPUT_TYPE>
|
|
|
|
-void
|
|
|
|
-toWireCheck(OUTPUT_TYPE& output, const char* const data_file) {
|
|
|
|
- vector<uint8_t> data;
|
|
|
|
- UnitTestUtil::readWireData(data_file, data);
|
|
|
|
- InputBuffer buffer(&data[0], data.size());
|
|
|
|
- const uint16_t rdlen = buffer.readUint16();
|
|
|
|
- const generic::NSEC3 nsec3 =
|
|
|
|
- dynamic_cast<const generic::NSEC3&>(*createRdata(
|
|
|
|
- RRType::NSEC3(), RRClass::IN(),
|
|
|
|
- buffer, rdlen));
|
|
|
|
-
|
|
|
|
- output.clear();
|
|
|
|
- output.writeUint16(rdlen);
|
|
|
|
- nsec3.toWire(output);
|
|
|
|
- EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, output.getData(),
|
|
|
|
- output.getLength(), &data[0], data.size());
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-TEST_F(Rdata_NSEC3_Test, toWire) {
|
|
|
|
- // normal case
|
|
|
|
- toWireCheck(renderer, "rdata_nsec3_fromWire1");
|
|
|
|
- toWireCheck(obuffer, "rdata_nsec3_fromWire1");
|
|
|
|
-
|
|
|
|
- // empty salt
|
|
|
|
- toWireCheck(renderer, "rdata_nsec3_fromWire13.wire");
|
|
|
|
- toWireCheck(obuffer, "rdata_nsec3_fromWire13.wire");
|
|
|
|
-
|
|
|
|
- // empty bitmap case is handled in the bitmap tests
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
TEST_F(Rdata_NSEC3_Test, assign) {
|
|
TEST_F(Rdata_NSEC3_Test, assign) {
|
|
generic::NSEC3 rdata_nsec3(nsec3_txt);
|
|
generic::NSEC3 rdata_nsec3(nsec3_txt);
|
|
generic::NSEC3 other_nsec3 = rdata_nsec3;
|
|
generic::NSEC3 other_nsec3 = rdata_nsec3;
|
|
@@ -240,14 +146,8 @@ TEST_F(Rdata_NSEC3_Test, compare) {
|
|
|
|
|
|
// test RDATAs, sorted in the ascendent order. We only check comparison
|
|
// test RDATAs, sorted in the ascendent order. We only check comparison
|
|
// on NSEC3-specific fields. Bitmap comparison is tested in the bitmap
|
|
// on NSEC3-specific fields. Bitmap comparison is tested in the bitmap
|
|
- // tests.
|
|
|
|
|
|
+ // tests. Common cases for NSEC3 and NSECPARAM3 are in their shared tests.
|
|
vector<generic::NSEC3> compare_set;
|
|
vector<generic::NSEC3> compare_set;
|
|
- compare_set.push_back(generic::NSEC3("0 0 0 D399EAAB D1K6GQ38"));
|
|
|
|
- compare_set.push_back(generic::NSEC3("1 0 0 D399EAAB D1K6GQ38"));
|
|
|
|
- compare_set.push_back(generic::NSEC3("1 1 0 D399EAAB D1K6GQ38"));
|
|
|
|
- compare_set.push_back(generic::NSEC3("1 1 1 - D1K6GQ38"));
|
|
|
|
- compare_set.push_back(generic::NSEC3("1 1 1 D399EAAB D1K6GQ38"));
|
|
|
|
- compare_set.push_back(generic::NSEC3("1 1 1 FF99EAAB D1K6GQ38"));
|
|
|
|
compare_set.push_back(generic::NSEC3("1 1 1 FF99EA0000 D1K6GQ38"));
|
|
compare_set.push_back(generic::NSEC3("1 1 1 FF99EA0000 D1K6GQ38"));
|
|
compare_set.push_back(generic::NSEC3("1 1 1 FF99EA0000 D1K6GQ0000000000"));
|
|
compare_set.push_back(generic::NSEC3("1 1 1 FF99EA0000 D1K6GQ0000000000"));
|
|
compare_set.push_back(generic::NSEC3("1 1 1 FF99EA0000 D1K6GQ00UUUUUUUU"));
|
|
compare_set.push_back(generic::NSEC3("1 1 1 FF99EA0000 D1K6GQ00UUUUUUUU"));
|