mirror of
https://github.com/tailscale/tailscale.git
synced 2025-05-11 01:56:58 +00:00
util/deephash: move tests that depend on other tailscale packages to deephash_test
This is done to prevent import cycles in tests. Fixes #15923 Signed-off-by: Nick Khyl <nickk@tailscale.com>
This commit is contained in:
parent
165b99278b
commit
cb6fc37d66
@ -23,18 +23,11 @@ import (
|
|||||||
"go4.org/mem"
|
"go4.org/mem"
|
||||||
"go4.org/netipx"
|
"go4.org/netipx"
|
||||||
"tailscale.com/tailcfg"
|
"tailscale.com/tailcfg"
|
||||||
"tailscale.com/types/dnstype"
|
|
||||||
"tailscale.com/types/ipproto"
|
|
||||||
"tailscale.com/types/key"
|
"tailscale.com/types/key"
|
||||||
"tailscale.com/types/ptr"
|
"tailscale.com/types/ptr"
|
||||||
"tailscale.com/types/views"
|
|
||||||
"tailscale.com/util/deephash/testtype"
|
"tailscale.com/util/deephash/testtype"
|
||||||
"tailscale.com/util/dnsname"
|
|
||||||
"tailscale.com/util/hashx"
|
"tailscale.com/util/hashx"
|
||||||
"tailscale.com/version"
|
"tailscale.com/version"
|
||||||
"tailscale.com/wgengine/filter"
|
|
||||||
"tailscale.com/wgengine/router"
|
|
||||||
"tailscale.com/wgengine/wgcfg"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type appendBytes []byte
|
type appendBytes []byte
|
||||||
@ -197,21 +190,6 @@ func TestHash(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDeepHash(t *testing.T) {
|
|
||||||
// v contains the types of values we care about for our current callers.
|
|
||||||
// Mostly we're just testing that we don't panic on handled types.
|
|
||||||
v := getVal()
|
|
||||||
hash1 := Hash(v)
|
|
||||||
t.Logf("hash: %v", hash1)
|
|
||||||
for range 20 {
|
|
||||||
v := getVal()
|
|
||||||
hash2 := Hash(v)
|
|
||||||
if hash1 != hash2 {
|
|
||||||
t.Error("second hash didn't match")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests that we actually hash map elements. Whoops.
|
// Tests that we actually hash map elements. Whoops.
|
||||||
func TestIssue4868(t *testing.T) {
|
func TestIssue4868(t *testing.T) {
|
||||||
m1 := map[int]string{1: "foo"}
|
m1 := map[int]string{1: "foo"}
|
||||||
@ -255,110 +233,6 @@ func TestQuick(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type tailscaleTypes struct {
|
|
||||||
WGConfig *wgcfg.Config
|
|
||||||
RouterConfig *router.Config
|
|
||||||
MapFQDNAddrs map[dnsname.FQDN][]netip.Addr
|
|
||||||
MapFQDNAddrPorts map[dnsname.FQDN][]netip.AddrPort
|
|
||||||
MapDiscoPublics map[key.DiscoPublic]bool
|
|
||||||
MapResponse *tailcfg.MapResponse
|
|
||||||
FilterMatch filter.Match
|
|
||||||
}
|
|
||||||
|
|
||||||
func getVal() *tailscaleTypes {
|
|
||||||
return &tailscaleTypes{
|
|
||||||
&wgcfg.Config{
|
|
||||||
Name: "foo",
|
|
||||||
Addresses: []netip.Prefix{netip.PrefixFrom(netip.AddrFrom16([16]byte{3: 3}).Unmap(), 5)},
|
|
||||||
Peers: []wgcfg.Peer{
|
|
||||||
{
|
|
||||||
PublicKey: key.NodePublic{},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
&router.Config{
|
|
||||||
Routes: []netip.Prefix{
|
|
||||||
netip.MustParsePrefix("1.2.3.0/24"),
|
|
||||||
netip.MustParsePrefix("1234::/64"),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
map[dnsname.FQDN][]netip.Addr{
|
|
||||||
dnsname.FQDN("a."): {netip.MustParseAddr("1.2.3.4"), netip.MustParseAddr("4.3.2.1")},
|
|
||||||
dnsname.FQDN("b."): {netip.MustParseAddr("8.8.8.8"), netip.MustParseAddr("9.9.9.9")},
|
|
||||||
dnsname.FQDN("c."): {netip.MustParseAddr("6.6.6.6"), netip.MustParseAddr("7.7.7.7")},
|
|
||||||
dnsname.FQDN("d."): {netip.MustParseAddr("6.7.6.6"), netip.MustParseAddr("7.7.7.8")},
|
|
||||||
dnsname.FQDN("e."): {netip.MustParseAddr("6.8.6.6"), netip.MustParseAddr("7.7.7.9")},
|
|
||||||
dnsname.FQDN("f."): {netip.MustParseAddr("6.9.6.6"), netip.MustParseAddr("7.7.7.0")},
|
|
||||||
},
|
|
||||||
map[dnsname.FQDN][]netip.AddrPort{
|
|
||||||
dnsname.FQDN("a."): {netip.MustParseAddrPort("1.2.3.4:11"), netip.MustParseAddrPort("4.3.2.1:22")},
|
|
||||||
dnsname.FQDN("b."): {netip.MustParseAddrPort("8.8.8.8:11"), netip.MustParseAddrPort("9.9.9.9:22")},
|
|
||||||
dnsname.FQDN("c."): {netip.MustParseAddrPort("8.8.8.8:12"), netip.MustParseAddrPort("9.9.9.9:23")},
|
|
||||||
dnsname.FQDN("d."): {netip.MustParseAddrPort("8.8.8.8:13"), netip.MustParseAddrPort("9.9.9.9:24")},
|
|
||||||
dnsname.FQDN("e."): {netip.MustParseAddrPort("8.8.8.8:14"), netip.MustParseAddrPort("9.9.9.9:25")},
|
|
||||||
},
|
|
||||||
map[key.DiscoPublic]bool{
|
|
||||||
key.DiscoPublicFromRaw32(mem.B([]byte{1: 1, 31: 0})): true,
|
|
||||||
key.DiscoPublicFromRaw32(mem.B([]byte{1: 2, 31: 0})): false,
|
|
||||||
key.DiscoPublicFromRaw32(mem.B([]byte{1: 3, 31: 0})): true,
|
|
||||||
key.DiscoPublicFromRaw32(mem.B([]byte{1: 4, 31: 0})): false,
|
|
||||||
},
|
|
||||||
&tailcfg.MapResponse{
|
|
||||||
DERPMap: &tailcfg.DERPMap{
|
|
||||||
Regions: map[int]*tailcfg.DERPRegion{
|
|
||||||
1: {
|
|
||||||
RegionID: 1,
|
|
||||||
RegionCode: "foo",
|
|
||||||
Nodes: []*tailcfg.DERPNode{
|
|
||||||
{
|
|
||||||
Name: "n1",
|
|
||||||
RegionID: 1,
|
|
||||||
HostName: "foo.com",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Name: "n2",
|
|
||||||
RegionID: 1,
|
|
||||||
HostName: "bar.com",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
DNSConfig: &tailcfg.DNSConfig{
|
|
||||||
Resolvers: []*dnstype.Resolver{
|
|
||||||
{Addr: "10.0.0.1"},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
PacketFilter: []tailcfg.FilterRule{
|
|
||||||
{
|
|
||||||
SrcIPs: []string{"1.2.3.4"},
|
|
||||||
DstPorts: []tailcfg.NetPortRange{
|
|
||||||
{
|
|
||||||
IP: "1.2.3.4/32",
|
|
||||||
Ports: tailcfg.PortRange{First: 1, Last: 2},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Peers: []*tailcfg.Node{
|
|
||||||
{
|
|
||||||
ID: 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ID: 2,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
UserProfiles: []tailcfg.UserProfile{
|
|
||||||
{ID: 1, LoginName: "foo@bar.com"},
|
|
||||||
{ID: 2, LoginName: "bar@foo.com"},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
filter.Match{
|
|
||||||
IPProto: views.SliceOf([]ipproto.Proto{1, 2, 3}),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type IntThenByte struct {
|
type IntThenByte struct {
|
||||||
_ int
|
_ int
|
||||||
_ byte
|
_ byte
|
||||||
@ -758,14 +632,6 @@ func TestInterfaceCycle(t *testing.T) {
|
|||||||
|
|
||||||
var sink Sum
|
var sink Sum
|
||||||
|
|
||||||
func BenchmarkHash(b *testing.B) {
|
|
||||||
b.ReportAllocs()
|
|
||||||
v := getVal()
|
|
||||||
for range b.N {
|
|
||||||
sink = Hash(v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// filterRules is a packet filter that has both everything populated (in its
|
// filterRules is a packet filter that has both everything populated (in its
|
||||||
// first element) and also a few entries that are the typical shape for regular
|
// first element) and also a few entries that are the typical shape for regular
|
||||||
// packet filters as sent to clients.
|
// packet filters as sent to clients.
|
||||||
@ -1072,16 +938,6 @@ func FuzzAddr(f *testing.F) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAppendTo(t *testing.T) {
|
|
||||||
v := getVal()
|
|
||||||
h := Hash(v)
|
|
||||||
sum := h.AppendTo(nil)
|
|
||||||
|
|
||||||
if s := h.String(); s != string(sum) {
|
|
||||||
t.Errorf("hash sum mismatch; h.String()=%q h.AppendTo()=%q", s, string(sum))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestFilterFields(t *testing.T) {
|
func TestFilterFields(t *testing.T) {
|
||||||
type T struct {
|
type T struct {
|
||||||
A int
|
A int
|
||||||
@ -1126,15 +982,3 @@ func TestFilterFields(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkAppendTo(b *testing.B) {
|
|
||||||
b.ReportAllocs()
|
|
||||||
v := getVal()
|
|
||||||
h := Hash(v)
|
|
||||||
|
|
||||||
hashBuf := make([]byte, 0, 100)
|
|
||||||
b.ResetTimer()
|
|
||||||
for range b.N {
|
|
||||||
hashBuf = h.AppendTo(hashBuf[:0])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
177
util/deephash/tailscale_types_test.go
Normal file
177
util/deephash/tailscale_types_test.go
Normal file
@ -0,0 +1,177 @@
|
|||||||
|
// Copyright (c) Tailscale Inc & AUTHORS
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
// This file contains tests and benchmarks that use types from other packages
|
||||||
|
// in the Tailscale codebase. Unlike other deephash tests, these are in the _test
|
||||||
|
// package to avoid circular dependencies.
|
||||||
|
|
||||||
|
package deephash_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/netip"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"go4.org/mem"
|
||||||
|
"tailscale.com/tailcfg"
|
||||||
|
"tailscale.com/types/dnstype"
|
||||||
|
"tailscale.com/types/ipproto"
|
||||||
|
"tailscale.com/types/key"
|
||||||
|
"tailscale.com/types/views"
|
||||||
|
"tailscale.com/util/dnsname"
|
||||||
|
"tailscale.com/wgengine/filter"
|
||||||
|
"tailscale.com/wgengine/router"
|
||||||
|
"tailscale.com/wgengine/wgcfg"
|
||||||
|
|
||||||
|
. "tailscale.com/util/deephash"
|
||||||
|
)
|
||||||
|
|
||||||
|
var sink Sum
|
||||||
|
|
||||||
|
func BenchmarkHash(b *testing.B) {
|
||||||
|
b.ReportAllocs()
|
||||||
|
v := getVal()
|
||||||
|
for range b.N {
|
||||||
|
sink = Hash(v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkAppendTo(b *testing.B) {
|
||||||
|
b.ReportAllocs()
|
||||||
|
v := getVal()
|
||||||
|
h := Hash(v)
|
||||||
|
|
||||||
|
hashBuf := make([]byte, 0, 100)
|
||||||
|
b.ResetTimer()
|
||||||
|
for range b.N {
|
||||||
|
hashBuf = h.AppendTo(hashBuf[:0])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDeepHash(t *testing.T) {
|
||||||
|
// v contains the types of values we care about for our current callers.
|
||||||
|
// Mostly we're just testing that we don't panic on handled types.
|
||||||
|
v := getVal()
|
||||||
|
hash1 := Hash(v)
|
||||||
|
t.Logf("hash: %v", hash1)
|
||||||
|
for range 20 {
|
||||||
|
v := getVal()
|
||||||
|
hash2 := Hash(v)
|
||||||
|
if hash1 != hash2 {
|
||||||
|
t.Error("second hash didn't match")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppendTo(t *testing.T) {
|
||||||
|
v := getVal()
|
||||||
|
h := Hash(v)
|
||||||
|
sum := h.AppendTo(nil)
|
||||||
|
|
||||||
|
if s := h.String(); s != string(sum) {
|
||||||
|
t.Errorf("hash sum mismatch; h.String()=%q h.AppendTo()=%q", s, string(sum))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type tailscaleTypes struct {
|
||||||
|
WGConfig *wgcfg.Config
|
||||||
|
RouterConfig *router.Config
|
||||||
|
MapFQDNAddrs map[dnsname.FQDN][]netip.Addr
|
||||||
|
MapFQDNAddrPorts map[dnsname.FQDN][]netip.AddrPort
|
||||||
|
MapDiscoPublics map[key.DiscoPublic]bool
|
||||||
|
MapResponse *tailcfg.MapResponse
|
||||||
|
FilterMatch filter.Match
|
||||||
|
}
|
||||||
|
|
||||||
|
func getVal() *tailscaleTypes {
|
||||||
|
return &tailscaleTypes{
|
||||||
|
&wgcfg.Config{
|
||||||
|
Name: "foo",
|
||||||
|
Addresses: []netip.Prefix{netip.PrefixFrom(netip.AddrFrom16([16]byte{3: 3}).Unmap(), 5)},
|
||||||
|
Peers: []wgcfg.Peer{
|
||||||
|
{
|
||||||
|
PublicKey: key.NodePublic{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
&router.Config{
|
||||||
|
Routes: []netip.Prefix{
|
||||||
|
netip.MustParsePrefix("1.2.3.0/24"),
|
||||||
|
netip.MustParsePrefix("1234::/64"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
map[dnsname.FQDN][]netip.Addr{
|
||||||
|
dnsname.FQDN("a."): {netip.MustParseAddr("1.2.3.4"), netip.MustParseAddr("4.3.2.1")},
|
||||||
|
dnsname.FQDN("b."): {netip.MustParseAddr("8.8.8.8"), netip.MustParseAddr("9.9.9.9")},
|
||||||
|
dnsname.FQDN("c."): {netip.MustParseAddr("6.6.6.6"), netip.MustParseAddr("7.7.7.7")},
|
||||||
|
dnsname.FQDN("d."): {netip.MustParseAddr("6.7.6.6"), netip.MustParseAddr("7.7.7.8")},
|
||||||
|
dnsname.FQDN("e."): {netip.MustParseAddr("6.8.6.6"), netip.MustParseAddr("7.7.7.9")},
|
||||||
|
dnsname.FQDN("f."): {netip.MustParseAddr("6.9.6.6"), netip.MustParseAddr("7.7.7.0")},
|
||||||
|
},
|
||||||
|
map[dnsname.FQDN][]netip.AddrPort{
|
||||||
|
dnsname.FQDN("a."): {netip.MustParseAddrPort("1.2.3.4:11"), netip.MustParseAddrPort("4.3.2.1:22")},
|
||||||
|
dnsname.FQDN("b."): {netip.MustParseAddrPort("8.8.8.8:11"), netip.MustParseAddrPort("9.9.9.9:22")},
|
||||||
|
dnsname.FQDN("c."): {netip.MustParseAddrPort("8.8.8.8:12"), netip.MustParseAddrPort("9.9.9.9:23")},
|
||||||
|
dnsname.FQDN("d."): {netip.MustParseAddrPort("8.8.8.8:13"), netip.MustParseAddrPort("9.9.9.9:24")},
|
||||||
|
dnsname.FQDN("e."): {netip.MustParseAddrPort("8.8.8.8:14"), netip.MustParseAddrPort("9.9.9.9:25")},
|
||||||
|
},
|
||||||
|
map[key.DiscoPublic]bool{
|
||||||
|
key.DiscoPublicFromRaw32(mem.B([]byte{1: 1, 31: 0})): true,
|
||||||
|
key.DiscoPublicFromRaw32(mem.B([]byte{1: 2, 31: 0})): false,
|
||||||
|
key.DiscoPublicFromRaw32(mem.B([]byte{1: 3, 31: 0})): true,
|
||||||
|
key.DiscoPublicFromRaw32(mem.B([]byte{1: 4, 31: 0})): false,
|
||||||
|
},
|
||||||
|
&tailcfg.MapResponse{
|
||||||
|
DERPMap: &tailcfg.DERPMap{
|
||||||
|
Regions: map[int]*tailcfg.DERPRegion{
|
||||||
|
1: {
|
||||||
|
RegionID: 1,
|
||||||
|
RegionCode: "foo",
|
||||||
|
Nodes: []*tailcfg.DERPNode{
|
||||||
|
{
|
||||||
|
Name: "n1",
|
||||||
|
RegionID: 1,
|
||||||
|
HostName: "foo.com",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "n2",
|
||||||
|
RegionID: 1,
|
||||||
|
HostName: "bar.com",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
DNSConfig: &tailcfg.DNSConfig{
|
||||||
|
Resolvers: []*dnstype.Resolver{
|
||||||
|
{Addr: "10.0.0.1"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
PacketFilter: []tailcfg.FilterRule{
|
||||||
|
{
|
||||||
|
SrcIPs: []string{"1.2.3.4"},
|
||||||
|
DstPorts: []tailcfg.NetPortRange{
|
||||||
|
{
|
||||||
|
IP: "1.2.3.4/32",
|
||||||
|
Ports: tailcfg.PortRange{First: 1, Last: 2},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Peers: []*tailcfg.Node{
|
||||||
|
{
|
||||||
|
ID: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: 2,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
UserProfiles: []tailcfg.UserProfile{
|
||||||
|
{ID: 1, LoginName: "foo@bar.com"},
|
||||||
|
{ID: 2, LoginName: "bar@foo.com"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
filter.Match{
|
||||||
|
IPProto: views.SliceOf([]ipproto.Proto{1, 2, 3}),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user