@@ -586,7 +586,7 @@ func TestNewBasicDERPController_Mainline(t *testing.T) {
586586 t .Parallel ()
587587 fs := make (chan * tailcfg.DERPMap )
588588 logger := testutil .Logger (t )
589- uut := tailnet .NewBasicDERPController (logger , fakeSetter (fs ))
589+ uut := tailnet .NewBasicDERPController (logger , nil , fakeSetter (fs ))
590590 fc := fakeDERPClient {
591591 ch : make (chan * tailcfg.DERPMap ),
592592 }
@@ -609,7 +609,7 @@ func TestNewBasicDERPController_RecvErr(t *testing.T) {
609609 t .Parallel ()
610610 fs := make (chan * tailcfg.DERPMap )
611611 logger := testutil .Logger (t )
612- uut := tailnet .NewBasicDERPController (logger , fakeSetter (fs ))
612+ uut := tailnet .NewBasicDERPController (logger , nil , fakeSetter (fs ))
613613 expectedErr := xerrors .New ("a bad thing happened" )
614614 fc := fakeDERPClient {
615615 ch : make (chan * tailcfg.DERPMap ),
@@ -1041,7 +1041,7 @@ func TestController_Disconnects(t *testing.T) {
10411041 // darwin can be slow sometimes.
10421042 tailnet .WithGracefulTimeout (5 * time .Second ))
10431043 uut .CoordCtrl = tailnet .NewAgentCoordinationController (logger .Named ("coord_ctrl" ), fConn )
1044- uut .DERPCtrl = tailnet .NewBasicDERPController (logger .Named ("derp_ctrl" ), fConn )
1044+ uut .DERPCtrl = tailnet .NewBasicDERPController (logger .Named ("derp_ctrl" ), nil , fConn )
10451045 uut .Run (ctx )
10461046
10471047 call := testutil .TryReceive (testCtx , t , fCoord .CoordinateCalls )
@@ -1945,6 +1945,52 @@ func TestTunnelAllWorkspaceUpdatesController_HandleErrors(t *testing.T) {
19451945 }
19461946}
19471947
1948+ func TestBasicDERPController_RewriteDERPMap (t * testing.T ) {
1949+ t .Parallel ()
1950+ ctx := testutil .Context (t , testutil .WaitShort )
1951+ logger := slogtest .Make (t , & slogtest.Options {IgnoreErrors : true }).Leveled (slog .LevelDebug )
1952+
1953+ testDERPMap := & tailcfg.DERPMap {
1954+ Regions : map [int ]* tailcfg.DERPRegion {
1955+ 1 : {
1956+ RegionID : 1 ,
1957+ },
1958+ },
1959+ }
1960+
1961+ // Ensure the fake rewriter works as expected.
1962+ rewriter := & fakeDERPMapRewriter {
1963+ ctx : ctx ,
1964+ calls : make (chan rewriteDERPMapCall , 16 ),
1965+ }
1966+ rewriter .RewriteDERPMap (testDERPMap )
1967+ rewriteCall := testutil .TryReceive (ctx , t , rewriter .calls )
1968+ require .Same (t , testDERPMap , rewriteCall .derpMap )
1969+
1970+ derpClient := & fakeDERPClient {
1971+ ch : make (chan * tailcfg.DERPMap ),
1972+ err : nil ,
1973+ }
1974+ defer derpClient .Close ()
1975+
1976+ derpSetter := & fakeDERPMapSetter {
1977+ ctx : ctx ,
1978+ calls : make (chan * setDERPMapCall , 16 ),
1979+ }
1980+
1981+ derpCtrl := tailnet .NewBasicDERPController (logger , rewriter , derpSetter )
1982+ derpCtrl .New (derpClient )
1983+
1984+ // Simulate receiving a new DERP map from the server, which should be passed
1985+ // to the rewriter and setter.
1986+ testDERPMap = testDERPMap .Clone () // make a new pointer
1987+ derpClient .ch <- testDERPMap
1988+ rewriteCall = testutil .TryReceive (ctx , t , rewriter .calls )
1989+ require .Same (t , testDERPMap , rewriteCall .derpMap )
1990+ setterCall := testutil .TryReceive (ctx , t , derpSetter .calls )
1991+ require .Same (t , testDERPMap , setterCall .derpMap )
1992+ }
1993+
19481994type fakeWorkspaceUpdatesController struct {
19491995 ctx context.Context
19501996 t testing.TB
@@ -2040,3 +2086,45 @@ type fakeCloser struct{}
20402086func (fakeCloser ) Close () error {
20412087 return nil
20422088}
2089+
2090+ type fakeDERPMapRewriter struct {
2091+ ctx context.Context
2092+ calls chan rewriteDERPMapCall
2093+ }
2094+
2095+ var _ tailnet.DERPMapRewriter = & fakeDERPMapRewriter {}
2096+
2097+ type rewriteDERPMapCall struct {
2098+ derpMap * tailcfg.DERPMap
2099+ }
2100+
2101+ func (f * fakeDERPMapRewriter ) RewriteDERPMap (derpMap * tailcfg.DERPMap ) {
2102+ call := rewriteDERPMapCall {
2103+ derpMap : derpMap ,
2104+ }
2105+ select {
2106+ case f .calls <- call :
2107+ case <- f .ctx .Done ():
2108+ }
2109+ }
2110+
2111+ type fakeDERPMapSetter struct {
2112+ ctx context.Context
2113+ calls chan * setDERPMapCall
2114+ }
2115+
2116+ var _ tailnet.DERPMapSetter = & fakeDERPMapSetter {}
2117+
2118+ type setDERPMapCall struct {
2119+ derpMap * tailcfg.DERPMap
2120+ }
2121+
2122+ func (f * fakeDERPMapSetter ) SetDERPMap (derpMap * tailcfg.DERPMap ) {
2123+ call := & setDERPMapCall {
2124+ derpMap : derpMap ,
2125+ }
2126+ select {
2127+ case <- f .ctx .Done ():
2128+ case f .calls <- call :
2129+ }
2130+ }
0 commit comments