github.com/christopherobin/docker@v1.6.2/integration-cli/docker_cli_save_load_unix_test.go (about)

     1  // +build !windows
     2  
     3  package main
     4  
     5  import (
     6  	"bytes"
     7  	"fmt"
     8  	"os"
     9  	"os/exec"
    10  	"testing"
    11  
    12  	"github.com/docker/docker/vendor/src/github.com/kr/pty"
    13  )
    14  
    15  // save a repo and try to load it using stdout
    16  func TestSaveAndLoadRepoStdout(t *testing.T) {
    17  	runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true")
    18  	out, _, err := runCommandWithOutput(runCmd)
    19  	if err != nil {
    20  		t.Fatalf("failed to create a container: %s, %v", out, err)
    21  	}
    22  
    23  	cleanedContainerID := stripTrailingCharacters(out)
    24  
    25  	repoName := "foobar-save-load-test"
    26  
    27  	inspectCmd := exec.Command(dockerBinary, "inspect", cleanedContainerID)
    28  	if out, _, err = runCommandWithOutput(inspectCmd); err != nil {
    29  		t.Fatalf("output should've been a container id: %s, %v", out, err)
    30  	}
    31  
    32  	commitCmd := exec.Command(dockerBinary, "commit", cleanedContainerID, repoName)
    33  	if out, _, err = runCommandWithOutput(commitCmd); err != nil {
    34  		t.Fatalf("failed to commit container: %s, %v", out, err)
    35  	}
    36  
    37  	inspectCmd = exec.Command(dockerBinary, "inspect", repoName)
    38  	before, _, err := runCommandWithOutput(inspectCmd)
    39  	if err != nil {
    40  		t.Fatalf("the repo should exist before saving it: %s, %v", before, err)
    41  	}
    42  
    43  	saveCmdTemplate := `%v save %v > /tmp/foobar-save-load-test.tar`
    44  	saveCmdFinal := fmt.Sprintf(saveCmdTemplate, dockerBinary, repoName)
    45  	saveCmd := exec.Command("bash", "-c", saveCmdFinal)
    46  	if out, _, err = runCommandWithOutput(saveCmd); err != nil {
    47  		t.Fatalf("failed to save repo: %s, %v", out, err)
    48  	}
    49  
    50  	deleteImages(repoName)
    51  
    52  	loadCmdFinal := `cat /tmp/foobar-save-load-test.tar | docker load`
    53  	loadCmd := exec.Command("bash", "-c", loadCmdFinal)
    54  	if out, _, err = runCommandWithOutput(loadCmd); err != nil {
    55  		t.Fatalf("failed to load repo: %s, %v", out, err)
    56  	}
    57  
    58  	inspectCmd = exec.Command(dockerBinary, "inspect", repoName)
    59  	after, _, err := runCommandWithOutput(inspectCmd)
    60  	if err != nil {
    61  		t.Fatalf("the repo should exist after loading it: %s %v", after, err)
    62  	}
    63  
    64  	if before != after {
    65  		t.Fatalf("inspect is not the same after a save / load")
    66  	}
    67  
    68  	deleteContainer(cleanedContainerID)
    69  	deleteImages(repoName)
    70  
    71  	os.Remove("/tmp/foobar-save-load-test.tar")
    72  
    73  	logDone("save - save/load a repo using stdout")
    74  
    75  	pty, tty, err := pty.Open()
    76  	if err != nil {
    77  		t.Fatalf("Could not open pty: %v", err)
    78  	}
    79  	cmd := exec.Command(dockerBinary, "save", repoName)
    80  	cmd.Stdin = tty
    81  	cmd.Stdout = tty
    82  	cmd.Stderr = tty
    83  	if err := cmd.Start(); err != nil {
    84  		t.Fatalf("start err: %v", err)
    85  	}
    86  	if err := cmd.Wait(); err == nil {
    87  		t.Fatal("did not break writing to a TTY")
    88  	}
    89  
    90  	buf := make([]byte, 1024)
    91  
    92  	n, err := pty.Read(buf)
    93  	if err != nil {
    94  		t.Fatal("could not read tty output")
    95  	}
    96  
    97  	if !bytes.Contains(buf[:n], []byte("Cowardly refusing")) {
    98  		t.Fatal("help output is not being yielded", out)
    99  	}
   100  
   101  	logDone("save - do not save to a tty")
   102  }