Skip to content

Commit ae73900

Browse files
committed
Add test coverage for build-arg parsing
Allows seperator to appear in the value i.e. "k=val=10" Signed-off-by: Alex Ellis (VMware) <[email protected]>
1 parent da53731 commit ae73900

File tree

2 files changed

+74
-9
lines changed

2 files changed

+74
-9
lines changed

commands/build.go

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -79,26 +79,40 @@ via flags.`,
7979
func preRunBuild(cmd *cobra.Command, args []string) error {
8080
language, _ = validateLanguageFlag(language)
8181

82-
buildArgMap = make(map[string]string)
82+
mapped, err := parseBuildArgs(buildArgs)
8383

84-
for _, kvp := range buildArgs {
85-
values := strings.Split(kvp, "=")
86-
if len(values) != 2 {
87-
return fmt.Errorf("each build-arg must take the form key=value")
84+
if err == nil {
85+
buildArgMap = mapped
86+
}
87+
88+
return err
89+
}
90+
91+
func parseBuildArgs(args []string) (map[string]string, error) {
92+
mapped := make(map[string]string)
93+
94+
for _, kvp := range args {
95+
index := strings.Index(kvp, "=")
96+
if index == -1 {
97+
return nil, fmt.Errorf("each build-arg must take the form key=value")
8898
}
99+
100+
values := []string{kvp[0:index], kvp[index+1:]}
101+
89102
k := strings.TrimSpace(values[0])
90103
v := strings.TrimSpace(values[1])
104+
91105
if len(k) == 0 {
92-
return fmt.Errorf("build-arg must have a non-empty key")
106+
return nil, fmt.Errorf("build-arg must have a non-empty key")
93107
}
94108
if len(v) == 0 {
95-
return fmt.Errorf("build-arg must have a non-empty value")
109+
return nil, fmt.Errorf("build-arg must have a non-empty value")
96110
}
97111

98-
buildArgMap[k] = v
112+
mapped[k] = v
99113
}
100114

101-
return nil
115+
return mapped, nil
102116
}
103117

104118
func runBuild(cmd *cobra.Command, args []string) error {

commands/build_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,54 @@ func Test_build(t *testing.T) {
2323
}
2424
}
2525
}
26+
27+
func Test_parseBuildArgs_ValidParts(t *testing.T) {
28+
mapped, err := parseBuildArgs([]string{"k=v"})
29+
30+
if err != nil {
31+
t.Errorf("err was supposed to be nil but was: %s", err.Error())
32+
t.Fail()
33+
}
34+
35+
if mapped["k"] != "v" {
36+
t.Errorf("value for 'k', want: %s got: %s", "v", mapped["k"])
37+
t.Fail()
38+
}
39+
}
40+
41+
func Test_parseBuildArgs_NoSeparator(t *testing.T) {
42+
_, err := parseBuildArgs([]string{"kv"})
43+
44+
want := "each build-arg must take the form key=value"
45+
if err != nil && err.Error() != want {
46+
t.Errorf("Expected an error due to missing seperator")
47+
t.Fail()
48+
}
49+
}
50+
51+
func Test_parseBuildArgs_EmptyKey(t *testing.T) {
52+
_, err := parseBuildArgs([]string{"=v"})
53+
54+
want := "build-arg must have a non-empty key"
55+
if err == nil {
56+
t.Errorf("Expected an error due to missing key")
57+
t.Fail()
58+
} else if err.Error() != want {
59+
t.Errorf("missing key error want: %s, got: %s", want, err.Error())
60+
t.Fail()
61+
}
62+
}
63+
64+
func Test_parseBuildArgs_MultipleSeparators(t *testing.T) {
65+
mapped, err := parseBuildArgs([]string{"k=v=z"})
66+
67+
if err != nil {
68+
t.Errorf("Expected second separator to be included in value")
69+
t.Fail()
70+
}
71+
72+
if mapped["k"] != "v=z" {
73+
t.Errorf("value for 'k', want: %s got: %s", "v=z", mapped["k"])
74+
t.Fail()
75+
}
76+
}

0 commit comments

Comments
 (0)