Commit 81cf2b7a authored by Michal 'vorner' Vaner's avatar Michal 'vorner' Vaner
Browse files

[2383] Clarify @ in names

If it is alone, it means the origin (or root, if the absolute-name
constructor is used). If it is not alone, it is taken verbatim, without
any special meaning.

Add some tests to verify this.

Remove unused enum value. It was a relict from non-exact port of bind9
parent cfcad4db
......@@ -123,11 +123,7 @@ typedef enum {
ft_ordinary, // parsing an ordinary label
ft_initialescape, // just found '\'
ft_escape, // begin of handling a '\'-escaped sequence
ft_escdecimal, // parsing a '\DDD' octet.
// Unused at this moment. We'll revisit this when we support master file
// parser where @ is used to mean an origin name.
ft_escdecimal // parsing a '\DDD' octet.
} ft_state;
// The parser of name from a string. It is a template, because
......@@ -283,7 +279,7 @@ stringParse(Iterator s, Iterator send, bool downcase, Offsets& offsets,
string(orig_s, send));
assert(s == send);
if (state != ft_ordinary && state != ft_at) {
if (state != ft_ordinary) {
"incomplete textual name in " <<
(empty ? "<empty>" : string(orig_s, send)));
......@@ -295,6 +295,30 @@ TEST_F(NameTest, combinedTooLong) {
// Test the handling of @ in the name. If it is alone, it is the origin (when
// it exists) or the root. If it is somewhere else, it has no special meaning.
TEST_F(NameTest, atSign) {
// If it is alone, it is the origin
EXPECT_EQ(origin_name, Name("@", 1, &origin_name));
EXPECT_THROW(Name("@", 1, NULL), MissingNameOrigin);
EXPECT_EQ(Name::ROOT_NAME(), Name("@"));
// It is not alone. It is taken verbatim. We check the name converted
// back to the textual form, since checking it agains other name object
// may be wrong -- if we create it wrong the same way as the tested
// object.
EXPECT_EQ("\\@.", Name("@.").toText());
EXPECT_EQ("\\@.", Name("@.", 2, NULL).toText());
EXPECT_EQ("\\@something.", Name("@something").toText());
EXPECT_EQ("something\\@.", Name("something@").toText());
EXPECT_EQ("\\", Name("@x", 2, &origin_name).toText());
EXPECT_EQ("x\\", Name("x@", 2, &origin_name).toText());
// An escaped at-sign isn't active
EXPECT_EQ("\\@.", Name("\\@").toText());
EXPECT_EQ("\\", Name("\\@", 2, &origin_name).toText());
TEST_F(NameTest, fromWire) {
// test cases derived from BIND9 tests.
......@@ -593,7 +617,6 @@ TEST_F(NameTest, downcase) {
// confirm the calling object is actually modified
compareInWireFormat(example_name_upper, example_name);
TEST_F(NameTest, at) {
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment