Fixes an issue with hosts having an IPv6 address on localhost
- When 'getent hosts localhost' returns '::1' the creation of the listener fails because of the port parsing which uses ":" as a separator - Use of net.SplitHostPort() to do the job - Adding unit tests to ensure that the creation succeeds - On docker.go: adds a test on the presence the socat command which was failing silenty if not installed - Code Review 1 - Fixed typo on Expected - The UT now fails if the PortForwarder could not be created - Code Review 2 - Simplify socat error message - Changing t.Fatal to to.Error on unit tests - Code Review 3 - Removing useless uses cases in unit tests - Code Review 4 - Removing useless initiliasiation of PortForwarder - Changing error message - Code Review 5 - Simplifying TestCast struct - Adding addition test in one test case - Closing the listener - Code Review 6 - Improving unit test
This commit is contained in:
@@ -209,14 +209,16 @@ func (s *fakeUpgradeStream) Headers() http.Header {
|
|||||||
return http.Header{}
|
return http.Header{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type TestCase struct {
|
||||||
|
Hostname string
|
||||||
|
Protocol string
|
||||||
|
ShouldRaiseError bool
|
||||||
|
ExpectedListenerAddress string
|
||||||
|
}
|
||||||
|
|
||||||
func TestGetListener(t *testing.T) {
|
func TestGetListener(t *testing.T) {
|
||||||
var pf PortForwarder
|
var pf PortForwarder
|
||||||
testCases := []struct {
|
testCases := []TestCase{
|
||||||
Hostname string
|
|
||||||
Protocol string
|
|
||||||
ShouldRaiseError bool
|
|
||||||
ExpectedListenerAddress string
|
|
||||||
}{
|
|
||||||
{
|
{
|
||||||
Hostname: "localhost",
|
Hostname: "localhost",
|
||||||
Protocol: "tcp4",
|
Protocol: "tcp4",
|
||||||
@@ -235,12 +237,6 @@ func TestGetListener(t *testing.T) {
|
|||||||
ShouldRaiseError: false,
|
ShouldRaiseError: false,
|
||||||
ExpectedListenerAddress: "::1",
|
ExpectedListenerAddress: "::1",
|
||||||
},
|
},
|
||||||
{
|
|
||||||
Hostname: "localhost",
|
|
||||||
Protocol: "tcp6",
|
|
||||||
ShouldRaiseError: false,
|
|
||||||
ExpectedListenerAddress: "::1",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
Hostname: "[::1]",
|
Hostname: "[::1]",
|
||||||
Protocol: "tcp4",
|
Protocol: "tcp4",
|
||||||
@@ -253,6 +249,20 @@ func TestGetListener(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// On some linux systems, ::1 does not resolve to localhost but to localhost6 or
|
||||||
|
// ip6-localhost. To make the test case portable, we need to do a reverse lookup on ::1 and
|
||||||
|
// trying to bind a port with the name.
|
||||||
|
names, err := net.LookupAddr("::1")
|
||||||
|
if err == nil && len(names) > 0 {
|
||||||
|
ipv6TestCase := TestCase{
|
||||||
|
Hostname: names[0],
|
||||||
|
Protocol: "tcp6",
|
||||||
|
ShouldRaiseError: false,
|
||||||
|
ExpectedListenerAddress: "::1",
|
||||||
|
}
|
||||||
|
testCases = append(testCases, ipv6TestCase)
|
||||||
|
}
|
||||||
|
|
||||||
for i, testCase := range testCases {
|
for i, testCase := range testCases {
|
||||||
expectedListenerPort := "12345"
|
expectedListenerPort := "12345"
|
||||||
listener, err := pf.getListener(testCase.Protocol, testCase.Hostname, &ForwardedPort{12345, 12345})
|
listener, err := pf.getListener(testCase.Protocol, testCase.Hostname, &ForwardedPort{12345, 12345})
|
||||||
|
Reference in New Issue
Block a user