@@ -74,12 +74,10 @@ func TestNodeUpdater_setNetInfo_same(t *testing.T) {
7474nodeKey := key .NewNode ().Public ()
7575discoKey := key .NewDisco ().Public ()
7676nodeCh := make (chan * Node )
77- goCh := make (chan struct {})
7877uut := newNodeUpdater (
7978logger ,
8079func (n * Node ) {
8180nodeCh <- n
82- <- goCh
8381},
8482id ,nodeKey ,discoKey ,
8583)
@@ -108,3 +106,80 @@ func TestNodeUpdater_setNetInfo_same(t *testing.T) {
108106}()
109107_ = testutil .RequireRecvCtx (ctx ,t ,done )
110108}
109+
110+ func TestNodeUpdater_setDERPForcedWebsocket_different (t * testing.T ) {
111+ t .Parallel ()
112+ ctx := testutil .Context (t ,testutil .WaitShort )
113+ logger := slogtest .Make (t ,nil ).Leveled (slog .LevelDebug )
114+ id := tailcfg .NodeID (1 )
115+ nodeKey := key .NewNode ().Public ()
116+ discoKey := key .NewDisco ().Public ()
117+ nodeCh := make (chan * Node )
118+ uut := newNodeUpdater (
119+ logger ,
120+ func (n * Node ) {
121+ nodeCh <- n
122+ },
123+ id ,nodeKey ,discoKey ,
124+ )
125+ defer uut .close ()
126+
127+ // Given: preferred DERP is 1, so we'll send an update
128+ uut .L .Lock ()
129+ uut .preferredDERP = 1
130+ uut .L .Unlock ()
131+
132+ // When: we set a new forced websocket reason
133+ uut .setDERPForcedWebsocket (1 ,"test" )
134+
135+ // Then: we receive an update with the reason set
136+ node := testutil .RequireRecvCtx (ctx ,t ,nodeCh )
137+ require .Equal (t ,nodeKey ,node .Key )
138+ require .Equal (t ,discoKey ,node .DiscoKey )
139+ require .True (t ,maps .Equal (map [int ]string {1 :"test" },node .DERPForcedWebsocket ))
140+
141+ done := make (chan struct {})
142+ go func () {
143+ defer close (done )
144+ uut .close ()
145+ }()
146+ _ = testutil .RequireRecvCtx (ctx ,t ,done )
147+ }
148+
149+ func TestNodeUpdater_setDERPForcedWebsocket_same (t * testing.T ) {
150+ t .Parallel ()
151+ ctx := testutil .Context (t ,testutil .WaitShort )
152+ logger := slogtest .Make (t ,nil ).Leveled (slog .LevelDebug )
153+ id := tailcfg .NodeID (1 )
154+ nodeKey := key .NewNode ().Public ()
155+ discoKey := key .NewDisco ().Public ()
156+ nodeCh := make (chan * Node )
157+ uut := newNodeUpdater (
158+ logger ,
159+ func (n * Node ) {
160+ nodeCh <- n
161+ },
162+ id ,nodeKey ,discoKey ,
163+ )
164+ defer uut .close ()
165+
166+ // Then: we don't configure
167+ requireNeverConfigures (ctx ,t ,& uut .phased )
168+
169+ // Given: preferred DERP is 1, so we would send an update on change &&
170+ // reason for region 1 is set to "test"
171+ uut .L .Lock ()
172+ uut .preferredDERP = 1
173+ uut .derpForcedWebsockets [1 ]= "test"
174+ uut .L .Unlock ()
175+
176+ // When: we set region 1 to "test
177+ uut .setDERPForcedWebsocket (1 ,"test" )
178+
179+ done := make (chan struct {})
180+ go func () {
181+ defer close (done )
182+ uut .close ()
183+ }()
184+ _ = testutil .RequireRecvCtx (ctx ,t ,done )
185+ }