docker_cli_save_load_unix_test.go 2.7 KB

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