e0e362d700
SDK Tests / changes (push) Successful in 2m29s
Real E2E Tests / changes (push) Successful in 2m29s
Deploy Docs Pages / build (push) Has been cancelled
Deploy Docs Pages / deploy (push) Has been cancelled
Real E2E Tests / JavaScript E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / Python E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / Java E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / C# E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / Go E2E (docker bridge) (push) Has been cancelled
Real E2E Tests / Real E2E CI (push) Has been cancelled
SDK Tests / SDK CI (push) Has been cancelled
SDK Tests / CLI Tests (push) Has been cancelled
SDK Tests / Python SDK Quality (code-interpreter) (push) Has been cancelled
SDK Tests / Python SDK Quality (sandbox) (push) Has been cancelled
SDK Tests / Python SDK Tests (code-interpreter) (push) Has been cancelled
SDK Tests / JavaScript SDK Quality And Tests (code-interpreter) (push) Has been cancelled
SDK Tests / JavaScript SDK Quality And Tests (sandbox) (push) Has been cancelled
SDK Tests / Python SDK Tests (sandbox) (push) Has been cancelled
SDK Tests / CLI Quality (push) Has been cancelled
SDK Tests / Kotlin SDK Quality And Tests (sandbox) (push) Has been cancelled
SDK Tests / Kotlin SDK Quality And Tests (code-interpreter) (push) Has been cancelled
SDK Tests / C# SDK Quality And Tests (code-interpreter) (push) Has been cancelled
SDK Tests / C# SDK Quality And Tests (sandbox) (push) Has been cancelled
SDK Tests / Go SDK Quality And Tests (push) Has been cancelled
155 lines
4.7 KiB
Go
155 lines
4.7 KiB
Go
// Copyright 2026 Alibaba Group Holding Ltd.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package dnsproxy
|
|
|
|
import (
|
|
"net"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/miekg/dns"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/alibaba/opensandbox/egress/pkg/constants"
|
|
)
|
|
|
|
func TestUpstreamProbeIntervalFromEnv(t *testing.T) {
|
|
t.Setenv(constants.EnvDNSUpstreamProbeIntervalSec, "")
|
|
require.Equal(t, defaultUpstreamProbeInterval, upstreamProbeIntervalFromEnv())
|
|
|
|
t.Setenv(constants.EnvDNSUpstreamProbeIntervalSec, "5")
|
|
require.Equal(t, 5*time.Second, upstreamProbeIntervalFromEnv())
|
|
|
|
t.Setenv(constants.EnvDNSUpstreamProbeIntervalSec, "not-a-number")
|
|
require.Equal(t, defaultUpstreamProbeInterval, upstreamProbeIntervalFromEnv())
|
|
}
|
|
|
|
func TestUpstreamProbeFromEnv(t *testing.T) {
|
|
t.Setenv(constants.EnvDNSUpstreamProbe, "")
|
|
n, qt := upstreamProbeFromEnv()
|
|
require.Equal(t, ".", n)
|
|
require.Equal(t, dns.TypeNS, qt)
|
|
|
|
t.Setenv(constants.EnvDNSUpstreamProbe, ".")
|
|
n, qt = upstreamProbeFromEnv()
|
|
require.Equal(t, ".", n)
|
|
require.Equal(t, dns.TypeNS, qt)
|
|
|
|
t.Setenv(constants.EnvDNSUpstreamProbe, "intranet.corp")
|
|
n, qt = upstreamProbeFromEnv()
|
|
require.Equal(t, "intranet.corp.", n)
|
|
require.Equal(t, dns.TypeA, qt)
|
|
}
|
|
|
|
func TestNormalizeEnvUpstreamAddr(t *testing.T) {
|
|
got, err := normalizeEnvUpstreamAddr("8.8.8.8")
|
|
require.NoError(t, err)
|
|
require.Equal(t, "8.8.8.8:53", got)
|
|
|
|
got, err = normalizeEnvUpstreamAddr("1.1.1.1:5353")
|
|
require.NoError(t, err)
|
|
require.Equal(t, "1.1.1.1:5353", got)
|
|
|
|
got, err = normalizeEnvUpstreamAddr("2001:db8::1")
|
|
require.NoError(t, err)
|
|
require.Equal(t, "[2001:db8::1]:53", got)
|
|
|
|
got, err = normalizeEnvUpstreamAddr("[2001:db8::2]:853")
|
|
require.NoError(t, err)
|
|
require.Equal(t, "[2001:db8::2]:853", got)
|
|
|
|
got, err = normalizeEnvUpstreamAddr("[2001:db8::3]")
|
|
require.NoError(t, err)
|
|
require.Equal(t, "[2001:db8::3]:53", got)
|
|
|
|
_, err = normalizeEnvUpstreamAddr("")
|
|
require.Error(t, err)
|
|
|
|
_, err = normalizeEnvUpstreamAddr("dns.google")
|
|
require.Error(t, err)
|
|
|
|
_, err = normalizeEnvUpstreamAddr("dns.google:53")
|
|
require.Error(t, err)
|
|
}
|
|
|
|
func TestParseEnvDNSUpstreams(t *testing.T) {
|
|
got, err := parseEnvDNSUpstreams("8.8.8.8,1.1.1.1")
|
|
require.NoError(t, err)
|
|
require.Equal(t, []string{"8.8.8.8:53", "1.1.1.1:53"}, got)
|
|
|
|
got, err = parseEnvDNSUpstreams("8.8.8.8")
|
|
require.NoError(t, err)
|
|
require.Equal(t, []string{"8.8.8.8:53"}, got)
|
|
|
|
got, err = parseEnvDNSUpstreams("8.8.8.8, 8.8.8.8, 1.1.1.1")
|
|
require.NoError(t, err)
|
|
require.Equal(t, []string{"8.8.8.8:53", "1.1.1.1:53"}, got)
|
|
|
|
_, err = parseEnvDNSUpstreams("dns.google,8.8.8.8")
|
|
require.Error(t, err)
|
|
}
|
|
|
|
func TestAllowIPsFromUpstreamAddrs(t *testing.T) {
|
|
ips := AllowIPsFromUpstreamAddrs([]string{"8.8.8.8:53", "1.1.1.1:53", "resolver.example.com:53"})
|
|
require.Len(t, ips, 2)
|
|
require.Equal(t, "8.8.8.8", ips[0].String())
|
|
require.Equal(t, "1.1.1.1", ips[1].String())
|
|
}
|
|
|
|
func TestShouldFailoverAfterResponse(t *testing.T) {
|
|
p2 := &Proxy{upstreams: []string{"198.51.100.254:53", "8.8.8.8:53"}}
|
|
|
|
emptyOK := new(dns.Msg)
|
|
emptyOK.Rcode = dns.RcodeSuccess
|
|
try, _ := p2.shouldFailoverAfterResponse(emptyOK)
|
|
require.False(t, try, "empty NOERROR should not failover")
|
|
|
|
try, _ = p2.shouldFailoverAfterResponse(emptyOK)
|
|
require.False(t, try, "empty NOERROR on last upstream should not failover")
|
|
|
|
emptyNODATA := new(dns.Msg)
|
|
emptyNODATA.Rcode = dns.RcodeSuccess
|
|
emptyNODATA.Ns = []dns.RR{
|
|
&dns.SOA{
|
|
Hdr: dns.RR_Header{Name: "example.com.", Rrtype: dns.TypeSOA, Class: dns.ClassINET, Ttl: 60},
|
|
Ns: "ns1.example.com.",
|
|
Mbox: "hostmaster.example.com.",
|
|
Serial: 1,
|
|
Refresh: 60,
|
|
Retry: 60,
|
|
Expire: 60,
|
|
Minttl: 60,
|
|
},
|
|
}
|
|
try, _ = p2.shouldFailoverAfterResponse(emptyNODATA)
|
|
require.False(t, try, "A/AAAA NODATA with authority should not failover")
|
|
|
|
withA := new(dns.Msg)
|
|
withA.Rcode = dns.RcodeSuccess
|
|
withA.Answer = []dns.RR{&dns.A{Hdr: dns.RR_Header{Name: "x."}, A: net.ParseIP("1.1.1.1")}}
|
|
try, _ = p2.shouldFailoverAfterResponse(withA)
|
|
require.False(t, try)
|
|
|
|
nx := new(dns.Msg)
|
|
nx.Rcode = dns.RcodeNameError
|
|
try, _ = p2.shouldFailoverAfterResponse(nx)
|
|
require.False(t, try)
|
|
|
|
sf := new(dns.Msg)
|
|
sf.Rcode = dns.RcodeServerFailure
|
|
try, _ = p2.shouldFailoverAfterResponse(sf)
|
|
require.True(t, try)
|
|
}
|