195 lines
4.9 KiB
Go
195 lines
4.9 KiB
Go
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
package cli_test
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
cli "dns.froth.zone/awl/cmd"
|
|
"dns.froth.zone/awl/pkg/util"
|
|
"github.com/miekg/dns"
|
|
"gotest.tools/v3/assert"
|
|
)
|
|
|
|
func TestParseArgs(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
args := []string{
|
|
"go.dev",
|
|
"AAAA",
|
|
"@1.1.1.1",
|
|
"+ignore",
|
|
}
|
|
opts := new(util.Options)
|
|
opts.Logger = util.InitLogger(0)
|
|
err := cli.ParseMiscArgs(args, opts)
|
|
assert.NilError(t, err)
|
|
assert.Equal(t, opts.Request.Name, "go.dev.")
|
|
assert.Equal(t, opts.Request.Type, dns.StringToType["AAAA"])
|
|
assert.Equal(t, opts.Request.Server, "1.1.1.1")
|
|
assert.Equal(t, opts.Truncate, true)
|
|
}
|
|
|
|
func TestParseNoInput(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
args := []string{}
|
|
opts := new(util.Options)
|
|
opts.Logger = util.InitLogger(0)
|
|
err := cli.ParseMiscArgs(args, opts)
|
|
assert.NilError(t, err)
|
|
assert.Equal(t, opts.Request.Name, ".")
|
|
assert.Equal(t, opts.Request.Type, dns.StringToType["NS"])
|
|
}
|
|
|
|
func TestParseA(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
args := []string{
|
|
"golang.org.",
|
|
}
|
|
opts := new(util.Options)
|
|
opts.Logger = util.InitLogger(0)
|
|
err := cli.ParseMiscArgs(args, opts)
|
|
assert.NilError(t, err)
|
|
assert.Equal(t, opts.Request.Name, "golang.org.")
|
|
assert.Equal(t, opts.Request.Type, dns.StringToType["A"])
|
|
}
|
|
|
|
func TestParsePTR(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
args := []string{"8.8.8.8"}
|
|
opts := new(util.Options)
|
|
opts.Logger = util.InitLogger(0)
|
|
opts.Reverse = true
|
|
err := cli.ParseMiscArgs(args, opts)
|
|
assert.NilError(t, err)
|
|
assert.Equal(t, opts.Request.Type, dns.StringToType["PTR"])
|
|
}
|
|
|
|
func TestParseInvalidPTR(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
args := []string{"8.88.8"}
|
|
opts := new(util.Options)
|
|
opts.Logger = util.InitLogger(0)
|
|
opts.Reverse = true
|
|
err := cli.ParseMiscArgs(args, opts)
|
|
assert.ErrorContains(t, err, "unrecognized address")
|
|
}
|
|
|
|
func TestDefaultServer(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
tests := []struct {
|
|
in string
|
|
want string
|
|
}{
|
|
{"DNSCrypt", "sdns://AQMAAAAAAAAAETk0LjE0MC4xNC4xNDo1NDQzINErR_JS3PLCu_iZEIbq95zkSV2LFsigxDIuUso_OQhzIjIuZG5zY3J5cHQuZGVmYXVsdC5uczEuYWRndWFyZC5jb20"},
|
|
{"TLS", "dns.google"},
|
|
{"HTTPS", "https://dns.cloudflare.com"},
|
|
{"QUIC", "dns.froth.zone"},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
test := test
|
|
|
|
t.Run(test.in, func(t *testing.T) {
|
|
t.Parallel()
|
|
args := []string{}
|
|
opts := new(util.Options)
|
|
opts.Logger = util.InitLogger(0)
|
|
switch test.in {
|
|
case "DNSCrypt":
|
|
opts.DNSCrypt = true
|
|
case "TLS":
|
|
opts.TLS = true
|
|
case "HTTPS":
|
|
opts.HTTPS = true
|
|
case "QUIC":
|
|
opts.QUIC = true
|
|
}
|
|
err := cli.ParseMiscArgs(args, opts)
|
|
assert.NilError(t, err)
|
|
assert.Equal(t, opts.Request.Server, test.want)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestFlagSetting(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
tests := []struct {
|
|
in string
|
|
expected string
|
|
over string
|
|
}{
|
|
{"@sdns://AQMAAAAAAAAAETk0LjE0MC4xNC4xNDo1NDQzINErR_JS3PLCu_iZEIbq95zkSV2LFsigxDIuUso_OQhzIjIuZG5zY3J5cHQuZGVmYXVsdC5uczEuYWRndWFyZC5jb20", "sdns://AQMAAAAAAAAAETk0LjE0MC4xNC4xNDo1NDQzINErR_JS3PLCu_iZEIbq95zkSV2LFsigxDIuUso_OQhzIjIuZG5zY3J5cHQuZGVmYXVsdC5uczEuYWRndWFyZC5jb20", "DNSCrypt"},
|
|
{"@tls://dns.google", "dns.google", "TLS"},
|
|
{"@https://dns.cloudflare.com/dns-query", "https://dns.cloudflare.com/dns-query", "HTTPS"},
|
|
{"@https://dns.example.net/a", "https://dns.example.net/a", "HTTPS with a set path"},
|
|
{"@quic://dns.adguard.com", "dns.adguard.com", "QUIC"},
|
|
{"@tcp://dns.froth.zone", "dns.froth.zone", "TCP"},
|
|
{"@udp://dns.example.com", "dns.example.com", "UDP"},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
test := test
|
|
|
|
t.Run(test.over, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
opts := new(util.Options)
|
|
opts.Logger = util.InitLogger(0)
|
|
|
|
err := cli.ParseMiscArgs([]string{test.in}, opts)
|
|
assert.NilError(t, err)
|
|
switch {
|
|
case strings.HasPrefix(test.over, "DNSCrypt"):
|
|
assert.Assert(t, opts.DNSCrypt)
|
|
assert.Equal(t, opts.Request.Server, test.expected)
|
|
case strings.HasPrefix(test.over, "TLS"):
|
|
assert.Assert(t, opts.TLS)
|
|
assert.Equal(t, opts.Request.Server, test.expected)
|
|
case strings.HasPrefix(test.over, "HTTPS"):
|
|
assert.Assert(t, opts.HTTPS)
|
|
assert.Equal(t, opts.Request.Server, test.expected)
|
|
case strings.HasPrefix(test.over, "QUIC"):
|
|
assert.Assert(t, opts.QUIC)
|
|
assert.Equal(t, opts.Request.Server, test.expected)
|
|
case strings.HasPrefix(test.over, "TCP"):
|
|
assert.Assert(t, opts.TCP)
|
|
assert.Equal(t, opts.Request.Server, test.expected)
|
|
case strings.HasPrefix(test.over, "UDP"):
|
|
assert.Assert(t, true)
|
|
assert.Equal(t, opts.Request.Server, test.expected)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func FuzzParseArgs(f *testing.F) {
|
|
cases := []string{
|
|
"go.dev",
|
|
"AAAA",
|
|
"@1.1.1.1",
|
|
"+ignore",
|
|
"e",
|
|
}
|
|
|
|
for _, tc := range cases {
|
|
f.Add(tc)
|
|
}
|
|
|
|
f.Fuzz(func(t *testing.T, arg string) {
|
|
// Get rid of outputs
|
|
|
|
args := []string{arg}
|
|
opts := new(util.Options)
|
|
opts.Logger = util.InitLogger(0)
|
|
//nolint:errcheck,gosec // Only make sure the program does not crash
|
|
cli.ParseMiscArgs(args, opts)
|
|
})
|
|
}
|