github.com/yuanlv/docker@v1.8.1/integration-cli/docker_cli_save_load_unix_test.go (about)

     1  // +build !windows
     2  
     3  package main
     4  
     5  import (
     6  	"bytes"
     7  	"io/ioutil"
     8  	"os"
     9  	"os/exec"
    10  
    11  	"github.com/go-check/check"
    12  	"github.com/kr/pty"
    13  )
    14  
    15  // save a repo and try to load it using stdout
    16  func (s *DockerSuite) TestSaveAndLoadRepoStdout(c *check.C) {
    17  	name := "test-save-and-load-repo-stdout"
    18  	dockerCmd(c, "run", "--name", name, "busybox", "true")
    19  
    20  	repoName := "foobar-save-load-test"
    21  	out, _ := dockerCmd(c, "commit", name, repoName)
    22  
    23  	before, _ := dockerCmd(c, "inspect", repoName)
    24  
    25  	tmpFile, err := ioutil.TempFile("", "foobar-save-load-test.tar")
    26  	c.Assert(err, check.IsNil)
    27  	defer os.Remove(tmpFile.Name())
    28  
    29  	saveCmd := exec.Command(dockerBinary, "save", repoName)
    30  	saveCmd.Stdout = tmpFile
    31  
    32  	if _, err = runCommand(saveCmd); err != nil {
    33  		c.Fatalf("failed to save repo: %v", err)
    34  	}
    35  
    36  	tmpFile, err = os.Open(tmpFile.Name())
    37  	c.Assert(err, check.IsNil)
    38  
    39  	deleteImages(repoName)
    40  
    41  	loadCmd := exec.Command(dockerBinary, "load")
    42  	loadCmd.Stdin = tmpFile
    43  
    44  	if out, _, err = runCommandWithOutput(loadCmd); err != nil {
    45  		c.Fatalf("failed to load repo: %s, %v", out, err)
    46  	}
    47  
    48  	after, _ := dockerCmd(c, "inspect", repoName)
    49  
    50  	if before != after {
    51  		c.Fatalf("inspect is not the same after a save / load")
    52  	}
    53  
    54  	deleteImages(repoName)
    55  
    56  	pty, tty, err := pty.Open()
    57  	if err != nil {
    58  		c.Fatalf("Could not open pty: %v", err)
    59  	}
    60  	cmd := exec.Command(dockerBinary, "save", repoName)
    61  	cmd.Stdin = tty
    62  	cmd.Stdout = tty
    63  	cmd.Stderr = tty
    64  	if err := cmd.Start(); err != nil {
    65  		c.Fatalf("start err: %v", err)
    66  	}
    67  	if err := cmd.Wait(); err == nil {
    68  		c.Fatal("did not break writing to a TTY")
    69  	}
    70  
    71  	buf := make([]byte, 1024)
    72  
    73  	n, err := pty.Read(buf)
    74  	if err != nil {
    75  		c.Fatal("could not read tty output")
    76  	}
    77  
    78  	if !bytes.Contains(buf[:n], []byte("Cowardly refusing")) {
    79  		c.Fatal("help output is not being yielded", out)
    80  	}
    81  }