@@ -482,3 +482,90 @@ func TestNodeUpdater_setCallback(t *testing.T) {
482482}()
483483_ = testutil .RequireRecvCtx (ctx ,t ,done )
484484}
485+
486+ func TestNodeUpdater_setBlockEndpoints_different (t * testing.T ) {
487+ t .Parallel ()
488+ ctx := testutil .Context (t ,testutil .WaitShort )
489+ logger := slogtest .Make (t ,nil ).Leveled (slog .LevelDebug )
490+ id := tailcfg .NodeID (1 )
491+ nodeKey := key .NewNode ().Public ()
492+ discoKey := key .NewDisco ().Public ()
493+ nodeCh := make (chan * Node )
494+ uut := newNodeUpdater (
495+ logger ,
496+ func (n * Node ) {
497+ nodeCh <- n
498+ },
499+ id ,nodeKey ,discoKey ,
500+ )
501+ defer uut .close ()
502+
503+ // Given: preferred DERP is 1, so we'll send an update && some endpoints
504+ uut .L .Lock ()
505+ uut .preferredDERP = 1
506+ uut .endpoints = []string {"10.11.12.13:7890" }
507+ uut .L .Unlock ()
508+
509+ // When: we setBlockEndpoints
510+ uut .setBlockEndpoints (true )
511+
512+ // Then: we receive an update without endpoints
513+ node := testutil .RequireRecvCtx (ctx ,t ,nodeCh )
514+ require .Equal (t ,nodeKey ,node .Key )
515+ require .Equal (t ,discoKey ,node .DiscoKey )
516+ require .Len (t ,node .Endpoints ,0 )
517+
518+ // When: we unset BlockEndpoints
519+ uut .setBlockEndpoints (false )
520+
521+ // Then: we receive an update with endpoints
522+ node = testutil .RequireRecvCtx (ctx ,t ,nodeCh )
523+ require .Equal (t ,nodeKey ,node .Key )
524+ require .Equal (t ,discoKey ,node .DiscoKey )
525+ require .Len (t ,node .Endpoints ,1 )
526+
527+ done := make (chan struct {})
528+ go func () {
529+ defer close (done )
530+ uut .close ()
531+ }()
532+ _ = testutil .RequireRecvCtx (ctx ,t ,done )
533+ }
534+
535+ func TestNodeUpdater_setBlockEndpoints_same (t * testing.T ) {
536+ t .Parallel ()
537+ ctx := testutil .Context (t ,testutil .WaitShort )
538+ logger := slogtest .Make (t ,nil ).Leveled (slog .LevelDebug )
539+ id := tailcfg .NodeID (1 )
540+ nodeKey := key .NewNode ().Public ()
541+ discoKey := key .NewDisco ().Public ()
542+ nodeCh := make (chan * Node )
543+ uut := newNodeUpdater (
544+ logger ,
545+ func (n * Node ) {
546+ nodeCh <- n
547+ },
548+ id ,nodeKey ,discoKey ,
549+ )
550+ defer uut .close ()
551+
552+ // Then: we don't configure
553+ requireNeverConfigures (ctx ,t ,& uut .phased )
554+
555+ // Given: preferred DERP is 1, so we would send an update on change &&
556+ // blockEndpoints already set
557+ uut .L .Lock ()
558+ uut .preferredDERP = 1
559+ uut .blockEndpoints = true
560+ uut .L .Unlock ()
561+
562+ // When: we set block endpoints
563+ uut .setBlockEndpoints (true )
564+
565+ done := make (chan struct {})
566+ go func () {
567+ defer close (done )
568+ uut .close ()
569+ }()
570+ _ = testutil .RequireRecvCtx (ctx ,t ,done )
571+ }