@ -65,7 +65,6 @@ import (
"tailscale.com/types/netmap"
"tailscale.com/types/nettype"
"tailscale.com/types/ptr"
"tailscale.com/types/views"
"tailscale.com/util/cibuild"
"tailscale.com/util/clientmetric"
"tailscale.com/util/eventbus"
@ -3584,7 +3583,7 @@ func Test_nodeHasCap(t *testing.T) {
}
}
func TestConn_ updateRelayServersSet( t * testing . T ) {
func TestConn_ onNodeViewsUpdate_ updateRelayServersSet( t * testing . T ) {
peerNodeCandidateRelay := & tailcfg . Node {
Cap : 121 ,
ID : 1 ,
@ -3618,12 +3617,21 @@ func TestConn_updateRelayServersSet(t *testing.T) {
DiscoKey : key . NewDisco ( ) . Public ( ) ,
}
selfNodeNodeAttrDisableRelayClient := selfNode . Clone ( )
selfNodeNodeAttrDisableRelayClient . CapMap = make ( tailcfg . NodeCapMap )
selfNodeNodeAttrDisableRelayClient . CapMap [ tailcfg . NodeAttrDisableRelayClient ] = nil
selfNodeNodeAttrOnlyTCP443 := selfNode . Clone ( )
selfNodeNodeAttrOnlyTCP443 . CapMap = make ( tailcfg . NodeCapMap )
selfNodeNodeAttrOnlyTCP443 . CapMap [ tailcfg . NodeAttrOnlyTCP443 ] = nil
tests := [ ] struct {
name string
filt * filter . Filter
self tailcfg . NodeView
peers views . Slice [ tailcfg . NodeView ]
peers [ ] tailcfg . NodeView
wantRelayServers set . Set [ candidatePeerRelay ]
wantRelayClientEnabled bool
} {
{
name : "candidate relay server" ,
@ -3639,7 +3647,7 @@ func TestConn_updateRelayServersSet(t *testing.T) {
} ,
} , nil , nil , nil , nil , nil ) ,
self : selfNode . View ( ) ,
peers : views . SliceOf ( [ ] tailcfg . NodeView { peerNodeCandidateRelay . View ( ) } ) ,
peers : [ ] tailcfg . NodeView { peerNodeCandidateRelay . View ( ) } ,
wantRelayServers : set . SetOf ( [ ] candidatePeerRelay {
{
nodeKey : peerNodeCandidateRelay . Key ,
@ -3647,6 +3655,43 @@ func TestConn_updateRelayServersSet(t *testing.T) {
derpHomeRegionID : 1 ,
} ,
} ) ,
wantRelayClientEnabled : true ,
} ,
{
name : "no candidate relay server because self has tailcfg.NodeAttrDisableRelayClient" ,
filt : filter . New ( [ ] filtertype . Match {
{
Srcs : peerNodeCandidateRelay . Addresses ,
Caps : [ ] filtertype . CapMatch {
{
Dst : selfNodeNodeAttrDisableRelayClient . Addresses [ 0 ] ,
Cap : tailcfg . PeerCapabilityRelayTarget ,
} ,
} ,
} ,
} , nil , nil , nil , nil , nil ) ,
self : selfNodeNodeAttrDisableRelayClient . View ( ) ,
peers : [ ] tailcfg . NodeView { peerNodeCandidateRelay . View ( ) } ,
wantRelayServers : make ( set . Set [ candidatePeerRelay ] ) ,
wantRelayClientEnabled : false ,
} ,
{
name : "no candidate relay server because self has tailcfg.NodeAttrOnlyTCP443" ,
filt : filter . New ( [ ] filtertype . Match {
{
Srcs : peerNodeCandidateRelay . Addresses ,
Caps : [ ] filtertype . CapMatch {
{
Dst : selfNodeNodeAttrOnlyTCP443 . Addresses [ 0 ] ,
Cap : tailcfg . PeerCapabilityRelayTarget ,
} ,
} ,
} ,
} , nil , nil , nil , nil , nil ) ,
self : selfNodeNodeAttrOnlyTCP443 . View ( ) ,
peers : [ ] tailcfg . NodeView { peerNodeCandidateRelay . View ( ) } ,
wantRelayServers : make ( set . Set [ candidatePeerRelay ] ) ,
wantRelayClientEnabled : false ,
} ,
{
name : "self candidate relay server" ,
@ -3662,7 +3707,7 @@ func TestConn_updateRelayServersSet(t *testing.T) {
} ,
} , nil , nil , nil , nil , nil ) ,
self : selfNode . View ( ) ,
peers : views . SliceOf ( [ ] tailcfg . NodeView { selfNode . View ( ) } ) ,
peers : [ ] tailcfg . NodeView { selfNode . View ( ) } ,
wantRelayServers : set . SetOf ( [ ] candidatePeerRelay {
{
nodeKey : selfNode . Key ,
@ -3670,6 +3715,7 @@ func TestConn_updateRelayServersSet(t *testing.T) {
derpHomeRegionID : 2 ,
} ,
} ) ,
wantRelayClientEnabled : true ,
} ,
{
name : "no candidate relay server" ,
@ -3685,20 +3731,33 @@ func TestConn_updateRelayServersSet(t *testing.T) {
} ,
} , nil , nil , nil , nil , nil ) ,
self : selfNode . View ( ) ,
peers : views . SliceOf ( [ ] tailcfg . NodeView { peerNodeNotCandidateRelayCapVer . View ( ) } ) ,
peers : [ ] tailcfg . NodeView { peerNodeNotCandidateRelayCapVer . View ( ) } ,
wantRelayServers : make ( set . Set [ candidatePeerRelay ] ) ,
wantRelayClientEnabled : true ,
} ,
}
for _ , tt := range tests {
t . Run ( tt . name , func ( t * testing . T ) {
c := & Conn { }
c . updateRelayServersSet ( tt . filt , tt . self , tt . peers )
c := newConn ( t . Logf )
c . filt = tt . filt
if len ( tt . wantRelayServers ) == 0 {
// So we can verify it gets flipped back.
c . hasPeerRelayServers . Store ( true )
}
c . onNodeViewsUpdate ( NodeViewsUpdate {
SelfNode : tt . self ,
Peers : tt . peers ,
} )
got := c . relayManager . getServers ( )
if ! got . Equal ( tt . wantRelayServers ) {
t . Fatalf ( "got: %v != want: %v" , got , tt . wantRelayServers )
}
if len ( tt . wantRelayServers ) > 0 != c . hasPeerRelayServers . Load ( ) {
t . Fatalf ( "c.hasPeerRelayServers: %v != wantRelayServers: %v" , c . hasPeerRelayServers . Load ( ) , tt . wantRelayServers )
t . Fatalf ( "c.hasPeerRelayServers: %v != len(tt.wantRelayServers) > 0: %v" , c . hasPeerRelayServers . Load ( ) , len ( tt . wantRelayServers ) > 0 )
}
if c . relayClientEnabled != tt . wantRelayClientEnabled {
t . Fatalf ( "c.relayClientEnabled: %v != wantRelayClientEnabled: %v" , c . relayClientEnabled , tt . wantRelayClientEnabled )
}
} )
}