Browse code

More helpful error message when not sufficiently argumentative

The error message suggests you need one argument even when you
have provided one. Suggest having another argument.

Signed-off-by: Justin Cormack <justin.cormack@docker.com>

Justin Cormack authored on 2016/08/08 23:08:55
Showing 3 changed files
... ...
@@ -155,7 +155,7 @@ func label(b *Builder, args []string, attributes map[string]bool, original strin
155 155
 //
156 156
 func add(b *Builder, args []string, attributes map[string]bool, original string) error {
157 157
 	if len(args) < 2 {
158
-		return errAtLeastOneArgument("ADD")
158
+		return errAtLeastTwoArguments("ADD")
159 159
 	}
160 160
 
161 161
 	if err := b.flags.Parse(); err != nil {
... ...
@@ -171,7 +171,7 @@ func add(b *Builder, args []string, attributes map[string]bool, original string)
171 171
 //
172 172
 func dispatchCopy(b *Builder, args []string, attributes map[string]bool, original string) error {
173 173
 	if len(args) < 2 {
174
-		return errAtLeastOneArgument("COPY")
174
+		return errAtLeastTwoArguments("COPY")
175 175
 	}
176 176
 
177 177
 	if err := b.flags.Parse(); err != nil {
... ...
@@ -760,6 +760,10 @@ func errExactlyOneArgument(command string) error {
760 760
 	return fmt.Errorf("%s requires exactly one argument", command)
761 761
 }
762 762
 
763
+func errAtLeastTwoArguments(command string) error {
764
+	return fmt.Errorf("%s requires at least two arguments", command)
765
+}
766
+
763 767
 func errTooManyArguments(command string) error {
764 768
 	return fmt.Errorf("Bad input to %s, too many arguments", command)
765 769
 }
... ...
@@ -43,8 +43,6 @@ func TestCommandsAtLeastOneArgument(t *testing.T) {
43 43
 	commands := []commandWithFunction{
44 44
 		{"ENV", func(args []string) error { return env(nil, args, nil, "") }},
45 45
 		{"LABEL", func(args []string) error { return label(nil, args, nil, "") }},
46
-		{"ADD", func(args []string) error { return add(nil, args, nil, "") }},
47
-		{"COPY", func(args []string) error { return dispatchCopy(nil, args, nil, "") }},
48 46
 		{"ONBUILD", func(args []string) error { return onbuild(nil, args, nil, "") }},
49 47
 		{"EXPOSE", func(args []string) error { return expose(nil, args, nil, "") }},
50 48
 		{"VOLUME", func(args []string) error { return volume(nil, args, nil, "") }}}
... ...
@@ -64,6 +62,26 @@ func TestCommandsAtLeastOneArgument(t *testing.T) {
64 64
 	}
65 65
 }
66 66
 
67
+func TestCommandsAtLeastTwoArguments(t *testing.T) {
68
+	commands := []commandWithFunction{
69
+		{"ADD", func(args []string) error { return add(nil, args, nil, "") }},
70
+		{"COPY", func(args []string) error { return dispatchCopy(nil, args, nil, "") }}}
71
+
72
+	for _, command := range commands {
73
+		err := command.function([]string{"arg1"})
74
+
75
+		if err == nil {
76
+			t.Fatalf("Error should be present for %s command", command.name)
77
+		}
78
+
79
+		expectedError := fmt.Sprintf("%s requires at least two arguments", command.name)
80
+
81
+		if err.Error() != expectedError {
82
+			t.Fatalf("Wrong error message for %s. Got: %s. Should be: %s", command.name, err.Error(), expectedError)
83
+		}
84
+	}
85
+}
86
+
67 87
 func TestCommandsTooManyArguments(t *testing.T) {
68 88
 	commands := []commandWithFunction{
69 89
 		{"ENV", func(args []string) error { return env(nil, args, nil, "") }},
... ...
@@ -28,7 +28,7 @@ func initDispatchTestCases() []dispatchTestCase {
28 28
 		dockerfile: `COPY
29 29
 	quux \
30 30
       bar`,
31
-		expectedError: "COPY requires at least one argument",
31
+		expectedError: "COPY requires at least two arguments",
32 32
 	},
33 33
 		{
34 34
 			name:          "ONBUILD forbidden FROM",