diff --git a/middleware/secondary/README.md b/middleware/secondary/README.md index 7d5338c95..d6cbe465a 100644 --- a/middleware/secondary/README.md +++ b/middleware/secondary/README.md @@ -31,9 +31,24 @@ secondary [zones...] { ## Examples -~~~ -secondary example.org { - transfer from 10.0.1.1 - transfer from 10.1.2.1 +Transfer `example.org` from 10.0.1.1, and if that fails try 10.1.2.1. + +~~~ corefile +example.org { + secondary { + transfer from 10.0.1.1 + transfer from 10.1.2.1 + } +} +~~~ + +Or re-export the retrieved zone to other secondaries. + +~~~ corefile +. { + secondary example.net { + transfer from 10.1.2.1 + transfer to * + } } ~~~ diff --git a/test/readme_test.go b/test/readme_test.go new file mode 100644 index 000000000..f231ebc5a --- /dev/null +++ b/test/readme_test.go @@ -0,0 +1,99 @@ +package test + +import ( + "bufio" + "io/ioutil" + "log" + "os" + "path/filepath" + "testing" + + "github.com/coredns/coredns/core/dnsserver" + + "github.com/mholt/caddy" +) + +// Pasrse all README.md's of the middleware and check if every example Corefile +// actually works. Each corefile is only used if: +// +// ~~~ corefile +// . { +// # check-this-please +// } +// ~~~ + +func TestReadme(t *testing.T) { + caddy.Quiet = true + dnsserver.Quiet = true + dnsserver.Port = "10053" + log.SetOutput(ioutil.Discard) + + middle := filepath.Join("..", "middleware") + dirs, err := ioutil.ReadDir(middle) + if err != nil { + t.Fatalf("Could not read %s: %q", middle, err) + } + for _, d := range dirs { + if !d.IsDir() { + continue + } + readme := filepath.Join(middle, d.Name()) + readme = filepath.Join(readme, "README.md") + + inputs, err := corefileFromReadme(readme) + if err != nil { + continue + } + + // Test each snippet. + for _, in := range inputs { + t.Logf("Testing %s, with %d byte snippet", readme, len(in.Body())) + server, err := caddy.Start(in) + if err != nil { + t.Errorf("Failed to start server for input %q:\n%s", err, in.Body()) + } + server.Stop() + } + } +} + +// corefileFromReadme parses a readme and returns all fragments that +// have ~~~ corefile (or ``` corefile). +func corefileFromReadme(readme string) ([]*Input, error) { + f, err := os.Open(readme) + if err != nil { + return nil, err + } + defer f.Close() + + s := bufio.NewScanner(f) + input := []*Input{} + corefile := false + temp := "" + + for s.Scan() { + line := s.Text() + if line == "~~~ corefile" || line == "``` corefile" { + corefile = true + continue + } + + if corefile && (line == "~~~" || line == "```") { + // last line + input = append(input, NewInput(temp)) + + temp = "" + corefile = false + continue + } + + if corefile { + temp += line + "\n" // readd newline stripped by s.Text() + } + } + + if err := s.Err(); err != nil { + return nil, err + } + return input, nil +}