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  }