|
|
|
|
@ -10,43 +10,10 @@ import ( |
|
|
|
|
"reflect" |
|
|
|
|
"strings" |
|
|
|
|
"testing" |
|
|
|
|
"time" |
|
|
|
|
|
|
|
|
|
"go4.org/mem" |
|
|
|
|
"inet.af/netaddr" |
|
|
|
|
"tailscale.com/types/structs" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
func TestContainsPointers(t *testing.T) { |
|
|
|
|
tests := []struct { |
|
|
|
|
name string |
|
|
|
|
in any |
|
|
|
|
want bool |
|
|
|
|
}{ |
|
|
|
|
{name: "string", in: "foo", want: false}, |
|
|
|
|
{name: "int", in: 42, want: false}, |
|
|
|
|
{name: "struct", in: struct{ string }{"foo"}, want: false}, |
|
|
|
|
{name: "mem.RO", in: mem.B([]byte{1}), want: false}, |
|
|
|
|
{name: "time.Time", in: time.Now(), want: false}, |
|
|
|
|
{name: "netaddr.IP", in: netaddr.MustParseIP("1.1.1.1"), want: false}, |
|
|
|
|
{name: "netaddr.IPPrefix", in: netaddr.MustParseIP("1.1.1.1"), want: false}, |
|
|
|
|
{name: "structs.Incomparable", in: structs.Incomparable{}, want: false}, |
|
|
|
|
|
|
|
|
|
{name: "*int", in: (*int)(nil), want: true}, |
|
|
|
|
{name: "*string", in: (*string)(nil), want: true}, |
|
|
|
|
{name: "struct-with-pointer", in: struct{ X *string }{}, want: true}, |
|
|
|
|
{name: "slice-with-pointer", in: []struct{ X *string }{}, want: true}, |
|
|
|
|
{name: "slice-of-struct", in: []struct{ string }{}, want: true}, |
|
|
|
|
} |
|
|
|
|
for _, tc := range tests { |
|
|
|
|
t.Run(tc.name, func(t *testing.T) { |
|
|
|
|
if containsMutable(reflect.TypeOf(tc.in)) != tc.want { |
|
|
|
|
t.Errorf("containsPointers %T; want %v", tc.in, tc.want) |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestViewsJSON(t *testing.T) { |
|
|
|
|
mustCIDR := func(cidrs ...string) (out []netaddr.IPPrefix) { |
|
|
|
|
for _, cidr := range cidrs { |
|
|
|
|
|