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