1
0
mirror of https://github.com/StackExchange/dnscontrol.git synced 2024-05-11 05:55:12 +00:00

Letting you run only some tests. Way to document failures in individual providers and skip.

This commit is contained in:
Craig Peterson
2017-03-20 21:28:43 -06:00
parent 2e997d6a51
commit 2ac43a424b
4 changed files with 56 additions and 16 deletions

View File

@ -6,6 +6,9 @@ import (
"fmt" "fmt"
"strconv"
"strings"
"github.com/StackExchange/dnscontrol/models" "github.com/StackExchange/dnscontrol/models"
"github.com/StackExchange/dnscontrol/nameservers" "github.com/StackExchange/dnscontrol/nameservers"
"github.com/StackExchange/dnscontrol/providers" "github.com/StackExchange/dnscontrol/providers"
@ -15,20 +18,24 @@ import (
) )
var providerToRun = flag.String("provider", "", "Provider to run") var providerToRun = flag.String("provider", "", "Provider to run")
var startIdx = flag.Int("start", 0, "Test number to begin with")
var endIdx = flag.Int("end", 0, "Test index to stop after")
var verbose = flag.Bool("verbose", false, "Print corrections as you run them")
func init() { func init() {
flag.Parse() flag.Parse()
} }
func getProvider(t *testing.T) (providers.DNSServiceProvider, string) { func getProvider(t *testing.T) (providers.DNSServiceProvider, string, map[int]bool) {
if *providerToRun == "" { if *providerToRun == "" {
t.Log("No provider specified with -provider") t.Log("No provider specified with -provider")
return nil, "" return nil, "", nil
} }
jsons, err := config.LoadProviderConfigs("providers.json") jsons, err := config.LoadProviderConfigs("providers.json")
if err != nil { if err != nil {
t.Fatalf("Error loading provider configs: %s", err) t.Fatalf("Error loading provider configs: %s", err)
} }
fails := map[int]bool{}
for name, cfg := range jsons { for name, cfg := range jsons {
if *providerToRun != name { if *providerToRun != name {
continue continue
@ -37,19 +44,28 @@ func getProvider(t *testing.T) (providers.DNSServiceProvider, string) {
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
return provider, cfg["domain"] if f := cfg["knownFailures"]; f != "" {
for _, s := range strings.Split(f, ",") {
i, err := strconv.Atoi(s)
if err != nil {
t.Fatal(err)
}
fails[i] = true
}
}
return provider, cfg["domain"], fails
} }
t.Fatalf("Provider %s not found", *providerToRun) t.Fatalf("Provider %s not found", *providerToRun)
return nil, "" return nil, "", nil
} }
func TestDNSProviders(t *testing.T) { func TestDNSProviders(t *testing.T) {
provider, domain := getProvider(t) provider, domain, fails := getProvider(t)
if provider == nil { if provider == nil {
return return
} }
t.Run(fmt.Sprintf("%s", domain), func(t *testing.T) { t.Run(fmt.Sprintf("%s", domain), func(t *testing.T) {
runTests(t, provider, domain) runTests(t, provider, domain, fails)
}) })
} }
@ -68,14 +84,23 @@ func getDomainConfigWithNameservers(t *testing.T, prv providers.DNSServiceProvid
return dc return dc
} }
func runTests(t *testing.T, prv providers.DNSServiceProvider, domainName string) { func runTests(t *testing.T, prv providers.DNSServiceProvider, domainName string, knownFailures map[int]bool) {
dc := getDomainConfigWithNameservers(t, prv, domainName) dc := getDomainConfigWithNameservers(t, prv, domainName)
// run tests one at a time // run tests one at a time
for i, tst := range tests { end := *endIdx
if end == 0 || end >= len(tests) {
end = len(tests) - 1
}
for i := *startIdx; i <= end; i++ {
tst := tests[i]
if t.Failed() { if t.Failed() {
break break
} }
t.Run(fmt.Sprintf("%d: %s", i, tst.Desc), func(t *testing.T) { t.Run(fmt.Sprintf("%d: %s", i, tst.Desc), func(t *testing.T) {
if knownFailures[i] {
t.Log("SKIPPING KNOWN FAILURE CASE")
return
}
dom, _ := dc.Copy() dom, _ := dc.Copy()
for _, r := range tst.Records { for _, r := range tst.Records {
rc := models.RecordConfig(*r) rc := models.RecordConfig(*r)
@ -88,10 +113,13 @@ func runTests(t *testing.T, prv providers.DNSServiceProvider, domainName string)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
if i != 0 && len(corrections) == 0 { if i != *startIdx && len(corrections) == 0 {
t.Fatalf("Expect changes for all tests, but got none") t.Fatalf("Expect changes for all tests, but got none")
} }
for _, c := range corrections { for _, c := range corrections {
if *verbose {
t.Log(c.Msg)
}
err = c.F() err = c.F()
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
@ -112,7 +140,7 @@ func runTests(t *testing.T, prv providers.DNSServiceProvider, domainName string)
} }
func TestDualProviders(t *testing.T) { func TestDualProviders(t *testing.T) {
p, domain := getProvider(t) p, domain, _ := getProvider(t)
if p == nil { if p == nil {
return return
} }
@ -164,6 +192,10 @@ func cname(name, target string) *rec {
return makeRec(name, target, "CNAME") return makeRec(name, target, "CNAME")
} }
func ns(name, target string) *rec {
return makeRec(name, target, "NS")
}
func makeRec(name, target, typ string) *rec { func makeRec(name, target, typ string) *rec {
return &rec{ return &rec{
Name: name, Name: name,
@ -185,6 +217,7 @@ func tc(desc string, recs ...*rec) *TestCase {
} }
} }
//ALWAYS ADD TO BOTTOM OF LIST. Order and indexes matter.
var tests = []*TestCase{ var tests = []*TestCase{
// A // A
tc("Empty"), tc("Empty"),
@ -198,6 +231,7 @@ var tests = []*TestCase{
tc("Delete one", a("@", "1.2.3.4").ttl(500), a("www", "5.6.7.8").ttl(400)), tc("Delete one", a("@", "1.2.3.4").ttl(500), a("www", "5.6.7.8").ttl(400)),
tc("Add back and change ttl", a("www", "5.6.7.8").ttl(700), a("www", "1.2.3.4").ttl(700)), tc("Add back and change ttl", a("www", "5.6.7.8").ttl(700), a("www", "1.2.3.4").ttl(700)),
tc("Change targets and ttls", a("www", "1.1.1.1"), a("www", "2.2.2.2")), tc("Change targets and ttls", a("www", "1.1.1.1"), a("www", "2.2.2.2")),
// CNAMES // CNAMES
tc("Empty"), tc("Empty"),
tc("Create a CNAME", cname("foo", "google.com.")), tc("Create a CNAME", cname("foo", "google.com.")),
@ -205,6 +239,10 @@ var tests = []*TestCase{
tc("Change to A record", a("foo", "1.2.3.4")), tc("Change to A record", a("foo", "1.2.3.4")),
tc("Change back to CNAME", cname("foo", "google.com.")), tc("Change back to CNAME", cname("foo", "google.com.")),
//NS
tc("NS for subdomain", ns("xyz", "ns2.foo.com.")),
tc("Dual NS for subdomain", ns("xyz", "ns2.foo.com."), ns("xyz", "ns1.foo.com.")),
//IDNAs //IDNAs
tc("Internationalized name", a("ööö", "1.2.3.4")), tc("Internationalized name", a("ööö", "1.2.3.4")),
tc("Change IDN", a("ööö", "2.2.2.2")), tc("Change IDN", a("ööö", "2.2.2.2")),

View File

@ -3,9 +3,10 @@
"domain": "$GCLOUD_DOMAIN", "domain": "$GCLOUD_DOMAIN",
"project_id": "$GCLOUD_PROJECT", "project_id": "$GCLOUD_PROJECT",
"private_key": "$GCLOUD_PRIVATEKEY", "private_key": "$GCLOUD_PRIVATEKEY",
"client_email": "$GCLOUD_EMAIL", "client_email": "$GCLOUD_EMAIL"
}, },
"DNSIMPLE":{ "DNSIMPLE":{
"knownFailures": "16,17",
"domain": "$DNSIMPLE_DOMAIN", "domain": "$DNSIMPLE_DOMAIN",
"token": "$DNSIMPLE_TOKEN", "token": "$DNSIMPLE_TOKEN",
"baseurl": "https://api.sandbox.dnsimple.com" "baseurl": "https://api.sandbox.dnsimple.com"

View File

@ -1,4 +1,3 @@
$TTL 300 $TTL 300
@ IN SOA DEFAULT_NOT_SET. DEFAULT_NOT_SET. 2017032059 3600 600 604800 1440 @ IN SOA DEFAULT_NOT_SET. DEFAULT_NOT_SET. 2017032173 3600 600 604800 1440
IN NS foo.com.
xn--o-0gab IN CNAME xn--ndaaa.xn--ndaaa. xn--o-0gab IN CNAME xn--ndaaa.xn--ndaaa.

View File

@ -323,10 +323,12 @@ func init() {
func removeOtherNS(dc *models.DomainConfig) { func removeOtherNS(dc *models.DomainConfig) {
newList := make([]*models.RecordConfig, 0, len(dc.Records)) newList := make([]*models.RecordConfig, 0, len(dc.Records))
for _, rec := range dc.Records { for _, rec := range dc.Records {
if rec.Type == "NS" && rec.NameFQDN == dc.Name { if rec.Type == "NS" {
if !strings.HasSuffix(rec.Target, ".dnsimple.com.") { // apex NS inside dnsimple are expected.
fmt.Printf("Warning: dnsimple.com does not allow NS records on base domain to be modified. %s will not be added.", rec.Target) if rec.NameFQDN == dc.Name && strings.HasSuffix(rec.Target, ".dnsimple.com.") {
continue
} }
fmt.Printf("Warning: dnsimple.com does not allow NS records to be modified. %s will not be added.\n", rec.Target)
continue continue
} }
newList = append(newList, rec) newList = append(newList, rec)