mirror of
https://github.com/kubernetes/client-go.git
synced 2025-10-22 14:32:43 +00:00
(https://github.com/kubernetes/test-infra/tree/master/mungegithub) copied from https://github.com/kubernetes/kubernetes.git, branch master, last commit is c09311fa32be02ebb79c7959447e3e4294cc12a3
195 lines
5.7 KiB
Go
195 lines
5.7 KiB
Go
/*
|
|
Copyright 2015 The Kubernetes Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package portforward
|
|
|
|
import (
|
|
"net"
|
|
"os"
|
|
"reflect"
|
|
"strings"
|
|
"testing"
|
|
|
|
"k8s.io/apimachinery/pkg/util/httpstream"
|
|
)
|
|
|
|
type fakeDialer struct {
|
|
dialed bool
|
|
conn httpstream.Connection
|
|
err error
|
|
negotiatedProtocol string
|
|
}
|
|
|
|
func (d *fakeDialer) Dial(protocols ...string) (httpstream.Connection, string, error) {
|
|
d.dialed = true
|
|
return d.conn, d.negotiatedProtocol, d.err
|
|
}
|
|
|
|
func TestParsePortsAndNew(t *testing.T) {
|
|
tests := []struct {
|
|
input []string
|
|
expected []ForwardedPort
|
|
expectParseError bool
|
|
expectNewError bool
|
|
}{
|
|
{input: []string{}, expectNewError: true},
|
|
{input: []string{"a"}, expectParseError: true, expectNewError: true},
|
|
{input: []string{":a"}, expectParseError: true, expectNewError: true},
|
|
{input: []string{"-1"}, expectParseError: true, expectNewError: true},
|
|
{input: []string{"65536"}, expectParseError: true, expectNewError: true},
|
|
{input: []string{"0"}, expectParseError: true, expectNewError: true},
|
|
{input: []string{"0:0"}, expectParseError: true, expectNewError: true},
|
|
{input: []string{"a:5000"}, expectParseError: true, expectNewError: true},
|
|
{input: []string{"5000:a"}, expectParseError: true, expectNewError: true},
|
|
{
|
|
input: []string{"5000", "5000:5000", "8888:5000", "5000:8888", ":5000", "0:5000"},
|
|
expected: []ForwardedPort{
|
|
{5000, 5000},
|
|
{5000, 5000},
|
|
{8888, 5000},
|
|
{5000, 8888},
|
|
{0, 5000},
|
|
{0, 5000},
|
|
},
|
|
},
|
|
}
|
|
|
|
for i, test := range tests {
|
|
parsed, err := parsePorts(test.input)
|
|
haveError := err != nil
|
|
if e, a := test.expectParseError, haveError; e != a {
|
|
t.Fatalf("%d: parsePorts: error expected=%t, got %t: %s", i, e, a, err)
|
|
}
|
|
|
|
dialer := &fakeDialer{}
|
|
expectedStopChan := make(chan struct{})
|
|
readyChan := make(chan struct{})
|
|
pf, err := New(dialer, test.input, expectedStopChan, readyChan, os.Stdout, os.Stderr)
|
|
haveError = err != nil
|
|
if e, a := test.expectNewError, haveError; e != a {
|
|
t.Fatalf("%d: New: error expected=%t, got %t: %s", i, e, a, err)
|
|
}
|
|
|
|
if test.expectParseError || test.expectNewError {
|
|
continue
|
|
}
|
|
|
|
for pi, expectedPort := range test.expected {
|
|
if e, a := expectedPort.Local, parsed[pi].Local; e != a {
|
|
t.Fatalf("%d: local expected: %d, got: %d", i, e, a)
|
|
}
|
|
if e, a := expectedPort.Remote, parsed[pi].Remote; e != a {
|
|
t.Fatalf("%d: remote expected: %d, got: %d", i, e, a)
|
|
}
|
|
}
|
|
|
|
if dialer.dialed {
|
|
t.Fatalf("%d: expected not dialed", i)
|
|
}
|
|
if e, a := test.expected, pf.ports; !reflect.DeepEqual(e, a) {
|
|
t.Fatalf("%d: ports: expected %#v, got %#v", i, e, a)
|
|
}
|
|
if e, a := expectedStopChan, pf.stopChan; e != a {
|
|
t.Fatalf("%d: stopChan: expected %#v, got %#v", i, e, a)
|
|
}
|
|
if pf.Ready == nil {
|
|
t.Fatalf("%d: Ready should be non-nil", i)
|
|
}
|
|
}
|
|
}
|
|
|
|
type GetListenerTestCase struct {
|
|
Hostname string
|
|
Protocol string
|
|
ShouldRaiseError bool
|
|
ExpectedListenerAddress string
|
|
}
|
|
|
|
func TestGetListener(t *testing.T) {
|
|
var pf PortForwarder
|
|
testCases := []GetListenerTestCase{
|
|
{
|
|
Hostname: "localhost",
|
|
Protocol: "tcp4",
|
|
ShouldRaiseError: false,
|
|
ExpectedListenerAddress: "127.0.0.1",
|
|
},
|
|
{
|
|
Hostname: "127.0.0.1",
|
|
Protocol: "tcp4",
|
|
ShouldRaiseError: false,
|
|
ExpectedListenerAddress: "127.0.0.1",
|
|
},
|
|
{
|
|
Hostname: "[::1]",
|
|
Protocol: "tcp6",
|
|
ShouldRaiseError: false,
|
|
ExpectedListenerAddress: "::1",
|
|
},
|
|
{
|
|
Hostname: "[::1]",
|
|
Protocol: "tcp4",
|
|
ShouldRaiseError: true,
|
|
},
|
|
{
|
|
Hostname: "127.0.0.1",
|
|
Protocol: "tcp6",
|
|
ShouldRaiseError: true,
|
|
},
|
|
{
|
|
// IPv6 address must be put into brackets. This test reveals this.
|
|
Hostname: "::1",
|
|
Protocol: "tcp6",
|
|
ShouldRaiseError: true,
|
|
},
|
|
}
|
|
|
|
for i, testCase := range testCases {
|
|
expectedListenerPort := "12345"
|
|
listener, err := pf.getListener(testCase.Protocol, testCase.Hostname, &ForwardedPort{12345, 12345})
|
|
if err != nil && strings.Contains(err.Error(), "cannot assign requested address") {
|
|
t.Logf("Can't test #%d: %v", i, err)
|
|
continue
|
|
}
|
|
errorRaised := err != nil
|
|
|
|
if testCase.ShouldRaiseError != errorRaised {
|
|
t.Errorf("Test case #%d failed: Data %v an error has been raised(%t) where it should not (or reciprocally): %v", i, testCase, testCase.ShouldRaiseError, err)
|
|
continue
|
|
}
|
|
if errorRaised {
|
|
continue
|
|
}
|
|
|
|
if listener == nil {
|
|
t.Errorf("Test case #%d did not raise an error but failed in initializing listener", i)
|
|
continue
|
|
}
|
|
|
|
host, port, _ := net.SplitHostPort(listener.Addr().String())
|
|
t.Logf("Asked a %s forward for: %s:%v, got listener %s:%s, expected: %s", testCase.Protocol, testCase.Hostname, 12345, host, port, expectedListenerPort)
|
|
if host != testCase.ExpectedListenerAddress {
|
|
t.Errorf("Test case #%d failed: Listener does not listen on exepected address: asked %v got %v", i, testCase.ExpectedListenerAddress, host)
|
|
}
|
|
if port != expectedListenerPort {
|
|
t.Errorf("Test case #%d failed: Listener does not listen on exepected port: asked %v got %v", i, expectedListenerPort, port)
|
|
|
|
}
|
|
listener.Close()
|
|
|
|
}
|
|
}
|