github.com/kruglovmax/helm@v3.0.0-beta.3+incompatible/pkg/chart/loader/load_test.go (about) 1 /* 2 Copyright The Helm Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package loader 18 19 import ( 20 "bytes" 21 "testing" 22 23 "helm.sh/helm/pkg/chart" 24 ) 25 26 func TestLoadDir(t *testing.T) { 27 l, err := Loader("testdata/frobnitz") 28 if err != nil { 29 t.Fatalf("Failed to load testdata: %s", err) 30 } 31 c, err := l.Load() 32 if err != nil { 33 t.Fatalf("Failed to load testdata: %s", err) 34 } 35 verifyFrobnitz(t, c) 36 verifyChart(t, c) 37 verifyDependencies(t, c) 38 verifyDependenciesLock(t, c) 39 } 40 41 func TestLoadV1(t *testing.T) { 42 l, err := Loader("testdata/frobnitz.v1") 43 if err != nil { 44 t.Fatalf("Failed to load testdata: %s", err) 45 } 46 c, err := l.Load() 47 if err != nil { 48 t.Fatalf("Failed to load testdata: %s", err) 49 } 50 verifyDependencies(t, c) 51 verifyDependenciesLock(t, c) 52 } 53 54 func TestLoadFile(t *testing.T) { 55 l, err := Loader("testdata/frobnitz-1.2.3.tgz") 56 if err != nil { 57 t.Fatalf("Failed to load testdata: %s", err) 58 } 59 c, err := l.Load() 60 if err != nil { 61 t.Fatalf("Failed to load testdata: %s", err) 62 } 63 verifyFrobnitz(t, c) 64 verifyChart(t, c) 65 verifyDependencies(t, c) 66 } 67 68 func TestLoadFiles(t *testing.T) { 69 goodFiles := []*BufferedFile{ 70 { 71 Name: "Chart.yaml", 72 Data: []byte(`apiVersion: v1 73 name: frobnitz 74 description: This is a frobnitz. 75 version: "1.2.3" 76 keywords: 77 - frobnitz 78 - sprocket 79 - dodad 80 maintainers: 81 - name: The Helm Team 82 email: helm@example.com 83 - name: Someone Else 84 email: nobody@example.com 85 sources: 86 - https://example.com/foo/bar 87 home: http://example.com 88 icon: https://example.com/64x64.png 89 `), 90 }, 91 { 92 Name: "values.yaml", 93 Data: []byte("var: some values"), 94 }, 95 { 96 Name: "values.schema.json", 97 Data: []byte("type: Values"), 98 }, 99 { 100 Name: "templates/deployment.yaml", 101 Data: []byte("some deployment"), 102 }, 103 { 104 Name: "templates/service.yaml", 105 Data: []byte("some service"), 106 }, 107 } 108 109 c, err := LoadFiles(goodFiles) 110 if err != nil { 111 t.Errorf("Expected good files to be loaded, got %v", err) 112 } 113 114 if c.Name() != "frobnitz" { 115 t.Errorf("Expected chart name to be 'frobnitz', got %s", c.Name()) 116 } 117 118 if c.Values["var"] != "some values" { 119 t.Error("Expected chart values to be populated with default values") 120 } 121 122 if !bytes.Equal(c.Schema, []byte("type: Values")) { 123 t.Error("Expected chart schema to be populated with default values") 124 } 125 126 if len(c.Templates) != 2 { 127 t.Errorf("Expected number of templates == 2, got %d", len(c.Templates)) 128 } 129 130 if _, err = LoadFiles([]*BufferedFile{}); err == nil { 131 t.Fatal("Expected err to be non-nil") 132 } 133 if err.Error() != "validation: chart.metadata is required" { 134 t.Errorf("Expected chart metadata missing error, got '%s'", err.Error()) 135 } 136 } 137 138 // Packaging the chart on a Windows machine will produce an 139 // archive that has \\ as delimiters. Test that we support these archives 140 func TestLoadFileBackslash(t *testing.T) { 141 c, err := Load("testdata/frobnitz_backslash-1.2.3.tgz") 142 if err != nil { 143 t.Fatalf("Failed to load testdata: %s", err) 144 } 145 verifyChartFileAndTemplate(t, c, "frobnitz_backslash") 146 verifyChart(t, c) 147 verifyDependencies(t, c) 148 } 149 150 func TestLoadV2WithReqs(t *testing.T) { 151 l, err := Loader("testdata/frobnitz.v2.reqs") 152 if err != nil { 153 t.Fatalf("Failed to load testdata: %s", err) 154 } 155 c, err := l.Load() 156 if err != nil { 157 t.Fatalf("Failed to load testdata: %s", err) 158 } 159 verifyDependencies(t, c) 160 verifyDependenciesLock(t, c) 161 } 162 163 func verifyChart(t *testing.T, c *chart.Chart) { 164 t.Helper() 165 if c.Name() == "" { 166 t.Fatalf("No chart metadata found on %v", c) 167 } 168 t.Logf("Verifying chart %s", c.Name()) 169 if len(c.Templates) != 1 { 170 t.Errorf("Expected 1 template, got %d", len(c.Templates)) 171 } 172 173 numfiles := 6 174 if len(c.Files) != numfiles { 175 t.Errorf("Expected %d extra files, got %d", numfiles, len(c.Files)) 176 for _, n := range c.Files { 177 t.Logf("\t%s", n.Name) 178 } 179 } 180 181 if len(c.Dependencies()) != 2 { 182 t.Errorf("Expected 2 dependencies, got %d (%v)", len(c.Dependencies()), c.Dependencies()) 183 for _, d := range c.Dependencies() { 184 t.Logf("\tSubchart: %s\n", d.Name()) 185 } 186 } 187 188 expect := map[string]map[string]string{ 189 "alpine": { 190 "version": "0.1.0", 191 }, 192 "mariner": { 193 "version": "4.3.2", 194 }, 195 } 196 197 for _, dep := range c.Dependencies() { 198 if dep.Metadata == nil { 199 t.Fatalf("expected metadata on dependency: %v", dep) 200 } 201 exp, ok := expect[dep.Name()] 202 if !ok { 203 t.Fatalf("Unknown dependency %s", dep.Name()) 204 } 205 if exp["version"] != dep.Metadata.Version { 206 t.Errorf("Expected %s version %s, got %s", dep.Name(), exp["version"], dep.Metadata.Version) 207 } 208 } 209 210 } 211 212 func verifyDependencies(t *testing.T, c *chart.Chart) { 213 if len(c.Metadata.Dependencies) != 2 { 214 t.Errorf("Expected 2 dependencies, got %d", len(c.Metadata.Dependencies)) 215 } 216 tests := []*chart.Dependency{ 217 {Name: "alpine", Version: "0.1.0", Repository: "https://example.com/charts"}, 218 {Name: "mariner", Version: "4.3.2", Repository: "https://example.com/charts"}, 219 } 220 for i, tt := range tests { 221 d := c.Metadata.Dependencies[i] 222 if d.Name != tt.Name { 223 t.Errorf("Expected dependency named %q, got %q", tt.Name, d.Name) 224 } 225 if d.Version != tt.Version { 226 t.Errorf("Expected dependency named %q to have version %q, got %q", tt.Name, tt.Version, d.Version) 227 } 228 if d.Repository != tt.Repository { 229 t.Errorf("Expected dependency named %q to have repository %q, got %q", tt.Name, tt.Repository, d.Repository) 230 } 231 } 232 } 233 234 func verifyDependenciesLock(t *testing.T, c *chart.Chart) { 235 if len(c.Metadata.Dependencies) != 2 { 236 t.Errorf("Expected 2 dependencies, got %d", len(c.Metadata.Dependencies)) 237 } 238 tests := []*chart.Dependency{ 239 {Name: "alpine", Version: "0.1.0", Repository: "https://example.com/charts"}, 240 {Name: "mariner", Version: "4.3.2", Repository: "https://example.com/charts"}, 241 } 242 for i, tt := range tests { 243 d := c.Metadata.Dependencies[i] 244 if d.Name != tt.Name { 245 t.Errorf("Expected dependency named %q, got %q", tt.Name, d.Name) 246 } 247 if d.Version != tt.Version { 248 t.Errorf("Expected dependency named %q to have version %q, got %q", tt.Name, tt.Version, d.Version) 249 } 250 if d.Repository != tt.Repository { 251 t.Errorf("Expected dependency named %q to have repository %q, got %q", tt.Name, tt.Repository, d.Repository) 252 } 253 } 254 } 255 256 func verifyFrobnitz(t *testing.T, c *chart.Chart) { 257 verifyChartFileAndTemplate(t, c, "frobnitz") 258 } 259 260 func verifyChartFileAndTemplate(t *testing.T, c *chart.Chart, name string) { 261 if c.Metadata == nil { 262 t.Fatal("Metadata is nil") 263 } 264 if c.Name() != name { 265 t.Errorf("Expected %s, got %s", name, c.Name()) 266 } 267 if len(c.Templates) != 1 { 268 t.Fatalf("Expected 1 template, got %d", len(c.Templates)) 269 } 270 if c.Templates[0].Name != "templates/template.tpl" { 271 t.Errorf("Unexpected template: %s", c.Templates[0].Name) 272 } 273 if len(c.Templates[0].Data) == 0 { 274 t.Error("No template data.") 275 } 276 if len(c.Files) != 6 { 277 t.Fatalf("Expected 6 Files, got %d", len(c.Files)) 278 } 279 if len(c.Dependencies()) != 2 { 280 t.Fatalf("Expected 2 Dependency, got %d", len(c.Dependencies())) 281 } 282 if len(c.Metadata.Dependencies) != 2 { 283 t.Fatalf("Expected 2 Dependencies.Dependency, got %d", len(c.Metadata.Dependencies)) 284 } 285 if len(c.Lock.Dependencies) != 2 { 286 t.Fatalf("Expected 2 Lock.Dependency, got %d", len(c.Lock.Dependencies)) 287 } 288 289 for _, dep := range c.Dependencies() { 290 switch dep.Name() { 291 case "mariner": 292 case "alpine": 293 if len(dep.Templates) != 1 { 294 t.Fatalf("Expected 1 template, got %d", len(dep.Templates)) 295 } 296 if dep.Templates[0].Name != "templates/alpine-pod.yaml" { 297 t.Errorf("Unexpected template: %s", dep.Templates[0].Name) 298 } 299 if len(dep.Templates[0].Data) == 0 { 300 t.Error("No template data.") 301 } 302 if len(dep.Files) != 1 { 303 t.Fatalf("Expected 1 Files, got %d", len(dep.Files)) 304 } 305 if len(dep.Dependencies()) != 2 { 306 t.Fatalf("Expected 2 Dependency, got %d", len(dep.Dependencies())) 307 } 308 default: 309 t.Errorf("Unexpected dependeny %s", dep.Name()) 310 } 311 } 312 }