2021-02-08 05:18:52 -05:00
|
|
|
package fakedns
|
|
|
|
|
|
|
|
import (
|
2021-04-09 18:15:20 -04:00
|
|
|
gonet "net"
|
2021-04-30 23:15:39 -04:00
|
|
|
"testing"
|
2021-04-09 18:15:20 -04:00
|
|
|
|
2021-02-08 05:18:52 -05:00
|
|
|
"github.com/stretchr/testify/assert"
|
2021-02-16 15:31:50 -05:00
|
|
|
|
|
|
|
"github.com/v2fly/v2ray-core/v4/common"
|
|
|
|
"github.com/v2fly/v2ray-core/v4/common/net"
|
|
|
|
"github.com/v2fly/v2ray-core/v4/common/uuid"
|
2021-02-08 05:18:52 -05:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestNewFakeDnsHolder(_ *testing.T) {
|
|
|
|
_, err := NewFakeDNSHolder()
|
|
|
|
common.Must(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestFakeDnsHolderCreateMapping(t *testing.T) {
|
|
|
|
fkdns, err := NewFakeDNSHolder()
|
|
|
|
common.Must(err)
|
|
|
|
|
|
|
|
addr := fkdns.GetFakeIPForDomain("fakednstest.v2fly.org")
|
2021-03-15 04:47:10 -04:00
|
|
|
assert.Equal(t, "198.18.0.0", addr[0].IP().String())
|
2021-02-08 05:18:52 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestFakeDnsHolderCreateMappingMany(t *testing.T) {
|
|
|
|
fkdns, err := NewFakeDNSHolder()
|
|
|
|
common.Must(err)
|
|
|
|
|
|
|
|
addr := fkdns.GetFakeIPForDomain("fakednstest.v2fly.org")
|
2021-03-15 04:47:10 -04:00
|
|
|
assert.Equal(t, "198.18.0.0", addr[0].IP().String())
|
2021-02-08 05:18:52 -05:00
|
|
|
|
|
|
|
addr2 := fkdns.GetFakeIPForDomain("fakednstest2.v2fly.org")
|
2021-03-15 04:47:10 -04:00
|
|
|
assert.Equal(t, "198.18.0.1", addr2[0].IP().String())
|
2021-02-08 05:18:52 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestFakeDnsHolderCreateMappingManyAndResolve(t *testing.T) {
|
|
|
|
fkdns, err := NewFakeDNSHolder()
|
|
|
|
common.Must(err)
|
|
|
|
|
|
|
|
{
|
|
|
|
addr := fkdns.GetFakeIPForDomain("fakednstest.v2fly.org")
|
2021-03-15 04:47:10 -04:00
|
|
|
assert.Equal(t, "198.18.0.0", addr[0].IP().String())
|
2021-02-08 05:18:52 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
addr2 := fkdns.GetFakeIPForDomain("fakednstest2.v2fly.org")
|
2021-03-15 04:47:10 -04:00
|
|
|
assert.Equal(t, "198.18.0.1", addr2[0].IP().String())
|
2021-02-08 05:18:52 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
{
|
2021-03-15 04:47:10 -04:00
|
|
|
result := fkdns.GetDomainFromFakeDNS(net.ParseAddress("198.18.0.0"))
|
2021-02-08 05:18:52 -05:00
|
|
|
assert.Equal(t, "fakednstest.v2fly.org", result)
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
2021-03-15 04:47:10 -04:00
|
|
|
result := fkdns.GetDomainFromFakeDNS(net.ParseAddress("198.18.0.1"))
|
2021-02-08 05:18:52 -05:00
|
|
|
assert.Equal(t, "fakednstest2.v2fly.org", result)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestFakeDnsHolderCreateMappingManySingleDomain(t *testing.T) {
|
|
|
|
fkdns, err := NewFakeDNSHolder()
|
|
|
|
common.Must(err)
|
|
|
|
|
|
|
|
addr := fkdns.GetFakeIPForDomain("fakednstest.v2fly.org")
|
2021-03-15 04:47:10 -04:00
|
|
|
assert.Equal(t, "198.18.0.0", addr[0].IP().String())
|
2021-02-08 05:18:52 -05:00
|
|
|
|
|
|
|
addr2 := fkdns.GetFakeIPForDomain("fakednstest.v2fly.org")
|
2021-03-15 04:47:10 -04:00
|
|
|
assert.Equal(t, "198.18.0.0", addr2[0].IP().String())
|
2021-02-08 05:18:52 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestFakeDnsHolderCreateMappingAndRollOver(t *testing.T) {
|
|
|
|
fkdns, err := NewFakeDNSHolderConfigOnly(&FakeDnsPool{
|
|
|
|
IpPool: "240.0.0.0/12",
|
|
|
|
LruSize: 256,
|
|
|
|
})
|
|
|
|
common.Must(err)
|
|
|
|
|
|
|
|
err = fkdns.Start()
|
|
|
|
|
|
|
|
common.Must(err)
|
|
|
|
|
|
|
|
{
|
|
|
|
addr := fkdns.GetFakeIPForDomain("fakednstest.v2fly.org")
|
|
|
|
assert.Equal(t, "240.0.0.0", addr[0].IP().String())
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
addr2 := fkdns.GetFakeIPForDomain("fakednstest2.v2fly.org")
|
|
|
|
assert.Equal(t, "240.0.0.1", addr2[0].IP().String())
|
|
|
|
}
|
|
|
|
|
|
|
|
for i := 0; i <= 8192; i++ {
|
|
|
|
{
|
|
|
|
result := fkdns.GetDomainFromFakeDNS(net.ParseAddress("240.0.0.0"))
|
|
|
|
assert.Equal(t, "fakednstest.v2fly.org", result)
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
result := fkdns.GetDomainFromFakeDNS(net.ParseAddress("240.0.0.1"))
|
|
|
|
assert.Equal(t, "fakednstest2.v2fly.org", result)
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
uuid := uuid.New()
|
|
|
|
domain := uuid.String() + ".fakednstest.v2fly.org"
|
|
|
|
addr := fkdns.GetFakeIPForDomain(domain)
|
|
|
|
rsaddr := addr[0].IP().String()
|
|
|
|
|
|
|
|
result := fkdns.GetDomainFromFakeDNS(net.ParseAddress(rsaddr))
|
|
|
|
assert.Equal(t, domain, result)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-04-09 18:15:20 -04:00
|
|
|
|
|
|
|
func TestFakeDNSMulti(t *testing.T) {
|
|
|
|
fakeMulti, err := NewFakeDNSHolderMulti(&FakeDnsPoolMulti{
|
2021-04-13 10:39:10 -04:00
|
|
|
Pools: []*FakeDnsPool{{
|
2021-04-09 18:15:20 -04:00
|
|
|
IpPool: "240.0.0.0/12",
|
|
|
|
LruSize: 256,
|
2021-04-13 10:39:10 -04:00
|
|
|
}, {
|
2021-04-09 18:15:20 -04:00
|
|
|
IpPool: "fddd:c5b4:ff5f:f4f0::/64",
|
|
|
|
LruSize: 256,
|
|
|
|
}},
|
|
|
|
},
|
|
|
|
)
|
2021-04-13 11:06:48 -04:00
|
|
|
common.Must(err)
|
2021-04-09 18:15:20 -04:00
|
|
|
|
|
|
|
err = fakeMulti.Start()
|
|
|
|
|
|
|
|
common.Must(err)
|
|
|
|
|
|
|
|
assert.Nil(t, err, "Should not throw error")
|
|
|
|
_ = fakeMulti
|
|
|
|
|
|
|
|
t.Run("checkInRange", func(t *testing.T) {
|
|
|
|
t.Run("ipv4", func(t *testing.T) {
|
|
|
|
inPool := fakeMulti.IsIPInIPPool(net.IPAddress([]byte{240, 0, 0, 5}))
|
|
|
|
assert.True(t, inPool)
|
|
|
|
})
|
|
|
|
t.Run("ipv6", func(t *testing.T) {
|
|
|
|
ip, err := gonet.ResolveIPAddr("ip", "fddd:c5b4:ff5f:f4f0::5")
|
|
|
|
assert.Nil(t, err)
|
|
|
|
inPool := fakeMulti.IsIPInIPPool(net.IPAddress(ip.IP))
|
|
|
|
assert.True(t, inPool)
|
|
|
|
})
|
|
|
|
t.Run("ipv4_inverse", func(t *testing.T) {
|
|
|
|
inPool := fakeMulti.IsIPInIPPool(net.IPAddress([]byte{241, 0, 0, 5}))
|
|
|
|
assert.False(t, inPool)
|
|
|
|
})
|
|
|
|
t.Run("ipv6_inverse", func(t *testing.T) {
|
|
|
|
ip, err := gonet.ResolveIPAddr("ip", "fcdd:c5b4:ff5f:f4f0::5")
|
|
|
|
assert.Nil(t, err)
|
|
|
|
inPool := fakeMulti.IsIPInIPPool(net.IPAddress(ip.IP))
|
|
|
|
assert.False(t, inPool)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("allocateTwoAddressForTwoPool", func(t *testing.T) {
|
|
|
|
address := fakeMulti.GetFakeIPForDomain("fakednstest.v2fly.org")
|
|
|
|
assert.Len(t, address, 2, "should be 2 address one for each pool")
|
|
|
|
t.Run("eachOfThemShouldResolve:0", func(t *testing.T) {
|
|
|
|
domain := fakeMulti.GetDomainFromFakeDNS(address[0])
|
|
|
|
assert.Equal(t, "fakednstest.v2fly.org", domain)
|
|
|
|
})
|
|
|
|
t.Run("eachOfThemShouldResolve:1", func(t *testing.T) {
|
|
|
|
domain := fakeMulti.GetDomainFromFakeDNS(address[1])
|
|
|
|
assert.Equal(t, "fakednstest.v2fly.org", domain)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("understandIPTypeSelector", func(t *testing.T) {
|
|
|
|
t.Run("ipv4", func(t *testing.T) {
|
|
|
|
address := fakeMulti.GetFakeIPForDomain3("fakednstestipv4.v2fly.org", true, false)
|
|
|
|
assert.Len(t, address, 1, "should be 1 address")
|
|
|
|
assert.True(t, address[0].Family().IsIPv4())
|
|
|
|
})
|
|
|
|
t.Run("ipv6", func(t *testing.T) {
|
|
|
|
address := fakeMulti.GetFakeIPForDomain3("fakednstestipv6.v2fly.org", false, true)
|
|
|
|
assert.Len(t, address, 1, "should be 1 address")
|
|
|
|
assert.True(t, address[0].Family().IsIPv6())
|
|
|
|
})
|
|
|
|
t.Run("ipv46", func(t *testing.T) {
|
|
|
|
address := fakeMulti.GetFakeIPForDomain3("fakednstestipv46.v2fly.org", true, true)
|
|
|
|
assert.Len(t, address, 2, "should be 2 address")
|
|
|
|
assert.True(t, address[0].Family().IsIPv4())
|
|
|
|
assert.True(t, address[1].Family().IsIPv6())
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|