mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
104 lines
2.7 KiB
Go
104 lines
2.7 KiB
Go
package bridge
|
|
|
|
import (
|
|
"net"
|
|
"strconv"
|
|
"testing"
|
|
|
|
"github.com/docker/docker/daemon/networkdriver/portmapper"
|
|
"github.com/docker/docker/engine"
|
|
)
|
|
|
|
func init() {
|
|
// reset the new proxy command for mocking out the userland proxy in tests
|
|
portmapper.NewProxy = portmapper.NewMockProxyCommand
|
|
}
|
|
|
|
func findFreePort(t *testing.T) int {
|
|
l, err := net.Listen("tcp", ":0")
|
|
if err != nil {
|
|
t.Fatal("Failed to find a free port")
|
|
}
|
|
defer l.Close()
|
|
|
|
result, err := net.ResolveTCPAddr("tcp", l.Addr().String())
|
|
if err != nil {
|
|
t.Fatal("Failed to resolve address to identify free port")
|
|
}
|
|
return result.Port
|
|
}
|
|
|
|
func newPortAllocationJob(eng *engine.Engine, port int) (job *engine.Job) {
|
|
strPort := strconv.Itoa(port)
|
|
|
|
job = eng.Job("allocate_port", "container_id")
|
|
job.Setenv("HostIP", "127.0.0.1")
|
|
job.Setenv("HostPort", strPort)
|
|
job.Setenv("Proto", "tcp")
|
|
job.Setenv("ContainerPort", strPort)
|
|
return
|
|
}
|
|
|
|
func newPortAllocationJobWithInvalidHostIP(eng *engine.Engine, port int) (job *engine.Job) {
|
|
strPort := strconv.Itoa(port)
|
|
|
|
job = eng.Job("allocate_port", "container_id")
|
|
job.Setenv("HostIP", "localhost")
|
|
job.Setenv("HostPort", strPort)
|
|
job.Setenv("Proto", "tcp")
|
|
job.Setenv("ContainerPort", strPort)
|
|
return
|
|
}
|
|
|
|
func TestAllocatePortDetection(t *testing.T) {
|
|
eng := engine.New()
|
|
eng.Logging = false
|
|
|
|
freePort := findFreePort(t)
|
|
|
|
// Init driver
|
|
job := eng.Job("initdriver")
|
|
if res := InitDriver(job); res != engine.StatusOK {
|
|
t.Fatal("Failed to initialize network driver")
|
|
}
|
|
|
|
// Allocate interface
|
|
job = eng.Job("allocate_interface", "container_id")
|
|
if res := Allocate(job); res != engine.StatusOK {
|
|
t.Fatal("Failed to allocate network interface")
|
|
}
|
|
|
|
// Allocate same port twice, expect failure on second call
|
|
job = newPortAllocationJob(eng, freePort)
|
|
if res := AllocatePort(job); res != engine.StatusOK {
|
|
t.Fatal("Failed to find a free port to allocate")
|
|
}
|
|
if res := AllocatePort(job); res == engine.StatusOK {
|
|
t.Fatal("Duplicate port allocation granted by AllocatePort")
|
|
}
|
|
}
|
|
|
|
func TestHostnameFormatChecking(t *testing.T) {
|
|
eng := engine.New()
|
|
eng.Logging = false
|
|
|
|
freePort := findFreePort(t)
|
|
|
|
// Init driver
|
|
job := eng.Job("initdriver")
|
|
if res := InitDriver(job); res != engine.StatusOK {
|
|
t.Fatal("Failed to initialize network driver")
|
|
}
|
|
|
|
// Allocate interface
|
|
job = eng.Job("allocate_interface", "container_id")
|
|
if res := Allocate(job); res != engine.StatusOK {
|
|
t.Fatal("Failed to allocate network interface")
|
|
}
|
|
|
|
// Allocate port with invalid HostIP, expect failure with Bad Request http status
|
|
job = newPortAllocationJobWithInvalidHostIP(eng, freePort)
|
|
if res := AllocatePort(job); res == engine.StatusOK {
|
|
t.Fatal("Failed to check invalid HostIP")
|
|
}
|
|
}
|