Ctrl K
ComunidadGuías…

cli/portforward_internal_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package cli

import (
	"testing"

	"github.com/stretchr/testify/require"
)

func Test_parsePortForwards(t *testing.T) {
	t.Parallel()

	type args struct {
		tcpSpecs []string
		udpSpecs []string
	}
	tests := []struct {
		name    string
		args    args
		want    []portForwardSpec
		wantErr bool
	}{
		{
			name: "TCP mixed ports and ranges",
			args: args{
				tcpSpecs: []string{
					"8000,8080:8081,9000-9002,9003-9004:9005-9006",
					"10000",
					"4444-4444",
				},
			},
			want: []portForwardSpec{
				{"tcp", noAddr, 8000, 8000},
				{"tcp", noAddr, 8080, 8081},
				{"tcp", noAddr, 9000, 9000},
				{"tcp", noAddr, 9001, 9001},
				{"tcp", noAddr, 9002, 9002},
				{"tcp", noAddr, 9003, 9005},
				{"tcp", noAddr, 9004, 9006},
				{"tcp", noAddr, 10000, 10000},
				{"tcp", noAddr, 4444, 4444},
			},
		},
		{
			name: "TCP IPv4 local",
			args: args{
				tcpSpecs: []string{"127.0.0.1:8080:8081"},
			},
			want: []portForwardSpec{
				{"tcp", ipv4Loopback, 8080, 8081},
			},
		},
		{
			name: "TCP IPv6 local",
			args: args{
				tcpSpecs: []string{"[::1]:8080:8081"},
			},
			want: []portForwardSpec{
				{"tcp", ipv6Loopback, 8080, 8081},
			},
		},
		{
			name: "UDP with port range",
			args: args{
				udpSpecs: []string{"8000,8080-8081"},
			},
			want: []portForwardSpec{
				{"udp", noAddr, 8000, 8000},
				{"udp", noAddr, 8080, 8080},
				{"udp", noAddr, 8081, 8081},
			},
		},
		{
			name: "UDP IPv4 local",
			args: args{
				udpSpecs: []string{"127.0.0.1:8080:8081"},
			},
			want: []portForwardSpec{
				{"udp", ipv4Loopback, 8080, 8081},
			},
		},
		{
			name: "UDP IPv6 local",
			args: args{
				udpSpecs: []string{"[::1]:8080:8081"},
			},
			want: []portForwardSpec{
				{"udp", ipv6Loopback, 8080, 8081},
			},
		},
		{
			name: "Bad port range",
			args: args{
				tcpSpecs: []string{"8000-7000"},
			},
			wantErr: true,
		},
		{
			name: "Bad dest port range",
			args: args{
				tcpSpecs: []string{"8080-8081:9080-9082"},
			},
			wantErr: true,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			t.Parallel()

			got, err := parsePortForwards(tt.args.tcpSpecs, tt.args.udpSpecs)
			if (err != nil) != tt.wantErr {
				t.Fatalf("parsePortForwards() error = %v, wantErr %v", err, tt.wantErr)
				return
			}
			require.Equal(t, tt.want, got)
		})
	}
}

func TestPortForwardUsageRequest(t *testing.T) {
	t.Parallel()

	for _, tc := range []struct {
		name string
		// steps runs before each request. Each entry is one reporting tick.
		steps []func(u *portForwardUsage, done *func())
		want  []bool
	}{
		{
			name:  "Idle",
			steps: []func(*portForwardUsage, *func()){nil, nil},
			want:  []bool{false, false},
		},
		{
			name: "OpenConnection",
			steps: []func(*portForwardUsage, *func()){
				func(u *portForwardUsage, done *func()) { *done = u.track() },
				nil,
			},
			want: []bool{true, true},
		},
		{
			name: "GoesIdleAfterClose",
			steps: []func(*portForwardUsage, *func()){
				func(u *portForwardUsage, done *func()) { *done = u.track() },
				nil,
				func(_ *portForwardUsage, done *func()) { (*done)() },
			},
			want: []bool{true, true, false},
		},
		{
			name: "OpenOnlyBetweenTicks",
			steps: []func(*portForwardUsage, *func()){
				func(u *portForwardUsage, _ *func()) { u.track()() },
				nil,
			},
			want: []bool{true, false},
		},
	} {
		t.Run(tc.name, func(t *testing.T) {
			t.Parallel()

			var (
				u    portForwardUsage
				done func()
			)
			for i, step := range tc.steps {
				if step != nil {
					step(&u, &done)
				}
				require.Equal(t, tc.want[i], u.inUse(), "tick %d", i)
			}
		})
	}
}