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:
@ -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")),
|
||||||
|
@ -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"
|
||||||
|
@ -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.
|
||||||
|
@ -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)
|
||||||
|
Reference in New Issue
Block a user