@@ -227,7 +227,7 @@ func TestNodeUpdater_setStatus_different(t *testing.T) {
227227node := testutil .RequireRecvCtx (ctx ,t ,nodeCh )
228228require .Equal (t ,nodeKey ,node .Key )
229229require .Equal (t ,discoKey ,node .DiscoKey )
230- require .True (t ,slices . Equal ( []string {"[fe80::1]:5678" },node .Endpoints ) )
230+ require .Equal (t , []string {"[fe80::1]:5678" },node .Endpoints )
231231
232232// Then: we store the AsOf time as lastStatus
233233uut .L .Lock ()
@@ -361,3 +361,83 @@ func TestNodeUpdater_setStatus_outdated(t *testing.T) {
361361}()
362362_ = testutil .RequireRecvCtx (ctx ,t ,done )
363363}
364+
365+ func TestNodeUpdater_setAddresses_different (t * testing.T ) {
366+ t .Parallel ()
367+ ctx := testutil .Context (t ,testutil .WaitShort )
368+ logger := slogtest .Make (t ,nil ).Leveled (slog .LevelDebug )
369+ id := tailcfg .NodeID (1 )
370+ nodeKey := key .NewNode ().Public ()
371+ discoKey := key .NewDisco ().Public ()
372+ nodeCh := make (chan * Node )
373+ uut := newNodeUpdater (
374+ logger ,
375+ func (n * Node ) {
376+ nodeCh <- n
377+ },
378+ id ,nodeKey ,discoKey ,
379+ )
380+ defer uut .close ()
381+
382+ // Given: preferred DERP is 1, so we'll send an update
383+ uut .L .Lock ()
384+ uut .preferredDERP = 1
385+ uut .L .Unlock ()
386+
387+ // When: we set addresses
388+ addrs := []netip.Prefix {netip .MustParsePrefix ("192.168.0.200/32" )}
389+ uut .setAddresses (addrs )
390+
391+ // Then: we receive an update with the addresses
392+ node := testutil .RequireRecvCtx (ctx ,t ,nodeCh )
393+ require .Equal (t ,nodeKey ,node .Key )
394+ require .Equal (t ,discoKey ,node .DiscoKey )
395+ require .Equal (t ,addrs ,node .Addresses )
396+ require .Equal (t ,addrs ,node .AllowedIPs )
397+
398+ done := make (chan struct {})
399+ go func () {
400+ defer close (done )
401+ uut .close ()
402+ }()
403+ _ = testutil .RequireRecvCtx (ctx ,t ,done )
404+ }
405+
406+ func TestNodeUpdater_setAddresses_same (t * testing.T ) {
407+ t .Parallel ()
408+ ctx := testutil .Context (t ,testutil .WaitShort )
409+ logger := slogtest .Make (t ,nil ).Leveled (slog .LevelDebug )
410+ id := tailcfg .NodeID (1 )
411+ nodeKey := key .NewNode ().Public ()
412+ discoKey := key .NewDisco ().Public ()
413+ nodeCh := make (chan * Node )
414+ uut := newNodeUpdater (
415+ logger ,
416+ func (n * Node ) {
417+ nodeCh <- n
418+ },
419+ id ,nodeKey ,discoKey ,
420+ )
421+ defer uut .close ()
422+
423+ // Then: we don't configure
424+ requireNeverConfigures (ctx ,t ,& uut .phased )
425+
426+ // Given: preferred DERP is 1, so we would send an update on change &&
427+ // addrs already set
428+ addrs := []netip.Prefix {netip .MustParsePrefix ("192.168.0.200/32" )}
429+ uut .L .Lock ()
430+ uut .preferredDERP = 1
431+ uut .addresses = slices .Clone (addrs )
432+ uut .L .Unlock ()
433+
434+ // When: we set addrs
435+ uut .setAddresses (addrs )
436+
437+ done := make (chan struct {})
438+ go func () {
439+ defer close (done )
440+ uut .close ()
441+ }()
442+ _ = testutil .RequireRecvCtx (ctx ,t ,done )
443+ }