diff --git a/src/seeder/test/seeder_tests.cpp b/src/seeder/test/seeder_tests.cpp --- a/src/seeder/test/seeder_tests.cpp +++ b/src/seeder/test/seeder_tests.cpp @@ -17,6 +17,7 @@ // Max size of the null-terminated buffer parse_name() writes to. static const int MAX_QUERY_NAME_BUFFER_LENGTH = MAX_QUERY_NAME_LENGTH + 1; static const uint8_t END_OF_NAME_FIELD = 0; +static const size_t MAX_LABEL_LENGTH = 63; // Builds the name field of the question section of a DNS query static std::vector @@ -87,7 +88,21 @@ } } -BOOST_AUTO_TEST_CASE(parse_name_tests) { +static void CheckParseNameError( + const std::string &queryName, const int expectedError, + const size_t &outputBufferSize = MAX_QUERY_NAME_BUFFER_LENGTH) { + std::vector nameField = CreateDNSQuestionNameField(queryName); + + std::vector parsedQueryName(outputBufferSize, 0); + const uint8_t *nameFieldBegin = nameField.data(); + int ret = parse_name(&nameFieldBegin, nameFieldBegin + nameField.size(), + nameField.data(), parsedQueryName.data(), + parsedQueryName.size()); + + BOOST_CHECK_EQUAL(ret, expectedError); +} + +BOOST_AUTO_TEST_CASE(parse_name_simple_tests) { CheckParseName("www.domain.com"); CheckParseName("domain.com"); CheckParseName("sub1.sub2.domain.co.uk"); @@ -97,4 +112,17 @@ CheckParseName("my-domain.com"); } +BOOST_AUTO_TEST_CASE(parse_name_label_tests) { + // Check behavior for name with maximum length label + std::string maxLengthLabel; + for (size_t i = 0; i < MAX_LABEL_LENGTH; i++) { + maxLengthLabel += 'a'; + } + BOOST_CHECK_EQUAL(maxLengthLabel.size(), MAX_LABEL_LENGTH); + CheckParseName("www." + maxLengthLabel + ".com"); + + // Check that an oversized label causes an error + CheckParseNameError("www." + maxLengthLabel + "a.com", -1); +} + BOOST_AUTO_TEST_SUITE_END()