github.com/darkowlzz/helm@v2.5.1-0.20171213183701-6707fe0468d4+incompatible/pkg/strvals/parser_test.go (about) 1 /* 2 Copyright 2016 The Kubernetes Authors All rights reserved. 3 Licensed under the Apache License, Version 2.0 (the "License"); 4 you may not use this file except in compliance with the License. 5 You may obtain a copy of the License at 6 7 http://www.apache.org/licenses/LICENSE-2.0 8 9 Unless required by applicable law or agreed to in writing, software 10 distributed under the License is distributed on an "AS IS" BASIS, 11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 See the License for the specific language governing permissions and 13 limitations under the License. 14 */ 15 16 package strvals 17 18 import ( 19 "testing" 20 21 "github.com/ghodss/yaml" 22 ) 23 24 func TestSetIndex(t *testing.T) { 25 tests := []struct { 26 name string 27 initial []interface{} 28 expect []interface{} 29 add int 30 val int 31 }{ 32 { 33 name: "short", 34 initial: []interface{}{0, 1}, 35 expect: []interface{}{0, 1, 2}, 36 add: 2, 37 val: 2, 38 }, 39 { 40 name: "equal", 41 initial: []interface{}{0, 1}, 42 expect: []interface{}{0, 2}, 43 add: 1, 44 val: 2, 45 }, 46 { 47 name: "long", 48 initial: []interface{}{0, 1, 2, 3, 4, 5}, 49 expect: []interface{}{0, 1, 2, 4, 4, 5}, 50 add: 3, 51 val: 4, 52 }, 53 } 54 55 for _, tt := range tests { 56 got := setIndex(tt.initial, tt.add, tt.val) 57 if len(got) != len(tt.expect) { 58 t.Fatalf("%s: Expected length %d, got %d", tt.name, len(tt.expect), len(got)) 59 } 60 61 if gg := got[tt.add].(int); gg != tt.val { 62 t.Errorf("%s, Expected value %d, got %d", tt.name, tt.val, gg) 63 } 64 } 65 } 66 67 func TestParseSet(t *testing.T) { 68 tests := []struct { 69 str string 70 expect map[string]interface{} 71 err bool 72 }{ 73 { 74 "name1=value1", 75 map[string]interface{}{"name1": "value1"}, 76 false, 77 }, 78 { 79 "name1=value1,name2=value2", 80 map[string]interface{}{"name1": "value1", "name2": "value2"}, 81 false, 82 }, 83 { 84 "name1=value1,name2=value2,", 85 map[string]interface{}{"name1": "value1", "name2": "value2"}, 86 false, 87 }, 88 { 89 str: "name1=value1,,,,name2=value2,", 90 err: true, 91 }, 92 { 93 str: "name1=,name2=value2", 94 expect: map[string]interface{}{"name1": "", "name2": "value2"}, 95 }, 96 { 97 str: "leading_zeros=00009", 98 expect: map[string]interface{}{"leading_zeros": "00009"}, 99 }, 100 { 101 str: "name1,name2=", 102 err: true, 103 }, 104 { 105 str: "name1,name2=value2", 106 err: true, 107 }, 108 { 109 str: "name1,name2=value2\\", 110 err: true, 111 }, 112 { 113 str: "name1,name2", 114 err: true, 115 }, 116 { 117 "name1=one\\,two,name2=three\\,four", 118 map[string]interface{}{"name1": "one,two", "name2": "three,four"}, 119 false, 120 }, 121 { 122 "name1=one\\=two,name2=three\\=four", 123 map[string]interface{}{"name1": "one=two", "name2": "three=four"}, 124 false, 125 }, 126 { 127 "name1=one two three,name2=three two one", 128 map[string]interface{}{"name1": "one two three", "name2": "three two one"}, 129 false, 130 }, 131 { 132 "outer.inner=value", 133 map[string]interface{}{"outer": map[string]interface{}{"inner": "value"}}, 134 false, 135 }, 136 { 137 "outer.middle.inner=value", 138 map[string]interface{}{"outer": map[string]interface{}{"middle": map[string]interface{}{"inner": "value"}}}, 139 false, 140 }, 141 { 142 "outer.inner1=value,outer.inner2=value2", 143 map[string]interface{}{"outer": map[string]interface{}{"inner1": "value", "inner2": "value2"}}, 144 false, 145 }, 146 { 147 "outer.inner1=value,outer.middle.inner=value", 148 map[string]interface{}{ 149 "outer": map[string]interface{}{ 150 "inner1": "value", 151 "middle": map[string]interface{}{ 152 "inner": "value", 153 }, 154 }, 155 }, 156 false, 157 }, 158 { 159 str: "name1.name2", 160 err: true, 161 }, 162 { 163 str: "name1.name2,name1.name3", 164 err: true, 165 }, 166 { 167 str: "name1.name2=", 168 expect: map[string]interface{}{"name1": map[string]interface{}{"name2": ""}}, 169 }, 170 { 171 str: "name1.=name2", 172 err: true, 173 }, 174 { 175 str: "name1.,name2", 176 err: true, 177 }, 178 { 179 "name1={value1,value2}", 180 map[string]interface{}{"name1": []string{"value1", "value2"}}, 181 false, 182 }, 183 { 184 "name1={value1,value2},name2={value1,value2}", 185 map[string]interface{}{ 186 "name1": []string{"value1", "value2"}, 187 "name2": []string{"value1", "value2"}, 188 }, 189 false, 190 }, 191 { 192 "name1={1021,902}", 193 map[string]interface{}{"name1": []int{1021, 902}}, 194 false, 195 }, 196 { 197 "name1.name2={value1,value2}", 198 map[string]interface{}{"name1": map[string]interface{}{"name2": []string{"value1", "value2"}}}, 199 false, 200 }, 201 { 202 str: "name1={1021,902", 203 err: true, 204 }, 205 // List support 206 { 207 str: "list[0]=foo", 208 expect: map[string]interface{}{"list": []string{"foo"}}, 209 }, 210 { 211 str: "list[0].foo=bar", 212 expect: map[string]interface{}{ 213 "list": []interface{}{ 214 map[string]interface{}{"foo": "bar"}, 215 }, 216 }, 217 }, 218 { 219 str: "list[0].foo=bar,list[0].hello=world", 220 expect: map[string]interface{}{ 221 "list": []interface{}{ 222 map[string]interface{}{"foo": "bar", "hello": "world"}, 223 }, 224 }, 225 }, 226 { 227 str: "list[0]=foo,list[1]=bar", 228 expect: map[string]interface{}{"list": []string{"foo", "bar"}}, 229 }, 230 { 231 str: "list[0]=foo,list[1]=bar,", 232 expect: map[string]interface{}{"list": []string{"foo", "bar"}}, 233 }, 234 { 235 str: "list[0]=foo,list[3]=bar", 236 expect: map[string]interface{}{"list": []interface{}{"foo", nil, nil, "bar"}}, 237 }, 238 { 239 str: "illegal[0]name.foo=bar", 240 err: true, 241 }, 242 { 243 str: "noval[0]", 244 expect: map[string]interface{}{"noval": []interface{}{}}, 245 }, 246 { 247 str: "noval[0]=", 248 expect: map[string]interface{}{"noval": []interface{}{""}}, 249 }, 250 { 251 str: "nested[0][0]=1", 252 expect: map[string]interface{}{"nested": []interface{}{[]interface{}{1}}}, 253 }, 254 { 255 str: "nested[1][1]=1", 256 expect: map[string]interface{}{"nested": []interface{}{nil, []interface{}{nil, 1}}}, 257 }, 258 } 259 260 for _, tt := range tests { 261 got, err := Parse(tt.str) 262 if err != nil { 263 if tt.err { 264 continue 265 } 266 t.Fatalf("%s: %s", tt.str, err) 267 } 268 if tt.err { 269 t.Errorf("%s: Expected error. Got nil", tt.str) 270 } 271 272 y1, err := yaml.Marshal(tt.expect) 273 if err != nil { 274 t.Fatal(err) 275 } 276 y2, err := yaml.Marshal(got) 277 if err != nil { 278 t.Fatalf("Error serializing parsed value: %s", err) 279 } 280 281 if string(y1) != string(y2) { 282 t.Errorf("%s: Expected:\n%s\nGot:\n%s", tt.str, y1, y2) 283 } 284 } 285 } 286 287 func TestParseInto(t *testing.T) { 288 got := map[string]interface{}{ 289 "outer": map[string]interface{}{ 290 "inner1": "overwrite", 291 "inner2": "value2", 292 }, 293 } 294 input := "outer.inner1=value1,outer.inner3=value3" 295 expect := map[string]interface{}{ 296 "outer": map[string]interface{}{ 297 "inner1": "value1", 298 "inner2": "value2", 299 "inner3": "value3", 300 }, 301 } 302 303 if err := ParseInto(input, got); err != nil { 304 t.Fatal(err) 305 } 306 307 y1, err := yaml.Marshal(expect) 308 if err != nil { 309 t.Fatal(err) 310 } 311 y2, err := yaml.Marshal(got) 312 if err != nil { 313 t.Fatalf("Error serializing parsed value: %s", err) 314 } 315 316 if string(y1) != string(y2) { 317 t.Errorf("%s: Expected:\n%s\nGot:\n%s", input, y1, y2) 318 } 319 } 320 321 func TestToYAML(t *testing.T) { 322 // The TestParse does the hard part. We just verify that YAML formatting is 323 // happening. 324 o, err := ToYAML("name=value") 325 if err != nil { 326 t.Fatal(err) 327 } 328 expect := "name: value\n" 329 if o != expect { 330 t.Errorf("Expected %q, got %q", expect, o) 331 } 332 }