name_string(name_tok.getStringRegion());
active_origin_ = Name(name_string.beg, name_string.len,
&active_origin_);
+ if (name_string.len > 0 &&
+ name_string.beg[name_string.len - 1] != '.') {
+ callbacks_.warning(lexer_.getSourceName(),
+ lexer_.getSourceLine(),
+ "The new origin is relative, did you really"
+ " mean " + active_origin_.toText() + "?");
+ }
} else {
// If it is not optional, we must not get anything but
// a string token.
}
}
+// A commonly used helper to check callback message.
+void
+checkCallbackMessage(const string& actual_msg, const string& expected_msg,
+ size_t expected_line) {
+ // The actual message should begin with the expected message.
+ EXPECT_EQ(0, actual_msg.find(expected_msg)) << "actual message: " <<
+ actual_msg << " expected: " <<
+ expected_msg;
+
+ // and it should end with "...:<line_num>]"
+ const string line_desc = ":" + lexical_cast<string>(expected_line) + "]";
+ EXPECT_EQ(actual_msg.size() - line_desc.size(),
+ actual_msg.find(line_desc)) << "Expected on line " <<
+ expected_line;
+}
+
TEST_F(MasterLoaderTest, origin) {
// Various forms of the directive
const char* origins[] = {
loader_->load();
EXPECT_TRUE(loader_->loadedSucessfully());
EXPECT_TRUE(errors_.empty());
- EXPECT_TRUE(warnings_.empty());
+ // There's a relative origin in it, we warn about that.
+ EXPECT_EQ(1, warnings_.size());
+ checkCallbackMessage(warnings_.at(0),
+ "The new origin is relative, did you really mean "
+ "relative.sub.example.org.?", 4);
checkARR("example.org");
checkARR("www.sub.example.org");
{ NULL, NULL, NULL }
};
-// A commonly used helper to check callback message.
-void
-checkCallbackMessage(const string& actual_msg, const string& expected_msg,
- size_t expected_line) {
- // The actual message should begin with the expected message.
- EXPECT_EQ(0, actual_msg.find(expected_msg)) << "actual message: " <<
- actual_msg << " expected: " <<
- expected_msg;
-
- // and it should end with "...:<line_num>]"
- const string line_desc = ":" + lexical_cast<string>(expected_line) + "]";
- EXPECT_EQ(actual_msg.size() - line_desc.size(),
- actual_msg.find(line_desc)) << "Expected on line " <<
- expected_line;
-}
-
// Test a broken zone is handled properly. We test several problems,
// both in strict and lenient mode.
TEST_F(MasterLoaderTest, brokenZone) {
// Check we error about garbage at the end of $ORIGIN line (but the line
// works).
TEST_F(MasterLoaderTest, originWithGarbage) {
- const string origin_str = "$ORIGIN www More garbage here\n"
+ const string origin_str = "$ORIGIN www.example.org. More garbage here\n"
"@ 1H IN A 192.0.2.1\n";
stringstream ss(origin_str);
setLoader(ss, Name("example.org."), RRClass::IN(),
TEST_F(MasterLoaderTest, includeAndOrigin) {
// First, switch origin to something else, so we can check it is
// switched back.
- const string include_string = "$ORIGIN www\n"
+ const string include_string = "$ORIGIN www.example.org.\n"
"@ 1H IN A 192.0.2.1\n"
// Then include the file with data and switch origin back
"$INCLUDE " TEST_DATA_SRCDIR "/example.org example.org.\n"