github.com/telepresenceio/telepresence/v2@v2.20.0-pro.6.0.20240517030216-236ea954e789/pkg/client/rootd/dns/server_test.go (about) 1 package dns 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/miekg/dns" 8 "github.com/puzpuzpuz/xsync/v3" 9 "github.com/stretchr/testify/assert" 10 "github.com/stretchr/testify/suite" 11 12 rpc "github.com/telepresenceio/telepresence/rpc/v2/daemon" 13 ) 14 15 type suiteServer struct { 16 suite.Suite 17 18 server *Server 19 } 20 21 func (s *suiteServer) SetupSuite() { 22 s.server = &Server{ 23 cache: xsync.NewMapOf[cacheKey, *cacheEntry](), 24 } 25 } 26 27 func (s *suiteServer) TestSetMappings() { 28 // given 29 entry := &cacheEntry{wait: make(chan struct{}), created: time.Now()} 30 aliasKeyA := cacheKey{name: "echo-easy-alias.", qType: dns.TypeA} 31 aliasKeyAAAA := cacheKey{name: "echo-easy-alias.", qType: dns.TypeAAAA} 32 aliasedToKeyA := cacheKey{name: "echo-easy.blue.svc.cluster.local.", qType: dns.TypeA} 33 aliasedToKeyAAAA := cacheKey{name: "echo-easy.blue.svc.cluster.local.", qType: dns.TypeA} 34 35 s.server.cache.Store(aliasKeyA, entry) 36 s.server.cache.Store(aliasKeyAAAA, entry) 37 s.server.cache.Store(aliasedToKeyA, entry) 38 s.server.cache.Store(aliasedToKeyAAAA, entry) 39 40 s.server.mappings = map[string]string{} 41 42 // when 43 s.server.SetMappings([]*rpc.DNSMapping{ 44 { 45 Name: "echo-easy-alias", 46 AliasFor: "echo-easy.blue.svc.cluster.local", 47 }, 48 }) 49 50 // then 51 _, exists := s.server.cache.Load(aliasKeyA) 52 s.False(exists, "Mapping's A record wasn't purged") 53 _, exists = s.server.cache.Load(aliasKeyAAAA) 54 s.False(exists, "Mapping's AAAA record wasn't purged") 55 _, exists = s.server.cache.Load(aliasedToKeyA) 56 s.True(exists, "Service's A record was purged") 57 _, exists = s.server.cache.Load(aliasedToKeyAAAA) 58 s.True(exists, "Service's AAAA record was purged") 59 60 s.Equal(s.server.mappings, map[string]string{ 61 "echo-easy-alias.": "echo-easy.blue.svc.cluster.local.", 62 }) 63 64 // given 65 s.server.cache.Store(aliasKeyA, entry) 66 s.server.cache.Store(aliasKeyAAAA, entry) 67 68 // when 69 s.server.SetMappings([]*rpc.DNSMapping{}) 70 71 // then 72 // mappings are empty 73 s.Empty(s.server.mappings) 74 75 // nothing is purged when clearing the mappings because mappings never make it to the cache 76 _, exists = s.server.cache.Load(aliasKeyA) 77 s.True(exists, "Mapping's A record was purged") 78 _, exists = s.server.cache.Load(aliasKeyAAAA) 79 s.True(exists, "Mapping's AAAA record was purged") 80 _, exists = s.server.cache.Load(aliasedToKeyA) 81 s.True(exists, "Service's A record was purged") 82 _, exists = s.server.cache.Load(aliasedToKeyAAAA) 83 s.True(exists, "Service's AAAA record was purged") 84 } 85 86 func (s *suiteServer) TestSetExcludes() { 87 // given 88 entry := &cacheEntry{wait: make(chan struct{}), created: time.Now()} 89 toDeleteARecordKey := cacheKey{name: "echo-easy.", qType: dns.TypeA} 90 toDelete4ARecordKey := cacheKey{name: "echo-easy.", qType: dns.TypeAAAA} 91 toDeleteNewARecordKey := cacheKey{name: "new-excluded.", qType: dns.TypeAAAA} 92 93 s.server.cache.Store(toDeleteARecordKey, entry) 94 s.server.cache.Store(toDelete4ARecordKey, entry) 95 s.server.cache.Store(toDeleteNewARecordKey, entry) 96 97 s.server.excludes = []string{"echo-easy"} 98 99 // when 100 newExcluded := []string{"new-excluded"} 101 s.server.SetExcludes(newExcluded) 102 103 // then 104 _, exists := s.server.cache.Load(toDeleteARecordKey) 105 assert.False(s.T(), exists, "Excluded A record was purged") 106 _, exists = s.server.cache.Load(toDelete4ARecordKey) 107 assert.False(s.T(), exists, "Excluded AAAA record was purged") 108 _, exists = s.server.cache.Load(toDeleteNewARecordKey) 109 assert.False(s.T(), exists, "New excluded record was purged") 110 assert.Equal(s.T(), newExcluded, s.server.excludes) 111 } 112 113 func (s *suiteServer) TestIsExcluded() { 114 // given 115 s.server.excludes = []string{ 116 "echo-easy", 117 } 118 s.server.search = []string{ 119 tel2SubDomainDot + "cluster.local", 120 "blue.svc.cluster.local", 121 } 122 123 // when & then 124 assert.True(s.T(), s.server.isExcluded("echo-easy")) 125 assert.True(s.T(), s.server.isExcluded("echo-easy.tel2-search.cluster.local")) 126 assert.True(s.T(), s.server.isExcluded("echo-easy.blue.svc.cluster.local")) 127 assert.False(s.T(), s.server.isExcluded("something-else")) 128 } 129 130 func TestServerTestSuite(t *testing.T) { 131 suite.Run(t, new(suiteServer)) 132 }