83 lines
2.3 KiB
Go
83 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestCapabilities(t *testing.T) {
|
|
var stdout bytes.Buffer
|
|
var stderr bytes.Buffer
|
|
|
|
code := run([]string{"capabilities"}, &stdout, &stderr)
|
|
if code != 0 {
|
|
t.Fatalf("run capabilities returned %d; stderr=%q", code, stderr.String())
|
|
}
|
|
|
|
var result capabilitiesResult
|
|
if err := json.Unmarshal(stdout.Bytes(), &result); err != nil {
|
|
t.Fatalf("decode capabilities: %v", err)
|
|
}
|
|
if result.SchemaVersion != 1 {
|
|
t.Fatalf("schema version = %d, want 1", result.SchemaVersion)
|
|
}
|
|
if result.Command != "capabilities" {
|
|
t.Fatalf("command = %q, want capabilities", result.Command)
|
|
}
|
|
if len(result.Capabilities) == 0 {
|
|
t.Fatal("capabilities list is empty")
|
|
}
|
|
available := map[string]bool{}
|
|
for _, item := range result.Capabilities {
|
|
available[item.Protocol] = item.Status == "available"
|
|
}
|
|
if !available["doh"] || !available["dot"] {
|
|
t.Fatalf("DoH and DoT must be available: %#v", available)
|
|
}
|
|
if available["doq"] || available["doh3"] || available["dnscrypt"] {
|
|
t.Fatalf("planned transports must not be available: %#v", available)
|
|
}
|
|
}
|
|
|
|
func TestReservedCommandIsNotImplemented(t *testing.T) {
|
|
var stdout bytes.Buffer
|
|
var stderr bytes.Buffer
|
|
|
|
code := run([]string{"probe"}, &stdout, &stderr)
|
|
if code != 4 {
|
|
t.Fatalf("run probe returned %d, want 4", code)
|
|
}
|
|
if !strings.Contains(stderr.String(), "not implemented") {
|
|
t.Fatalf("stderr = %q, want not implemented message", stderr.String())
|
|
}
|
|
}
|
|
|
|
func TestParseQueryArgsAllowsInterspersedOptions(t *testing.T) {
|
|
options, timeout, err := parseQueryArgs([]string{"example.com", "MX", "--protocol", "dot", "--provider=quad9", "--timeout", "3s"})
|
|
if err != nil {
|
|
t.Fatalf("parse query args: %v", err)
|
|
}
|
|
if options.Name != "example.com" || options.RecordType != "MX" || options.Protocol != "dot" || options.Provider != "quad9" {
|
|
t.Fatalf("unexpected options: %#v", options)
|
|
}
|
|
if timeout != 3*time.Second {
|
|
t.Fatalf("timeout = %v, want 3s", timeout)
|
|
}
|
|
}
|
|
|
|
func TestUnknownCommand(t *testing.T) {
|
|
var stdout bytes.Buffer
|
|
var stderr bytes.Buffer
|
|
|
|
code := run([]string{"unknown"}, &stdout, &stderr)
|
|
if code != 2 {
|
|
t.Fatalf("run unknown returned %d, want 2", code)
|
|
}
|
|
if !strings.Contains(stderr.String(), "unknown command") {
|
|
t.Fatalf("stderr = %q, want unknown command message", stderr.String())
|
|
}
|
|
}
|