domain_test.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package trie_test
  2. import (
  3. "net/netip"
  4. "testing"
  5. "github.com/metacubex/mihomo/component/trie"
  6. "github.com/stretchr/testify/assert"
  7. )
  8. var localIP = netip.AddrFrom4([4]byte{127, 0, 0, 1})
  9. func TestTrie_Basic(t *testing.T) {
  10. tree := trie.New[netip.Addr]()
  11. domains := []string{
  12. "example.com",
  13. "google.com",
  14. "localhost",
  15. }
  16. for _, domain := range domains {
  17. assert.NoError(t, tree.Insert(domain, localIP))
  18. }
  19. node := tree.Search("example.com")
  20. assert.NotNil(t, node)
  21. assert.True(t, node.Data() == localIP)
  22. assert.NotNil(t, tree.Insert("", localIP))
  23. assert.Nil(t, tree.Search(""))
  24. assert.NotNil(t, tree.Search("localhost"))
  25. assert.Nil(t, tree.Search("www.google.com"))
  26. }
  27. func TestTrie_Wildcard(t *testing.T) {
  28. tree := trie.New[netip.Addr]()
  29. domains := []string{
  30. "*.example.com",
  31. "sub.*.example.com",
  32. "*.dev",
  33. ".org",
  34. ".example.net",
  35. ".apple.*",
  36. "+.foo.com",
  37. "+.stun.*.*",
  38. "+.stun.*.*.*",
  39. "+.stun.*.*.*.*",
  40. "stun.l.google.com",
  41. }
  42. for _, domain := range domains {
  43. assert.NoError(t, tree.Insert(domain, localIP))
  44. }
  45. assert.NotNil(t, tree.Search("sub.example.com"))
  46. assert.NotNil(t, tree.Search("sub.foo.example.com"))
  47. assert.NotNil(t, tree.Search("test.org"))
  48. assert.NotNil(t, tree.Search("test.example.net"))
  49. assert.NotNil(t, tree.Search("test.apple.com"))
  50. assert.NotNil(t, tree.Search("test.foo.com"))
  51. assert.NotNil(t, tree.Search("foo.com"))
  52. assert.NotNil(t, tree.Search("global.stun.website.com"))
  53. assert.Nil(t, tree.Search("foo.sub.example.com"))
  54. assert.Nil(t, tree.Search("foo.example.dev"))
  55. assert.Nil(t, tree.Search("example.com"))
  56. }
  57. func TestTrie_Priority(t *testing.T) {
  58. tree := trie.New[int]()
  59. domains := []string{
  60. ".dev",
  61. "example.dev",
  62. "*.example.dev",
  63. "test.example.dev",
  64. }
  65. assertFn := func(domain string, data int) {
  66. node := tree.Search(domain)
  67. assert.NotNil(t, node)
  68. assert.Equal(t, data, node.Data())
  69. }
  70. for idx, domain := range domains {
  71. assert.NoError(t, tree.Insert(domain, idx+1))
  72. }
  73. assertFn("test.dev", 1)
  74. assertFn("foo.bar.dev", 1)
  75. assertFn("example.dev", 2)
  76. assertFn("foo.example.dev", 3)
  77. assertFn("test.example.dev", 4)
  78. }
  79. func TestTrie_Boundary(t *testing.T) {
  80. tree := trie.New[netip.Addr]()
  81. assert.NoError(t, tree.Insert("*.dev", localIP))
  82. assert.NotNil(t, tree.Insert(".", localIP))
  83. assert.NotNil(t, tree.Insert("..dev", localIP))
  84. assert.Nil(t, tree.Search("dev"))
  85. }
  86. func TestTrie_WildcardBoundary(t *testing.T) {
  87. tree := trie.New[netip.Addr]()
  88. assert.NoError(t, tree.Insert("+.*", localIP))
  89. assert.NoError(t, tree.Insert("stun.*.*.*", localIP))
  90. assert.NotNil(t, tree.Search("example.com"))
  91. }
  92. func TestTrie_Foreach(t *testing.T) {
  93. tree := trie.New[netip.Addr]()
  94. domainList := []string{
  95. "google.com",
  96. "stun.*.*.*",
  97. "test.*.google.com",
  98. "+.baidu.com",
  99. "*.baidu.com",
  100. "*.*.baidu.com",
  101. }
  102. for _, domain := range domainList {
  103. assert.NoError(t, tree.Insert(domain, localIP))
  104. }
  105. count := 0
  106. tree.Foreach(func(domain string, data netip.Addr) bool {
  107. count++
  108. return true
  109. })
  110. assert.Equal(t, 7, count)
  111. }