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  }