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  }