fakedns_test.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. package fakedns
  2. import (
  3. gonet "net"
  4. "strconv"
  5. "testing"
  6. "github.com/stretchr/testify/assert"
  7. "github.com/xtls/xray-core/common"
  8. "github.com/xtls/xray-core/common/net"
  9. "github.com/xtls/xray-core/common/uuid"
  10. "github.com/xtls/xray-core/features/dns"
  11. "golang.org/x/sync/errgroup"
  12. )
  13. var ipPrefix = "198.1"
  14. func TestNewFakeDnsHolder(_ *testing.T) {
  15. _, err := NewFakeDNSHolder()
  16. common.Must(err)
  17. }
  18. func TestFakeDnsHolderCreateMapping(t *testing.T) {
  19. fkdns, err := NewFakeDNSHolder()
  20. common.Must(err)
  21. addr := fkdns.GetFakeIPForDomain("fakednstest.example.com")
  22. assert.Equal(t, ipPrefix, addr[0].IP().String()[0:len(ipPrefix)])
  23. }
  24. func TestFakeDnsHolderCreateMappingMany(t *testing.T) {
  25. fkdns, err := NewFakeDNSHolder()
  26. common.Must(err)
  27. addr := fkdns.GetFakeIPForDomain("fakednstest.example.com")
  28. assert.Equal(t, ipPrefix, addr[0].IP().String()[0:len(ipPrefix)])
  29. addr2 := fkdns.GetFakeIPForDomain("fakednstest2.example.com")
  30. assert.Equal(t, ipPrefix, addr2[0].IP().String()[0:len(ipPrefix)])
  31. assert.NotEqual(t, addr[0].IP().String(), addr2[0].IP().String())
  32. }
  33. func TestFakeDnsHolderCreateMappingManyAndResolve(t *testing.T) {
  34. fkdns, err := NewFakeDNSHolder()
  35. common.Must(err)
  36. addr := fkdns.GetFakeIPForDomain("fakednstest.example.com")
  37. addr2 := fkdns.GetFakeIPForDomain("fakednstest2.example.com")
  38. {
  39. result := fkdns.GetDomainFromFakeDNS(addr[0])
  40. assert.Equal(t, "fakednstest.example.com", result)
  41. }
  42. {
  43. result := fkdns.GetDomainFromFakeDNS(addr2[0])
  44. assert.Equal(t, "fakednstest2.example.com", result)
  45. }
  46. }
  47. func TestFakeDnsHolderCreateMappingManySingleDomain(t *testing.T) {
  48. fkdns, err := NewFakeDNSHolder()
  49. common.Must(err)
  50. addr := fkdns.GetFakeIPForDomain("fakednstest.example.com")
  51. addr2 := fkdns.GetFakeIPForDomain("fakednstest.example.com")
  52. assert.Equal(t, addr[0].IP().String(), addr2[0].IP().String())
  53. }
  54. func TestGetFakeIPForDomainConcurrently(t *testing.T) {
  55. fkdns, err := NewFakeDNSHolder()
  56. common.Must(err)
  57. total := 200
  58. addr := make([][]net.Address, total)
  59. var errg errgroup.Group
  60. for i := 0; i < total; i++ {
  61. errg.Go(testGetFakeIP(i, addr, fkdns))
  62. }
  63. errg.Wait()
  64. for i := 0; i < total; i++ {
  65. for j := i + 1; j < total; j++ {
  66. assert.NotEqual(t, addr[i][0].IP().String(), addr[j][0].IP().String())
  67. }
  68. }
  69. }
  70. func testGetFakeIP(index int, addr [][]net.Address, fkdns *Holder) func() error {
  71. return func() error {
  72. addr[index] = fkdns.GetFakeIPForDomain("fakednstest" + strconv.Itoa(index) + ".example.com")
  73. return nil
  74. }
  75. }
  76. func TestFakeDnsHolderCreateMappingAndRollOver(t *testing.T) {
  77. fkdns, err := NewFakeDNSHolderConfigOnly(&FakeDnsPool{
  78. IpPool: dns.FakeIPv4Pool,
  79. LruSize: 256,
  80. })
  81. common.Must(err)
  82. err = fkdns.Start()
  83. common.Must(err)
  84. addr := fkdns.GetFakeIPForDomain("fakednstest.example.com")
  85. addr2 := fkdns.GetFakeIPForDomain("fakednstest2.example.com")
  86. for i := 0; i <= 8192; i++ {
  87. {
  88. result := fkdns.GetDomainFromFakeDNS(addr[0])
  89. assert.Equal(t, "fakednstest.example.com", result)
  90. }
  91. {
  92. result := fkdns.GetDomainFromFakeDNS(addr2[0])
  93. assert.Equal(t, "fakednstest2.example.com", result)
  94. }
  95. {
  96. uuid := uuid.New()
  97. domain := uuid.String() + ".fakednstest.example.com"
  98. tempAddr := fkdns.GetFakeIPForDomain(domain)
  99. rsaddr := tempAddr[0].IP().String()
  100. result := fkdns.GetDomainFromFakeDNS(net.ParseAddress(rsaddr))
  101. assert.Equal(t, domain, result)
  102. }
  103. }
  104. }
  105. func TestFakeDNSMulti(t *testing.T) {
  106. fakeMulti, err := NewFakeDNSHolderMulti(&FakeDnsPoolMulti{
  107. Pools: []*FakeDnsPool{{
  108. IpPool: "240.0.0.0/12",
  109. LruSize: 256,
  110. }, {
  111. IpPool: "fddd:c5b4:ff5f:f4f0::/64",
  112. LruSize: 256,
  113. }},
  114. },
  115. )
  116. common.Must(err)
  117. err = fakeMulti.Start()
  118. common.Must(err)
  119. assert.Nil(t, err, "Should not throw error")
  120. _ = fakeMulti
  121. t.Run("checkInRange", func(t *testing.T) {
  122. t.Run("ipv4", func(t *testing.T) {
  123. inPool := fakeMulti.IsIPInIPPool(net.IPAddress([]byte{240, 0, 0, 5}))
  124. assert.True(t, inPool)
  125. })
  126. t.Run("ipv6", func(t *testing.T) {
  127. ip, err := gonet.ResolveIPAddr("ip", "fddd:c5b4:ff5f:f4f0::5")
  128. assert.Nil(t, err)
  129. inPool := fakeMulti.IsIPInIPPool(net.IPAddress(ip.IP))
  130. assert.True(t, inPool)
  131. })
  132. t.Run("ipv4_inverse", func(t *testing.T) {
  133. inPool := fakeMulti.IsIPInIPPool(net.IPAddress([]byte{241, 0, 0, 5}))
  134. assert.False(t, inPool)
  135. })
  136. t.Run("ipv6_inverse", func(t *testing.T) {
  137. ip, err := gonet.ResolveIPAddr("ip", "fcdd:c5b4:ff5f:f4f0::5")
  138. assert.Nil(t, err)
  139. inPool := fakeMulti.IsIPInIPPool(net.IPAddress(ip.IP))
  140. assert.False(t, inPool)
  141. })
  142. })
  143. t.Run("allocateTwoAddressForTwoPool", func(t *testing.T) {
  144. address := fakeMulti.GetFakeIPForDomain("fakednstest.example.com")
  145. assert.Len(t, address, 2, "should be 2 address one for each pool")
  146. t.Run("eachOfThemShouldResolve:0", func(t *testing.T) {
  147. domain := fakeMulti.GetDomainFromFakeDNS(address[0])
  148. assert.Equal(t, "fakednstest.example.com", domain)
  149. })
  150. t.Run("eachOfThemShouldResolve:1", func(t *testing.T) {
  151. domain := fakeMulti.GetDomainFromFakeDNS(address[1])
  152. assert.Equal(t, "fakednstest.example.com", domain)
  153. })
  154. })
  155. t.Run("understandIPTypeSelector", func(t *testing.T) {
  156. t.Run("ipv4", func(t *testing.T) {
  157. address := fakeMulti.GetFakeIPForDomain3("fakednstestipv4.example.com", true, false)
  158. assert.Len(t, address, 1, "should be 1 address")
  159. assert.True(t, address[0].Family().IsIPv4())
  160. })
  161. t.Run("ipv6", func(t *testing.T) {
  162. address := fakeMulti.GetFakeIPForDomain3("fakednstestipv6.example.com", false, true)
  163. assert.Len(t, address, 1, "should be 1 address")
  164. assert.True(t, address[0].Family().IsIPv6())
  165. })
  166. t.Run("ipv46", func(t *testing.T) {
  167. address := fakeMulti.GetFakeIPForDomain3("fakednstestipv46.example.com", true, true)
  168. assert.Len(t, address, 2, "should be 2 address")
  169. assert.True(t, address[0].Family().IsIPv4())
  170. assert.True(t, address[1].Family().IsIPv6())
  171. })
  172. })
  173. }