parent
376d58f513
commit
487e600562
|
@ -110,10 +110,11 @@ func TestParse(t *testing.T) {
|
|||
"dnsex.nl. 86400 IN RRSIG SOA 8 2 86400 20110403154150 20110304154150 23334 dnsex.nl. QN6hwJQLEBqRVKmO2LgkuRSx9bkKIZxXlTVtHg5SaiN+8RCTckGtUXkQ vmZiBt3RdIWAjaabQYpEZHgvyjfy4Wwu/9RPDYnLt/qoyr4QKAdujchc m+fMDSbbcC7AN08i5D/dUWfNOHXjRJLY7t7AYB9DBt32LazIb0EU9QiW 5Cg=": "dnsex.nl.\t86400\tIN\tRRSIG\tSOA 8 2 86400 20110403154150 20110304154150 23334 dnsex.nl. QN6hwJQLEBqRVKmO2LgkuRSx9bkKIZxXlTVtHg5SaiN+8RCTckGtUXkQvmZiBt3RdIWAjaabQYpEZHgvyjfy4Wwu/9RPDYnLt/qoyr4QKAdujchcm+fMDSbbcC7AN08i5D/dUWfNOHXjRJLY7t7AYB9DBt32LazIb0EU9QiW5Cg=",
|
||||
}
|
||||
for i, o := range tests {
|
||||
rr, _ := NewRR(i)
|
||||
if rr == nil {
|
||||
rr, e:= NewRR(i)
|
||||
if e != nil {
|
||||
t.Log("Failed to parse RR")
|
||||
t.Fail()
|
||||
continue
|
||||
}
|
||||
if rr.String() != o {
|
||||
t.Logf("`%s' should be equal to\n`%s', but is `%s'\n", i, o, rr.String())
|
||||
|
@ -124,13 +125,17 @@ func TestParse(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestParseBraces(t *testing.T) {
|
||||
func TestParseBrace(t *testing.T) {
|
||||
tests := map[string]string{
|
||||
"(miek.nl.) 3600 IN A 127.0.0.1": "miek.nl.\t3600\tIN\tA\t127.0.0.1",
|
||||
"miek.nl. (3600) IN MX (10) elektron.atoom.net.": "miek.nl.\t3600\tIN\tMX\t10 elektron.atoom.net.",
|
||||
`miek.nl. IN (
|
||||
3600 A 127.0.0.1)`: "miek.nl.\t3600\tIN\tA\t127.0.0.1",
|
||||
"(miek.nl.) (A) (127.0.0.1)": "miek.nl.\t3600\tIN\tA\t127.0.0.1",
|
||||
`(miek.nl.) (
|
||||
(IN)
|
||||
(AAAA)
|
||||
(::1) )`: "miek.nl.\t3600\tIN\tAAAA\t::1",
|
||||
`(miek.nl.) (
|
||||
(IN)
|
||||
(AAAA)
|
||||
|
@ -145,10 +150,11 @@ func TestParseBraces(t *testing.T) {
|
|||
)`: "miek.nl.\t86400\tIN\tSOA\telektron.atoom.net. miekg.atoom.net. 2009032802 21600 7200 604800 3600",
|
||||
}
|
||||
for i, o := range tests {
|
||||
rr, _ := NewRR(i)
|
||||
if rr == nil {
|
||||
t.Log("Failed to parse RR")
|
||||
rr, e := NewRR(i)
|
||||
if e != nil {
|
||||
t.Log("Failed to parse RR: " + e.Error())
|
||||
t.Fail()
|
||||
continue
|
||||
}
|
||||
if rr.String() != o {
|
||||
t.Logf("`%s' should be equal to\n`%s', but is `%s'\n", i, o, rr.String())
|
||||
|
@ -159,6 +165,34 @@ func TestParseBraces(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
func TestLexerBrace(t *testing.T) {
|
||||
aaaa := `(miek.nl.) (
|
||||
(IN)
|
||||
(AAAA)
|
||||
::1)`
|
||||
|
||||
// aaaa = `miek.nl. (
|
||||
// IN
|
||||
// AAAA
|
||||
// ::1 ))`
|
||||
//
|
||||
var s scanner.Scanner
|
||||
c := make(chan lex)
|
||||
s.Init(strings.NewReader(aaaa))
|
||||
s.Mode = 0
|
||||
s.Whitespace = 0
|
||||
go zlexer(s, c)
|
||||
for l := range c {
|
||||
if l.err != "" {
|
||||
t.Logf("E: %s\n", l.err)
|
||||
continue
|
||||
}
|
||||
t.Logf("%s ", l)
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
func TestParseFailure(t *testing.T) {
|
||||
tests := []string{"miek.nl. IN A 327.0.0.1",
|
||||
"miek.nl. IN AAAA ::x",
|
||||
|
|
43
zscan.go
43
zscan.go
|
@ -59,10 +59,11 @@ func (e *ParseError) Error() string {
|
|||
}
|
||||
|
||||
type lex struct {
|
||||
token string // text of the token
|
||||
value int // value: _STRING, _BLANK, etc.
|
||||
line int // line in the file
|
||||
column int // column in the fil
|
||||
token string // Text of the token
|
||||
err string // Error text when the lexer detects it. Not used by the grammar
|
||||
value int // Value: _STRING, _BLANK, etc.
|
||||
line int // Line in the file
|
||||
column int // Column in the fil
|
||||
}
|
||||
|
||||
type Token struct {
|
||||
|
@ -117,6 +118,12 @@ func ParseZone(r io.Reader, t chan Token) {
|
|||
if _DEBUG {
|
||||
fmt.Printf("[%v]\n", l)
|
||||
}
|
||||
// Lexer spotted an error already
|
||||
if l.err != "" {
|
||||
t <- Token{Error: &ParseError{l.err, l}}
|
||||
return
|
||||
|
||||
}
|
||||
switch st {
|
||||
case _EXPECT_OWNER:
|
||||
// Set the defaults here
|
||||
|
@ -154,7 +161,7 @@ func ParseZone(r io.Reader, t chan Token) {
|
|||
case _STRING: // TTL is this case
|
||||
ttl, ok := strconv.Atoi(l.token)
|
||||
if ok != nil {
|
||||
t <- Token{Error: &ParseError{"Not a TTL", l}}
|
||||
t <- Token{Error: &ParseError{"Ownername seen, not a TTL", l}}
|
||||
return
|
||||
} else {
|
||||
h.Ttl = uint32(ttl)
|
||||
|
@ -194,7 +201,7 @@ func ParseZone(r io.Reader, t chan Token) {
|
|||
case _STRING: // TTL
|
||||
ttl, ok := strconv.Atoi(l.token)
|
||||
if ok != nil {
|
||||
t <- Token{Error: &ParseError{"Not a TTL", l}}
|
||||
t <- Token{Error: &ParseError{"Class seen, not a TTL", l}}
|
||||
return
|
||||
} else {
|
||||
h.Ttl = uint32(ttl)
|
||||
|
@ -241,17 +248,17 @@ func ParseZone(r io.Reader, t chan Token) {
|
|||
func (l lex) String() string {
|
||||
switch l.value {
|
||||
case _STRING:
|
||||
return l.token
|
||||
return "S:" + l.token + "$"
|
||||
case _BLANK:
|
||||
return " " //"_" // seems to work, make then invisible for now
|
||||
return "_"
|
||||
case _NEWLINE:
|
||||
return "|\n"
|
||||
case _RRTYPE:
|
||||
return "R:" + l.token
|
||||
return "R:" + l.token + "$"
|
||||
case _OWNER:
|
||||
return "O:" + l.token
|
||||
return "O:" + l.token + "$"
|
||||
case _CLASS:
|
||||
return "C:" + l.token
|
||||
return "C:" + l.token + "$"
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
@ -291,7 +298,7 @@ func zlexer(s scanner.Scanner, c chan lex) {
|
|||
if !rrtype {
|
||||
if _, ok := Str_rr[strings.ToUpper(l.token)]; ok {
|
||||
l.value = _RRTYPE
|
||||
rrtype = true // We've seen one
|
||||
rrtype = true
|
||||
}
|
||||
if _, ok := Str_class[strings.ToUpper(l.token)]; ok {
|
||||
l.value = _CLASS
|
||||
|
@ -305,8 +312,8 @@ func zlexer(s scanner.Scanner, c chan lex) {
|
|||
l.token = " "
|
||||
c <- l
|
||||
}
|
||||
space = true
|
||||
owner = false
|
||||
space = true
|
||||
case ";":
|
||||
if quote {
|
||||
// Inside quoted text we allow ;
|
||||
|
@ -325,6 +332,12 @@ func zlexer(s scanner.Scanner, c chan lex) {
|
|||
if str != "" {
|
||||
l.value = _STRING
|
||||
l.token = str
|
||||
if !rrtype {
|
||||
if _, ok := Str_rr[strings.ToUpper(l.token)]; ok {
|
||||
l.value = _RRTYPE
|
||||
rrtype = true
|
||||
}
|
||||
}
|
||||
c <- l
|
||||
}
|
||||
if brace > 0 {
|
||||
|
@ -363,7 +376,9 @@ func zlexer(s scanner.Scanner, c chan lex) {
|
|||
}
|
||||
brace--
|
||||
if brace < 0 {
|
||||
fmt.Printf("%s\n", &ParseError{"Extra closing brace", l})
|
||||
l.err = "Extra closing brace"
|
||||
c <- l
|
||||
return
|
||||
}
|
||||
default:
|
||||
if commt {
|
||||
|
|
Loading…
Reference in New Issue