save_test.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package image
  2. import (
  3. "bytes"
  4. "io"
  5. "io/ioutil"
  6. "os"
  7. "strings"
  8. "testing"
  9. "github.com/docker/docker/cli/internal/test"
  10. "github.com/docker/docker/pkg/testutil"
  11. "github.com/pkg/errors"
  12. "github.com/stretchr/testify/assert"
  13. "github.com/stretchr/testify/require"
  14. )
  15. func TestNewSaveCommandErrors(t *testing.T) {
  16. testCases := []struct {
  17. name string
  18. args []string
  19. isTerminal bool
  20. expectedError string
  21. imageSaveFunc func(images []string) (io.ReadCloser, error)
  22. }{
  23. {
  24. name: "wrong args",
  25. args: []string{},
  26. expectedError: "requires at least 1 argument(s).",
  27. },
  28. {
  29. name: "output to terminal",
  30. args: []string{"output", "file", "arg1"},
  31. isTerminal: true,
  32. expectedError: "Cowardly refusing to save to a terminal. Use the -o flag or redirect.",
  33. },
  34. {
  35. name: "ImageSave fail",
  36. args: []string{"arg1"},
  37. isTerminal: false,
  38. expectedError: "error saving image",
  39. imageSaveFunc: func(images []string) (io.ReadCloser, error) {
  40. return ioutil.NopCloser(strings.NewReader("")), errors.Errorf("error saving image")
  41. },
  42. },
  43. }
  44. for _, tc := range testCases {
  45. cli := test.NewFakeCli(&fakeClient{imageSaveFunc: tc.imageSaveFunc}, new(bytes.Buffer))
  46. cli.Out().SetIsTerminal(tc.isTerminal)
  47. cmd := NewSaveCommand(cli)
  48. cmd.SetOutput(ioutil.Discard)
  49. cmd.SetArgs(tc.args)
  50. testutil.ErrorContains(t, cmd.Execute(), tc.expectedError)
  51. }
  52. }
  53. func TestNewSaveCommandSuccess(t *testing.T) {
  54. testCases := []struct {
  55. args []string
  56. isTerminal bool
  57. imageSaveFunc func(images []string) (io.ReadCloser, error)
  58. deferredFunc func()
  59. }{
  60. {
  61. args: []string{"-o", "save_tmp_file", "arg1"},
  62. isTerminal: true,
  63. imageSaveFunc: func(images []string) (io.ReadCloser, error) {
  64. require.Len(t, images, 1)
  65. assert.Equal(t, "arg1", images[0])
  66. return ioutil.NopCloser(strings.NewReader("")), nil
  67. },
  68. deferredFunc: func() {
  69. os.Remove("save_tmp_file")
  70. },
  71. },
  72. {
  73. args: []string{"arg1", "arg2"},
  74. isTerminal: false,
  75. imageSaveFunc: func(images []string) (io.ReadCloser, error) {
  76. require.Len(t, images, 2)
  77. assert.Equal(t, "arg1", images[0])
  78. assert.Equal(t, "arg2", images[1])
  79. return ioutil.NopCloser(strings.NewReader("")), nil
  80. },
  81. },
  82. }
  83. for _, tc := range testCases {
  84. cmd := NewSaveCommand(test.NewFakeCli(&fakeClient{
  85. imageSaveFunc: func(images []string) (io.ReadCloser, error) {
  86. return ioutil.NopCloser(strings.NewReader("")), nil
  87. },
  88. }, new(bytes.Buffer)))
  89. cmd.SetOutput(ioutil.Discard)
  90. cmd.SetArgs(tc.args)
  91. assert.NoError(t, cmd.Execute())
  92. if tc.deferredFunc != nil {
  93. tc.deferredFunc()
  94. }
  95. }
  96. }