github.com/umeshredd/helm@v3.0.0-alpha.1+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 _, err = LoadFiles([]*BufferedFile{}) 131 if err == nil { 132 t.Fatal("Expected err to be non-nil") 133 } 134 if err.Error() != "metadata is required" { 135 t.Errorf("Expected chart metadata missing error, got '%s'", err.Error()) 136 } 137 } 138 139 // Packaging the chart on a Windows machine will produce an 140 // archive that has \\ as delimiters. Test that we support these archives 141 func TestLoadFileBackslash(t *testing.T) { 142 c, err := Load("testdata/frobnitz_backslash-1.2.3.tgz") 143 if err != nil { 144 t.Fatalf("Failed to load testdata: %s", err) 145 } 146 verifyChartFileAndTemplate(t, c, "frobnitz_backslash") 147 verifyChart(t, c) 148 verifyDependencies(t, c) 149 } 150 151 func verifyChart(t *testing.T, c *chart.Chart) { 152 t.Helper() 153 if c.Name() == "" { 154 t.Fatalf("No chart metadata found on %v", c) 155 } 156 t.Logf("Verifying chart %s", c.Name()) 157 if len(c.Templates) != 1 { 158 t.Errorf("Expected 1 template, got %d", len(c.Templates)) 159 } 160 161 numfiles := 6 162 if len(c.Files) != numfiles { 163 t.Errorf("Expected %d extra files, got %d", numfiles, len(c.Files)) 164 for _, n := range c.Files { 165 t.Logf("\t%s", n.Name) 166 } 167 } 168 169 if len(c.Dependencies()) != 2 { 170 t.Errorf("Expected 2 dependencies, got %d (%v)", len(c.Dependencies()), c.Dependencies()) 171 for _, d := range c.Dependencies() { 172 t.Logf("\tSubchart: %s\n", d.Name()) 173 } 174 } 175 176 expect := map[string]map[string]string{ 177 "alpine": { 178 "version": "0.1.0", 179 }, 180 "mariner": { 181 "version": "4.3.2", 182 }, 183 } 184 185 for _, dep := range c.Dependencies() { 186 if dep.Metadata == nil { 187 t.Fatalf("expected metadata on dependency: %v", dep) 188 } 189 exp, ok := expect[dep.Name()] 190 if !ok { 191 t.Fatalf("Unknown dependency %s", dep.Name()) 192 } 193 if exp["version"] != dep.Metadata.Version { 194 t.Errorf("Expected %s version %s, got %s", dep.Name(), exp["version"], dep.Metadata.Version) 195 } 196 } 197 198 } 199 200 func verifyDependencies(t *testing.T, c *chart.Chart) { 201 if len(c.Metadata.Dependencies) != 2 { 202 t.Errorf("Expected 2 dependencies, got %d", len(c.Metadata.Dependencies)) 203 } 204 tests := []*chart.Dependency{ 205 {Name: "alpine", Version: "0.1.0", Repository: "https://example.com/charts"}, 206 {Name: "mariner", Version: "4.3.2", Repository: "https://example.com/charts"}, 207 } 208 for i, tt := range tests { 209 d := c.Metadata.Dependencies[i] 210 if d.Name != tt.Name { 211 t.Errorf("Expected dependency named %q, got %q", tt.Name, d.Name) 212 } 213 if d.Version != tt.Version { 214 t.Errorf("Expected dependency named %q to have version %q, got %q", tt.Name, tt.Version, d.Version) 215 } 216 if d.Repository != tt.Repository { 217 t.Errorf("Expected dependency named %q to have repository %q, got %q", tt.Name, tt.Repository, d.Repository) 218 } 219 } 220 } 221 222 func verifyDependenciesLock(t *testing.T, c *chart.Chart) { 223 if len(c.Metadata.Dependencies) != 2 { 224 t.Errorf("Expected 2 dependencies, got %d", len(c.Metadata.Dependencies)) 225 } 226 tests := []*chart.Dependency{ 227 {Name: "alpine", Version: "0.1.0", Repository: "https://example.com/charts"}, 228 {Name: "mariner", Version: "4.3.2", Repository: "https://example.com/charts"}, 229 } 230 for i, tt := range tests { 231 d := c.Metadata.Dependencies[i] 232 if d.Name != tt.Name { 233 t.Errorf("Expected dependency named %q, got %q", tt.Name, d.Name) 234 } 235 if d.Version != tt.Version { 236 t.Errorf("Expected dependency named %q to have version %q, got %q", tt.Name, tt.Version, d.Version) 237 } 238 if d.Repository != tt.Repository { 239 t.Errorf("Expected dependency named %q to have repository %q, got %q", tt.Name, tt.Repository, d.Repository) 240 } 241 } 242 } 243 244 func verifyFrobnitz(t *testing.T, c *chart.Chart) { 245 verifyChartFileAndTemplate(t, c, "frobnitz") 246 } 247 248 func verifyChartFileAndTemplate(t *testing.T, c *chart.Chart, name string) { 249 if c.Metadata == nil { 250 t.Fatal("Metadata is nil") 251 } 252 if c.Name() != name { 253 t.Errorf("Expected %s, got %s", name, c.Name()) 254 } 255 if len(c.Templates) != 1 { 256 t.Fatalf("Expected 1 template, got %d", len(c.Templates)) 257 } 258 if c.Templates[0].Name != "templates/template.tpl" { 259 t.Errorf("Unexpected template: %s", c.Templates[0].Name) 260 } 261 if len(c.Templates[0].Data) == 0 { 262 t.Error("No template data.") 263 } 264 if len(c.Files) != 6 { 265 t.Fatalf("Expected 6 Files, got %d", len(c.Files)) 266 } 267 if len(c.Dependencies()) != 2 { 268 t.Fatalf("Expected 2 Dependency, got %d", len(c.Dependencies())) 269 } 270 if len(c.Metadata.Dependencies) != 2 { 271 t.Fatalf("Expected 2 Dependencies.Dependency, got %d", len(c.Metadata.Dependencies)) 272 } 273 if len(c.Lock.Dependencies) != 2 { 274 t.Fatalf("Expected 2 Lock.Dependency, got %d", len(c.Lock.Dependencies)) 275 } 276 277 for _, dep := range c.Dependencies() { 278 switch dep.Name() { 279 case "mariner": 280 case "alpine": 281 if len(dep.Templates) != 1 { 282 t.Fatalf("Expected 1 template, got %d", len(dep.Templates)) 283 } 284 if dep.Templates[0].Name != "templates/alpine-pod.yaml" { 285 t.Errorf("Unexpected template: %s", dep.Templates[0].Name) 286 } 287 if len(dep.Templates[0].Data) == 0 { 288 t.Error("No template data.") 289 } 290 if len(dep.Files) != 1 { 291 t.Fatalf("Expected 1 Files, got %d", len(dep.Files)) 292 } 293 if len(dep.Dependencies()) != 2 { 294 t.Fatalf("Expected 2 Dependency, got %d", len(dep.Dependencies())) 295 } 296 default: 297 t.Errorf("Unexpected dependeny %s", dep.Name()) 298 } 299 } 300 }