diff options
Diffstat (limited to 'plugin/reverse/setup_test.go')
-rw-r--r-- | plugin/reverse/setup_test.go | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/plugin/reverse/setup_test.go b/plugin/reverse/setup_test.go new file mode 100644 index 000000000..5b4c04e82 --- /dev/null +++ b/plugin/reverse/setup_test.go @@ -0,0 +1,195 @@ +package reverse + +import ( + "net" + "reflect" + "regexp" + "testing" + + "github.com/mholt/caddy" +) + +func TestSetupParse(t *testing.T) { + + _, net4, _ := net.ParseCIDR("10.1.1.0/24") + _, net6, _ := net.ParseCIDR("fd01::/64") + + regexIP4wildcard, _ := regexp.Compile("^.*ip-" + regexMatchV4 + "\\.domain\\.com\\.$") + regexIP6, _ := regexp.Compile("^ip-" + regexMatchV6 + "\\.domain\\.com\\.$") + regexIpv4dynamic, _ := regexp.Compile("^dynamic-" + regexMatchV4 + "-intern\\.dynamic\\.domain\\.com\\.$") + regexIpv6dynamic, _ := regexp.Compile("^dynamic-" + regexMatchV6 + "-intern\\.dynamic\\.domain\\.com\\.$") + regexIpv4vpndynamic, _ := regexp.Compile("^dynamic-" + regexMatchV4 + "-vpn\\.dynamic\\.domain\\.com\\.$") + + serverBlockKeys := []string{"domain.com.:8053", "dynamic.domain.com.:8053"} + + tests := []struct { + inputFileRules string + shouldErr bool + networks networks + }{ + { + // with defaults + `reverse fd01::/64`, + false, + networks{network{ + IPnet: net6, + Template: "ip-{ip}.domain.com.", + Zone: "domain.com.", + TTL: 60, + RegexMatchIP: regexIP6, + }}, + }, + { + `reverse`, + true, + networks{}, + }, + { + //no cidr + `reverse 10.1.1.1`, + true, + networks{}, + }, + { + //no cidr + `reverse 10.1.1.0/16 fd00::`, + true, + networks{}, + }, + { + // invalid key + `reverse 10.1.1.0/24 { + notavailable + }`, + true, + networks{}, + }, + { + // no domain suffix + `reverse 10.1.1.0/24 { + hostname ip-{ip}. + }`, + true, + networks{}, + }, + { + // hostname requires an second arg + `reverse 10.1.1.0/24 { + hostname + }`, + true, + networks{}, + }, + { + // template breaks regex compile + `reverse 10.1.1.0/24 { + hostname ip-{[-x + }`, + true, + networks{}, + }, + { + // ttl requires an (u)int + `reverse 10.1.1.0/24 { + ttl string + }`, + true, + networks{}, + }, + { + `reverse fd01::/64 { + hostname dynamic-{ip}-intern.{zone[2]} + ttl 50 + } + reverse 10.1.1.0/24 { + hostname dynamic-{ip}-vpn.{zone[2]} + fallthrough + }`, + false, + networks{network{ + IPnet: net6, + Template: "dynamic-{ip}-intern.dynamic.domain.com.", + Zone: "dynamic.domain.com.", + TTL: 50, + RegexMatchIP: regexIpv6dynamic, + }, network{ + IPnet: net4, + Template: "dynamic-{ip}-vpn.dynamic.domain.com.", + Zone: "dynamic.domain.com.", + TTL: 60, + RegexMatchIP: regexIpv4vpndynamic, + }}, + }, + { + // multiple networks in one stanza + `reverse fd01::/64 10.1.1.0/24 { + hostname dynamic-{ip}-intern.{zone[2]} + ttl 50 + fallthrough + }`, + false, + networks{network{ + IPnet: net6, + Template: "dynamic-{ip}-intern.dynamic.domain.com.", + Zone: "dynamic.domain.com.", + TTL: 50, + RegexMatchIP: regexIpv6dynamic, + }, network{ + IPnet: net4, + Template: "dynamic-{ip}-intern.dynamic.domain.com.", + Zone: "dynamic.domain.com.", + TTL: 50, + RegexMatchIP: regexIpv4dynamic, + }}, + }, + { + // fix domain in template + `reverse fd01::/64 { + hostname dynamic-{ip}-intern.dynamic.domain.com + ttl 300 + fallthrough + }`, + false, + networks{network{ + IPnet: net6, + Template: "dynamic-{ip}-intern.dynamic.domain.com.", + Zone: "dynamic.domain.com.", + TTL: 300, + RegexMatchIP: regexIpv6dynamic, + }}, + }, + { + `reverse 10.1.1.0/24 { + hostname ip-{ip}.{zone[1]} + ttl 50 + wildcard + fallthrough + }`, + false, + networks{network{ + IPnet: net4, + Template: "ip-{ip}.domain.com.", + Zone: "domain.com.", + TTL: 50, + RegexMatchIP: regexIP4wildcard, + }}, + }, + } + for i, test := range tests { + c := caddy.NewTestController("dns", test.inputFileRules) + c.ServerBlockKeys = serverBlockKeys + networks, _, err := reverseParse(c) + + if err == nil && test.shouldErr { + t.Fatalf("Test %d expected errors, but got no error", i) + } else if err != nil && !test.shouldErr { + t.Fatalf("Test %d expected no errors, but got '%v'", i, err) + } + for j, n := range networks { + reflect.DeepEqual(test.networks[j], n) + if !reflect.DeepEqual(test.networks[j], n) { + t.Fatalf("Test %d/%d expected %v, got %v", i, j, test.networks[j], n) + } + } + } +} |