integration-cli/docker_api_containers_windows_test.go
54354db8
 // +build windows
 
 package main
 
 import (
7d62e40f
 	"context"
54354db8
 	"fmt"
 	"io/ioutil"
 	"math/rand"
 	"strings"
e25352a4
 	"testing"
54354db8
 
 	winio "github.com/Microsoft/go-winio"
0a91ba2d
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/api/types/mount"
38457285
 	"gotest.tools/assert"
 	is "gotest.tools/assert/cmp"
54354db8
 )
 
64a928a3
 func (s *DockerSuite) TestContainersAPICreateMountsBindNamedPipe(c *testing.T) {
43b15e92
 	testRequires(c, testEnv.IsLocalDaemon, DaemonIsWindowsAtLeastBuild(16299)) // Named pipe support was added in RS3
54354db8
 
 	// Create a host pipe to map into the container
 	hostPipeName := fmt.Sprintf(`\\.\pipe\docker-cli-test-pipe-%x`, rand.Uint64())
 	pc := &winio.PipeConfig{
 		SecurityDescriptor: "D:P(A;;GA;;;AU)", // Allow all users access to the pipe
 	}
 	l, err := winio.ListenPipe(hostPipeName, pc)
 	if err != nil {
 		c.Fatal(err)
 	}
 	defer l.Close()
 
 	// Asynchronously read data that the container writes to the mapped pipe.
 	var b []byte
 	ch := make(chan error)
 	go func() {
 		conn, err := l.Accept()
 		if err == nil {
 			b, err = ioutil.ReadAll(conn)
 			conn.Close()
 		}
 		ch <- err
 	}()
 
 	containerPipeName := `\\.\pipe\docker-cli-test-pipe`
 	text := "hello from a pipe"
 	cmd := fmt.Sprintf("echo %s > %s", text, containerPipeName)
 	name := "test-bind-npipe"
 
0a91ba2d
 	ctx := context.Background()
 	client := testEnv.APIClient()
 	_, err = client.ContainerCreate(ctx,
 		&container.Config{
 			Image: testEnv.PlatformDefaults.BaseImage,
 			Cmd:   []string{"cmd", "/c", cmd},
 		}, &container.HostConfig{
 			Mounts: []mount.Mount{
 				{
 					Type:   "npipe",
 					Source: hostPipeName,
 					Target: containerPipeName,
 				},
 			},
 		},
 		nil, name)
6be0f709
 	assert.NilError(c, err)
54354db8
 
0a91ba2d
 	err = client.ContainerStart(ctx, name, types.ContainerStartOptions{})
6be0f709
 	assert.NilError(c, err)
54354db8
 
 	err = <-ch
6be0f709
 	assert.NilError(c, err)
 	assert.Check(c, is.Equal(text, strings.TrimSpace(string(b))))
54354db8
 }