|
|
|
|
@ -17,7 +17,6 @@ import ( |
|
|
|
|
"tailscale.com/tstime" |
|
|
|
|
"tailscale.com/types/key" |
|
|
|
|
"tailscale.com/types/netmap" |
|
|
|
|
"tailscale.com/types/opt" |
|
|
|
|
"tailscale.com/types/ptr" |
|
|
|
|
"tailscale.com/util/must" |
|
|
|
|
) |
|
|
|
|
@ -470,85 +469,6 @@ func TestNetmapForResponse(t *testing.T) { |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// TestDeltaDebug tests that tailcfg.Debug values can be omitted in MapResponses
|
|
|
|
|
// entirely or have their opt.Bool values unspecified between MapResponses in a
|
|
|
|
|
// session and that should mean no change. (as of capver 37). But one Debug
|
|
|
|
|
// field existed prior to capver 37 that wasn't opt.Bool; we test that we both
|
|
|
|
|
// still accept the non-opt.Bool form from control for RandomizeClientPort and
|
|
|
|
|
// also accept the new form, keeping the old form in sync.
|
|
|
|
|
func TestDeltaDebug(t *testing.T) { |
|
|
|
|
type step struct { |
|
|
|
|
got *tailcfg.Debug |
|
|
|
|
want *tailcfg.Debug |
|
|
|
|
} |
|
|
|
|
tests := []struct { |
|
|
|
|
name string |
|
|
|
|
steps []step |
|
|
|
|
}{ |
|
|
|
|
{ |
|
|
|
|
name: "nothing-to-nothing", |
|
|
|
|
steps: []step{ |
|
|
|
|
{nil, nil}, |
|
|
|
|
{nil, nil}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
name: "opt-bool-sticky-changing-over-time", |
|
|
|
|
steps: []step{ |
|
|
|
|
{nil, nil}, |
|
|
|
|
{nil, nil}, |
|
|
|
|
{ |
|
|
|
|
&tailcfg.Debug{OneCGNATRoute: "true"}, |
|
|
|
|
&tailcfg.Debug{OneCGNATRoute: "true"}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
nil, |
|
|
|
|
&tailcfg.Debug{OneCGNATRoute: "true"}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
&tailcfg.Debug{OneCGNATRoute: "false"}, |
|
|
|
|
&tailcfg.Debug{OneCGNATRoute: "false"}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
nil, |
|
|
|
|
&tailcfg.Debug{OneCGNATRoute: "false"}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
for _, tt := range tests { |
|
|
|
|
t.Run(tt.name, func(t *testing.T) { |
|
|
|
|
ms := newTestMapSession(t) |
|
|
|
|
for stepi, s := range tt.steps { |
|
|
|
|
nm := ms.netmapForResponse(&tailcfg.MapResponse{Debug: s.got}) |
|
|
|
|
if !reflect.DeepEqual(nm.Debug, s.want) { |
|
|
|
|
t.Errorf("unexpected result at step index %v; got: %s", stepi, must.Get(json.Marshal(nm.Debug))) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Verifies that copyDebugOptBools doesn't missing any opt.Bools.
|
|
|
|
|
func TestCopyDebugOptBools(t *testing.T) { |
|
|
|
|
rt := reflect.TypeOf(tailcfg.Debug{}) |
|
|
|
|
for i := 0; i < rt.NumField(); i++ { |
|
|
|
|
sf := rt.Field(i) |
|
|
|
|
if sf.Type != reflect.TypeOf(opt.Bool("")) { |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
var src, dst tailcfg.Debug |
|
|
|
|
reflect.ValueOf(&src).Elem().Field(i).Set(reflect.ValueOf(opt.Bool("true"))) |
|
|
|
|
if src == (tailcfg.Debug{}) { |
|
|
|
|
t.Fatalf("failed to set field %v", sf.Name) |
|
|
|
|
} |
|
|
|
|
copyDebugOptBools(&dst, &src) |
|
|
|
|
if src != dst { |
|
|
|
|
t.Fatalf("copyDebugOptBools didn't copy field %v", sf.Name) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestDeltaDERPMap(t *testing.T) { |
|
|
|
|
regions1 := map[int]*tailcfg.DERPRegion{ |
|
|
|
|
1: { |
|
|
|
|
|