Multi network integration tests (#2464)
This commit is contained in:
parent
707438f25e
commit
603f3ad490
29 changed files with 2385 additions and 1449 deletions
|
@ -1,6 +1,13 @@
|
|||
package util
|
||||
|
||||
import "testing"
|
||||
import (
|
||||
"errors"
|
||||
"net/netip"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/google/go-cmp/cmp"
|
||||
)
|
||||
|
||||
func TestTailscaleVersionNewerOrEqual(t *testing.T) {
|
||||
type args struct {
|
||||
|
@ -178,3 +185,186 @@ Success.`,
|
|||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestParseTraceroute(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
input string
|
||||
want Traceroute
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "simple successful traceroute",
|
||||
input: `traceroute to 172.24.0.3 (172.24.0.3), 30 hops max, 46 byte packets
|
||||
1 ts-head-hk0urr.headscale.net (100.64.0.1) 1.135 ms 0.922 ms 0.619 ms
|
||||
2 172.24.0.3 (172.24.0.3) 0.593 ms 0.549 ms 0.522 ms`,
|
||||
want: Traceroute{
|
||||
Hostname: "172.24.0.3",
|
||||
IP: netip.MustParseAddr("172.24.0.3"),
|
||||
Route: []TraceroutePath{
|
||||
{
|
||||
Hop: 1,
|
||||
Hostname: "ts-head-hk0urr.headscale.net",
|
||||
IP: netip.MustParseAddr("100.64.0.1"),
|
||||
Latencies: []time.Duration{
|
||||
1135 * time.Microsecond,
|
||||
922 * time.Microsecond,
|
||||
619 * time.Microsecond,
|
||||
},
|
||||
},
|
||||
{
|
||||
Hop: 2,
|
||||
Hostname: "172.24.0.3",
|
||||
IP: netip.MustParseAddr("172.24.0.3"),
|
||||
Latencies: []time.Duration{
|
||||
593 * time.Microsecond,
|
||||
549 * time.Microsecond,
|
||||
522 * time.Microsecond,
|
||||
},
|
||||
},
|
||||
},
|
||||
Success: true,
|
||||
Err: nil,
|
||||
},
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "traceroute with timeouts",
|
||||
input: `traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
|
||||
1 router.local (192.168.1.1) 1.234 ms 1.123 ms 1.121 ms
|
||||
2 * * *
|
||||
3 isp-gateway.net (10.0.0.1) 15.678 ms 14.789 ms 15.432 ms
|
||||
4 8.8.8.8 (8.8.8.8) 20.123 ms 19.876 ms 20.345 ms`,
|
||||
want: Traceroute{
|
||||
Hostname: "8.8.8.8",
|
||||
IP: netip.MustParseAddr("8.8.8.8"),
|
||||
Route: []TraceroutePath{
|
||||
{
|
||||
Hop: 1,
|
||||
Hostname: "router.local",
|
||||
IP: netip.MustParseAddr("192.168.1.1"),
|
||||
Latencies: []time.Duration{
|
||||
1234 * time.Microsecond,
|
||||
1123 * time.Microsecond,
|
||||
1121 * time.Microsecond,
|
||||
},
|
||||
},
|
||||
{
|
||||
Hop: 2,
|
||||
Hostname: "*",
|
||||
},
|
||||
{
|
||||
Hop: 3,
|
||||
Hostname: "isp-gateway.net",
|
||||
IP: netip.MustParseAddr("10.0.0.1"),
|
||||
Latencies: []time.Duration{
|
||||
15678 * time.Microsecond,
|
||||
14789 * time.Microsecond,
|
||||
15432 * time.Microsecond,
|
||||
},
|
||||
},
|
||||
{
|
||||
Hop: 4,
|
||||
Hostname: "8.8.8.8",
|
||||
IP: netip.MustParseAddr("8.8.8.8"),
|
||||
Latencies: []time.Duration{
|
||||
20123 * time.Microsecond,
|
||||
19876 * time.Microsecond,
|
||||
20345 * time.Microsecond,
|
||||
},
|
||||
},
|
||||
},
|
||||
Success: true,
|
||||
Err: nil,
|
||||
},
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "unsuccessful traceroute",
|
||||
input: `traceroute to 10.0.0.99 (10.0.0.99), 5 hops max, 60 byte packets
|
||||
1 router.local (192.168.1.1) 1.234 ms 1.123 ms 1.121 ms
|
||||
2 * * *
|
||||
3 * * *
|
||||
4 * * *
|
||||
5 * * *`,
|
||||
want: Traceroute{
|
||||
Hostname: "10.0.0.99",
|
||||
IP: netip.MustParseAddr("10.0.0.99"),
|
||||
Route: []TraceroutePath{
|
||||
{
|
||||
Hop: 1,
|
||||
Hostname: "router.local",
|
||||
IP: netip.MustParseAddr("192.168.1.1"),
|
||||
Latencies: []time.Duration{
|
||||
1234 * time.Microsecond,
|
||||
1123 * time.Microsecond,
|
||||
1121 * time.Microsecond,
|
||||
},
|
||||
},
|
||||
{
|
||||
Hop: 2,
|
||||
Hostname: "*",
|
||||
},
|
||||
{
|
||||
Hop: 3,
|
||||
Hostname: "*",
|
||||
},
|
||||
{
|
||||
Hop: 4,
|
||||
Hostname: "*",
|
||||
},
|
||||
{
|
||||
Hop: 5,
|
||||
Hostname: "*",
|
||||
},
|
||||
},
|
||||
Success: false,
|
||||
Err: errors.New("traceroute did not reach target"),
|
||||
},
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "empty input",
|
||||
input: "",
|
||||
want: Traceroute{},
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "invalid header",
|
||||
input: "not a valid traceroute output",
|
||||
want: Traceroute{},
|
||||
wantErr: true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got, err := ParseTraceroute(tt.input)
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("ParseTraceroute() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
|
||||
if tt.wantErr {
|
||||
return
|
||||
}
|
||||
|
||||
// Special handling for error field since it can't be directly compared with cmp.Diff
|
||||
gotErr := got.Err
|
||||
wantErr := tt.want.Err
|
||||
got.Err = nil
|
||||
tt.want.Err = nil
|
||||
|
||||
if diff := cmp.Diff(tt.want, got, IPComparer); diff != "" {
|
||||
t.Errorf("ParseTraceroute() mismatch (-want +got):\n%s", diff)
|
||||
}
|
||||
|
||||
// Now check error field separately
|
||||
if (gotErr == nil) != (wantErr == nil) {
|
||||
t.Errorf("Error field: got %v, want %v", gotErr, wantErr)
|
||||
} else if gotErr != nil && wantErr != nil && gotErr.Error() != wantErr.Error() {
|
||||
t.Errorf("Error message: got %q, want %q", gotErr.Error(), wantErr.Error())
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue