docker_cli_rmi_test.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package main
  2. import (
  3. "fmt"
  4. "os/exec"
  5. "strings"
  6. "testing"
  7. )
  8. func TestRmiWithContainerFails(t *testing.T) {
  9. errSubstr := "is using it"
  10. // create a container
  11. runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true")
  12. out, _, err := runCommandWithOutput(runCmd)
  13. errorOut(err, t, fmt.Sprintf("failed to create a container: %v %v", out, err))
  14. cleanedContainerID := stripTrailingCharacters(out)
  15. // try to delete the image
  16. runCmd = exec.Command(dockerBinary, "rmi", "busybox")
  17. out, _, err = runCommandWithOutput(runCmd)
  18. if err == nil {
  19. t.Fatalf("Container %q is using image, should not be able to rmi: %q", cleanedContainerID, out)
  20. }
  21. if !strings.Contains(out, errSubstr) {
  22. t.Fatalf("Container %q is using image, error message should contain %q: %v", cleanedContainerID, errSubstr, out)
  23. }
  24. // make sure it didn't delete the busybox name
  25. images, _, _ := cmd(t, "images")
  26. if !strings.Contains(images, "busybox") {
  27. t.Fatalf("The name 'busybox' should not have been removed from images: %q", images)
  28. }
  29. deleteContainer(cleanedContainerID)
  30. logDone("rmi- container using image while rmi, should not remove image name")
  31. }
  32. func TestRmiTag(t *testing.T) {
  33. imagesBefore, _, _ := cmd(t, "images", "-a")
  34. cmd(t, "tag", "busybox", "utest:tag1")
  35. cmd(t, "tag", "busybox", "utest/docker:tag2")
  36. cmd(t, "tag", "busybox", "utest:5000/docker:tag3")
  37. {
  38. imagesAfter, _, _ := cmd(t, "images", "-a")
  39. if nLines(imagesAfter) != nLines(imagesBefore)+3 {
  40. t.Fatalf("before: %q\n\nafter: %q\n", imagesBefore, imagesAfter)
  41. }
  42. }
  43. cmd(t, "rmi", "utest/docker:tag2")
  44. {
  45. imagesAfter, _, _ := cmd(t, "images", "-a")
  46. if nLines(imagesAfter) != nLines(imagesBefore)+2 {
  47. t.Fatalf("before: %q\n\nafter: %q\n", imagesBefore, imagesAfter)
  48. }
  49. }
  50. cmd(t, "rmi", "utest:5000/docker:tag3")
  51. {
  52. imagesAfter, _, _ := cmd(t, "images", "-a")
  53. if nLines(imagesAfter) != nLines(imagesBefore)+1 {
  54. t.Fatalf("before: %q\n\nafter: %q\n", imagesBefore, imagesAfter)
  55. }
  56. }
  57. cmd(t, "rmi", "utest:tag1")
  58. {
  59. imagesAfter, _, _ := cmd(t, "images", "-a")
  60. if nLines(imagesAfter) != nLines(imagesBefore)+0 {
  61. t.Fatalf("before: %q\n\nafter: %q\n", imagesBefore, imagesAfter)
  62. }
  63. }
  64. logDone("tag,rmi- tagging the same images multiple times then removing tags")
  65. }
  66. func TestRmiTagWithExistingContainers(t *testing.T) {
  67. container := "test-delete-tag"
  68. newtag := "busybox:newtag"
  69. bb := "busybox:latest"
  70. if out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "tag", bb, newtag)); err != nil {
  71. t.Fatalf("Could not tag busybox: %v: %s", err, out)
  72. }
  73. if out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "run", "--name", container, bb, "/bin/true")); err != nil {
  74. t.Fatalf("Could not run busybox: %v: %s", err, out)
  75. }
  76. out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "rmi", newtag))
  77. if err != nil {
  78. t.Fatalf("Could not remove tag %s: %v: %s", newtag, err, out)
  79. }
  80. if d := strings.Count(out, "Untagged: "); d != 1 {
  81. t.Fatalf("Expected 1 untagged entry got %d: %q", d, out)
  82. }
  83. deleteAllContainers()
  84. logDone("rmi - delete tag with existing containers")
  85. }