aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--middleware/secondary/README.md21
-rw-r--r--test/readme_test.go99
2 files changed, 117 insertions, 3 deletions
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
+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
+ }
+}
~~~
-secondary example.org {
- 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
+}