github.com/rita33cool1/iot-system-gateway@v0.0.0-20200911033302-e65bde238cc5/docker-engine/integration/container/nat_test.go (about) 1 package container 2 3 import ( 4 "bytes" 5 "context" 6 "fmt" 7 "io" 8 "io/ioutil" 9 "net" 10 "strings" 11 "testing" 12 "time" 13 14 "github.com/docker/docker/api/types" 15 "github.com/docker/docker/integration/internal/container" 16 "github.com/docker/docker/integration/internal/request" 17 "github.com/docker/go-connections/nat" 18 "github.com/gotestyourself/gotestyourself/assert" 19 is "github.com/gotestyourself/gotestyourself/assert/cmp" 20 "github.com/gotestyourself/gotestyourself/poll" 21 "github.com/gotestyourself/gotestyourself/skip" 22 ) 23 24 func TestNetworkNat(t *testing.T) { 25 skip.If(t, testEnv.IsRemoteDaemon()) 26 27 defer setupTest(t)() 28 29 msg := "it works" 30 startServerContainer(t, msg, 8080) 31 32 endpoint := getExternalAddress(t) 33 conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", endpoint.String(), 8080)) 34 assert.NilError(t, err) 35 defer conn.Close() 36 37 data, err := ioutil.ReadAll(conn) 38 assert.NilError(t, err) 39 assert.Check(t, is.Equal(msg, strings.TrimSpace(string(data)))) 40 } 41 42 func TestNetworkLocalhostTCPNat(t *testing.T) { 43 skip.If(t, testEnv.IsRemoteDaemon()) 44 45 defer setupTest(t)() 46 47 msg := "hi yall" 48 startServerContainer(t, msg, 8081) 49 50 conn, err := net.Dial("tcp", "localhost:8081") 51 assert.NilError(t, err) 52 defer conn.Close() 53 54 data, err := ioutil.ReadAll(conn) 55 assert.NilError(t, err) 56 assert.Check(t, is.Equal(msg, strings.TrimSpace(string(data)))) 57 } 58 59 func TestNetworkLoopbackNat(t *testing.T) { 60 skip.If(t, testEnv.IsRemoteDaemon()) 61 62 msg := "it works" 63 startServerContainer(t, msg, 8080) 64 65 endpoint := getExternalAddress(t) 66 67 client := request.NewAPIClient(t) 68 ctx := context.Background() 69 70 cID := container.Run(t, ctx, client, container.WithCmd("sh", "-c", fmt.Sprintf("stty raw && nc -w 5 %s 8080", endpoint.String())), container.WithTty(true), container.WithNetworkMode("container:server")) 71 72 poll.WaitOn(t, container.IsStopped(ctx, client, cID), poll.WithDelay(100*time.Millisecond)) 73 74 body, err := client.ContainerLogs(ctx, cID, types.ContainerLogsOptions{ 75 ShowStdout: true, 76 }) 77 assert.NilError(t, err) 78 defer body.Close() 79 80 var b bytes.Buffer 81 _, err = io.Copy(&b, body) 82 assert.NilError(t, err) 83 84 assert.Check(t, is.Equal(msg, strings.TrimSpace(b.String()))) 85 } 86 87 func startServerContainer(t *testing.T, msg string, port int) string { 88 client := request.NewAPIClient(t) 89 ctx := context.Background() 90 91 cID := container.Run(t, ctx, client, container.WithName("server"), container.WithCmd("sh", "-c", fmt.Sprintf("echo %q | nc -lp %d", msg, port)), container.WithExposedPorts(fmt.Sprintf("%d/tcp", port)), func(c *container.TestContainerConfig) { 92 c.HostConfig.PortBindings = nat.PortMap{ 93 nat.Port(fmt.Sprintf("%d/tcp", port)): []nat.PortBinding{ 94 { 95 HostPort: fmt.Sprintf("%d", port), 96 }, 97 }, 98 } 99 }) 100 101 poll.WaitOn(t, container.IsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond)) 102 103 return cID 104 } 105 106 func getExternalAddress(t *testing.T) net.IP { 107 iface, err := net.InterfaceByName("eth0") 108 skip.If(t, err != nil, "Test not running with `make test-integration`. Interface eth0 not found: %s", err) 109 110 ifaceAddrs, err := iface.Addrs() 111 assert.NilError(t, err) 112 assert.Check(t, 0 != len(ifaceAddrs)) 113 114 ifaceIP, _, err := net.ParseCIDR(ifaceAddrs[0].String()) 115 assert.NilError(t, err) 116 117 return ifaceIP 118 }