mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2025-09-11 23:54:28 +08:00
133 lines
3.7 KiB
Go
133 lines
3.7 KiB
Go
package main
|
|
|
|
// Functions for all tests in this directory.
|
|
|
|
import (
|
|
"encoding/json"
|
|
"flag"
|
|
"fmt"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/StackExchange/dnscontrol/v4/pkg/credsfile"
|
|
"github.com/StackExchange/dnscontrol/v4/providers"
|
|
"github.com/StackExchange/dnscontrol/v4/providers/cloudflare"
|
|
)
|
|
|
|
var (
|
|
providerFlag = flag.String("provider", "", "Provider to run (if empty, deduced from -profile)")
|
|
profileFlag = flag.String("profile", "", "Entry in profiles.json to use (if empty, copied from -provider)")
|
|
enableCFWorkers = flag.Bool("cfworkers", true, "Set false to disable CF worker tests")
|
|
enableCFRedirectMode = flag.String("cfredirect", "", "cloudflare pagerule tests: default=page_rules, c=convert old to enw, n=new-style, o=none")
|
|
)
|
|
|
|
func init() {
|
|
testing.Init()
|
|
|
|
flag.Parse()
|
|
}
|
|
|
|
// ---
|
|
|
|
func panicOnErr(err error) {
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
func getProvider(t *testing.T) (providers.DNSServiceProvider, string, map[string]string) {
|
|
if *providerFlag == "" && *profileFlag == "" {
|
|
t.Log("No -provider or -profile specified")
|
|
return nil, "", nil
|
|
}
|
|
|
|
// Load the profile values
|
|
|
|
jsons, err := credsfile.LoadProviderConfigs("profiles.json")
|
|
if err != nil {
|
|
t.Fatalf("Error loading provider configs: %s", err)
|
|
}
|
|
|
|
// Which profile are we using? Use the profile but default to the provider.
|
|
targetProfile := *profileFlag
|
|
if targetProfile == "" {
|
|
targetProfile = *providerFlag
|
|
}
|
|
|
|
var profileName, profileType string
|
|
var cfg map[string]string
|
|
|
|
// Find the profile we want to use.
|
|
for p, c := range jsons {
|
|
if p == targetProfile {
|
|
cfg = c
|
|
profileName = p
|
|
profileType = cfg["TYPE"]
|
|
if profileType == "" {
|
|
t.Fatalf("profiles.json profile %q does not have a TYPE field", *profileFlag)
|
|
}
|
|
break
|
|
}
|
|
}
|
|
if profileName == "" {
|
|
t.Fatalf("Profile not found: -profile=%q -provider=%q", *profileFlag, *providerFlag)
|
|
return nil, "", nil
|
|
}
|
|
|
|
// Fill in -profile if blank.
|
|
if *profileFlag == "" {
|
|
*profileFlag = profileName
|
|
}
|
|
// Fill in -provider if blank.
|
|
if *providerFlag == "" {
|
|
*providerFlag = profileType
|
|
}
|
|
|
|
// Sanity check. If the user-specifed -provider flag doesn't match what was in the file, warn them.
|
|
if *providerFlag != profileType {
|
|
fmt.Printf("WARNING: -provider=%q does not match profile TYPE=%q. Using profile TYPE.\n", *providerFlag, profileType)
|
|
*providerFlag = profileType
|
|
}
|
|
|
|
// fmt.Printf("DEBUG flag=%q Profile=%q TYPE=%q\n", *providerFlag, profileName, profileType)
|
|
fmt.Printf("Testing Profile=%q (TYPE=%q)\n", profileName, profileType)
|
|
|
|
var metadata json.RawMessage
|
|
|
|
// CLOUDFLAREAPI tests related to CLOUDFLAREAPI_SINGLE_REDIRECT/CF_REDIRECT/CF_TEMP_REDIRECT
|
|
// requires metadata to enable this feature.
|
|
// In hindsight, I have no idea why this metadata flag is required to
|
|
// use this feature. Maybe because we didn't have the capabilities
|
|
// feature at the time?
|
|
if profileType == "CLOUDFLAREAPI" {
|
|
items := []string{}
|
|
if *enableCFWorkers {
|
|
items = append(items, `"manage_workers": true`)
|
|
}
|
|
switch *enableCFRedirectMode {
|
|
case "":
|
|
items = append(items, `"manage_redirects": true`)
|
|
case "c":
|
|
items = append(items, `"manage_redirects": true`)
|
|
items = append(items, `"manage_single_redirects": true`)
|
|
case "n":
|
|
items = append(items, `"manage_single_redirects": true`)
|
|
case "o":
|
|
}
|
|
metadata = []byte(`{ ` + strings.Join(items, `, `) + ` }`)
|
|
}
|
|
|
|
provider, err := providers.CreateDNSProvider(profileType, cfg, metadata)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if profileType == "CLOUDFLAREAPI" && *enableCFWorkers {
|
|
// Cloudflare only. Will do nothing if provider != *cloudflareProvider.
|
|
if err := cloudflare.PrepareCloudflareTestWorkers(provider); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
return provider, cfg["domain"], cfg
|
|
}
|