From 4356999b5fb0ec35d5598b9ec441df2c19628b88 Mon Sep 17 00:00:00 2001 From: Martin Hickey Date: Mon, 4 Feb 2019 15:38:51 +0000 Subject: [PATCH] Add unit tests Signed-off-by: Martin Hickey --- cmd/helm/library_update_test.go | 232 ++++++++++++++++++ cmd/helm/package_test.go | 6 + .../testcharts/chart-missing-libs/.helmignore | 21 ++ .../testcharts/chart-missing-libs/Chart.yaml | 10 + .../charts/reqsubchart/.helmignore | 21 ++ .../charts/reqsubchart/Chart.yaml | 3 + .../charts/reqsubchart/values.yaml | 4 + .../testcharts/chart-missing-libs/values.yaml | 4 + .../testcharts/lib-charts/common-0.0.5.tgz | Bin 0 -> 8347 bytes .../lib-charts/compressedchart-0.1.0.tgz | Bin 0 -> 542 bytes .../lib-charts/compressedchart-0.3.0.tgz | Bin 0 -> 538 bytes pkg/resolver/resolver_test.go | 122 ++++++--- 12 files changed, 383 insertions(+), 40 deletions(-) create mode 100644 cmd/helm/library_update_test.go create mode 100644 cmd/helm/testdata/testcharts/chart-missing-libs/.helmignore create mode 100644 cmd/helm/testdata/testcharts/chart-missing-libs/Chart.yaml create mode 100644 cmd/helm/testdata/testcharts/chart-missing-libs/charts/reqsubchart/.helmignore create mode 100644 cmd/helm/testdata/testcharts/chart-missing-libs/charts/reqsubchart/Chart.yaml create mode 100644 cmd/helm/testdata/testcharts/chart-missing-libs/charts/reqsubchart/values.yaml create mode 100644 cmd/helm/testdata/testcharts/chart-missing-libs/values.yaml create mode 100644 cmd/helm/testdata/testcharts/lib-charts/common-0.0.5.tgz create mode 100644 cmd/helm/testdata/testcharts/lib-charts/compressedchart-0.1.0.tgz create mode 100644 cmd/helm/testdata/testcharts/lib-charts/compressedchart-0.3.0.tgz diff --git a/cmd/helm/library_update_test.go b/cmd/helm/library_update_test.go new file mode 100644 index 000000000..b95820c3d --- /dev/null +++ b/cmd/helm/library_update_test.go @@ -0,0 +1,232 @@ +/* +Copyright The Helm Authors. +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" + "testing" + + "k8s.io/helm/pkg/chart" + "k8s.io/helm/pkg/chartutil" + "k8s.io/helm/pkg/provenance" + "k8s.io/helm/pkg/repo" + "k8s.io/helm/pkg/repo/repotest" +) + +func TestLibraryUpdateCmd(t *testing.T) { + defer resetEnv()() + + hh := testHelmHome(t) + settings.Home = hh + + srv := repotest.NewServer(hh.String()) + defer srv.Stop() + copied, err := srv.CopyCharts("testdata/testcharts/lib-charts/*.tgz") + if err != nil { + t.Fatal(err) + } + t.Logf("Copied charts:\n%s", strings.Join(copied, "\n")) + t.Logf("Listening on directory %s", srv.Root()) + + chartname := "libup" + md := createTestingMetadataLibRef(chartname, srv.URL()) + if _, err := chartutil.Create(md, hh.String()); err != nil { + t.Fatal(err) + } + + out, err := executeCommand(nil, fmt.Sprintf("--home='%s' library update '%s'", hh, hh.Path(chartname))) + if err != nil { + t.Logf("Output: %s", out) + t.Fatal(err) + } + + // This is written directly to stdout, so we have to capture as is. + if !strings.Contains(out, `update from the "test" chart repository`) { + t.Errorf("Repo did not get updated\n%s", out) + } + + // Make sure the actual file got downloaded. + expect := hh.Path(chartname, "library/common-0.0.5.tgz") + if _, err := os.Stat(expect); err != nil { + t.Fatal(err) + } + + hash, err := provenance.DigestFile(expect) + if err != nil { + t.Fatal(err) + } + + i, err := repo.LoadIndexFile(hh.CacheIndex("test")) + if err != nil { + t.Fatal(err) + } + + reqver := i.Entries["common"][0] + if h := reqver.Digest; h != hash { + t.Errorf("Failed hash match: expected %s, got %s", hash, h) + } + + // Now change the libraries and update. This verifies that on update, + // old libraries are cleansed and new libraries are added. + md.Libraries = []*chart.Dependency{ + {Name: "common", Version: "0.0.5", Repository: srv.URL()}, + {Name: "compressedchart", Version: "0.3.0", Repository: srv.URL()}, + } + dir := hh.Path(chartname, "Chart.yaml") + if err := chartutil.SaveChartfile(dir, md); err != nil { + t.Fatal(err) + } + + out, err = executeCommand(nil, fmt.Sprintf("--home='%s' library update '%s'", hh, hh.Path(chartname))) + if err != nil { + t.Logf("Output: %s", out) + t.Fatal(err) + } + + // In this second run, we should see compressedchart-0.3.0.tgz, and not + // the 0.1.0 version. + expect = hh.Path(chartname, "library/compressedchart-0.3.0.tgz") + if _, err := os.Stat(expect); err != nil { + t.Fatalf("Expected %q: %s", expect, err) + } + dontExpect := hh.Path(chartname, "library/compressedchart-0.1.0.tgz") + if _, err := os.Stat(dontExpect); err == nil { + t.Fatalf("Unexpected %q", dontExpect) + } +} + +func TestLibraryUpdateCmd_SkipRefresh(t *testing.T) { + defer resetEnv()() + + hh := testHelmHome(t) + settings.Home = hh + + srv := repotest.NewServer(hh.String()) + defer srv.Stop() + copied, err := srv.CopyCharts("testdata/testcharts/lib-charts/*.tgz") + if err != nil { + t.Fatal(err) + } + t.Logf("Copied charts:\n%s", strings.Join(copied, "\n")) + t.Logf("Listening on directory %s", srv.Root()) + + chartname := "libup" + if err := createTestingChartLibRef(hh.String(), chartname, srv.URL()); err != nil { + t.Fatal(err) + } + + out, err := executeCommand(nil, fmt.Sprintf("--home='%s' library update --skip-refresh '%s'", hh, hh.Path(chartname))) + if err == nil { + t.Fatal("Expected failure to find the repo with skipRefresh") + } + + // This is written directly to stdout, so we have to capture as is. + if strings.Contains(out, `update from the "test" chart repository`) { + t.Errorf("Repo was unexpectedly updated\n%s", out) + } +} + +func TestLibraryUpdateCmd_DontDeleteOldChartsOnError(t *testing.T) { + defer resetEnv()() + + hh := testHelmHome(t) + settings.Home = hh + + srv := repotest.NewServer(hh.String()) + defer srv.Stop() + copied, err := srv.CopyCharts("testdata/testcharts/lib-charts/*.tgz") + if err != nil { + t.Fatal(err) + } + t.Logf("Copied charts:\n%s", strings.Join(copied, "\n")) + t.Logf("Listening on directory %s", srv.Root()) + + chartname := "libupdelete" + if err := createTestingChartLibRef(hh.String(), chartname, srv.URL()); err != nil { + t.Fatal(err) + } + + out := bytes.NewBuffer(nil) + o := &refUpdateOptions{} + o.helmhome = hh + o.chartpath = hh.Path(chartname) + + if err := o.run(out, true); err != nil { + output := out.String() + t.Logf("Output: %s", output) + t.Fatal(err) + } + + // Chart repo is down + srv.Stop() + + if err := o.run(out, true); err == nil { + output := out.String() + t.Logf("Output: %s", output) + t.Fatal("Expected error, got nil") + } + + // Make sure charts dir still has libraries + files, err := ioutil.ReadDir(filepath.Join(o.chartpath, "library")) + if err != nil { + t.Fatal(err) + } + libraries := []string{"common-0.0.5.tgz", "compressedchart-0.1.0.tgz"} + + if len(libraries) != len(files) { + t.Fatalf("Expected %d chart library, got %d", len(libraries), len(files)) + } + for index, file := range files { + if libraries[index] != file.Name() { + t.Fatalf("Chart library %s not matching %s", libraries[index], file.Name()) + } + } + + // Make sure tmpcharts is deleted + if _, err := os.Stat(filepath.Join(o.chartpath, "tmpcharts")); !os.IsNotExist(err) { + t.Fatalf("tmpcharts dir still exists") + } +} + +// createTestingMetadataLibRef creates a basic chart that depends on lib chart +// common-0.0.5 +// +// The baseURL can be used to point to a particular repository server. +func createTestingMetadataLibRef(name, baseURL string) *chart.Metadata { + return &chart.Metadata{ + Name: name, + Version: "1.2.3", + Libraries: []*chart.Dependency{ + {Name: "common", Version: "0.0.5", Repository: baseURL}, + {Name: "compressedchart", Version: "0.1.0", Repository: baseURL}, + }, + } +} + +// createTestingChartLibRef creates a basic chart that depends on +// lib chart common-0.0.5 +// +// The baseURL can be used to point to a particular repository server. +func createTestingChartLibRef(dest, name, baseURL string) error { + cfile := createTestingMetadataLibRef(name, baseURL) + _, err := chartutil.Create(cfile, dest) + return err +} diff --git a/cmd/helm/package_test.go b/cmd/helm/package_test.go index f6a35ac77..032e0bc30 100644 --- a/cmd/helm/package_test.go +++ b/cmd/helm/package_test.go @@ -140,6 +140,12 @@ func TestPackage(t *testing.T) { hasfile: "chart-missing-deps-0.1.0.tgz", err: true, }, + { + name: "package testdata/testcharts/chart-missing-libs", + args: []string{"testdata/testcharts/chart-missing-libs"}, + hasfile: "chart-missing-libs-0.1.0.tgz", + err: true, + }, { name: "package --values does-not-exist", args: []string{"testdata/testcharts/alpine"}, diff --git a/cmd/helm/testdata/testcharts/chart-missing-libs/.helmignore b/cmd/helm/testdata/testcharts/chart-missing-libs/.helmignore new file mode 100644 index 000000000..f0c131944 --- /dev/null +++ b/cmd/helm/testdata/testcharts/chart-missing-libs/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/cmd/helm/testdata/testcharts/chart-missing-libs/Chart.yaml b/cmd/helm/testdata/testcharts/chart-missing-libs/Chart.yaml new file mode 100644 index 000000000..c22793502 --- /dev/null +++ b/cmd/helm/testdata/testcharts/chart-missing-libs/Chart.yaml @@ -0,0 +1,10 @@ +description: A Helm chart for Kubernetes +name: chart-missing-libs +version: 0.1.0 +libraries: + - name: reqsubchart + version: 0.1.0 + repository: "https://example.com/charts" + - name: reqsubchart2 + version: 0.2.0 + repository: "https://example.com/charts" diff --git a/cmd/helm/testdata/testcharts/chart-missing-libs/charts/reqsubchart/.helmignore b/cmd/helm/testdata/testcharts/chart-missing-libs/charts/reqsubchart/.helmignore new file mode 100644 index 000000000..f0c131944 --- /dev/null +++ b/cmd/helm/testdata/testcharts/chart-missing-libs/charts/reqsubchart/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/cmd/helm/testdata/testcharts/chart-missing-libs/charts/reqsubchart/Chart.yaml b/cmd/helm/testdata/testcharts/chart-missing-libs/charts/reqsubchart/Chart.yaml new file mode 100644 index 000000000..c3813bc8c --- /dev/null +++ b/cmd/helm/testdata/testcharts/chart-missing-libs/charts/reqsubchart/Chart.yaml @@ -0,0 +1,3 @@ +description: A Helm chart for Kubernetes +name: reqsubchart +version: 0.1.0 diff --git a/cmd/helm/testdata/testcharts/chart-missing-libs/charts/reqsubchart/values.yaml b/cmd/helm/testdata/testcharts/chart-missing-libs/charts/reqsubchart/values.yaml new file mode 100644 index 000000000..0f0b63f2a --- /dev/null +++ b/cmd/helm/testdata/testcharts/chart-missing-libs/charts/reqsubchart/values.yaml @@ -0,0 +1,4 @@ +# Default values for reqsubchart. +# This is a YAML-formatted file. +# Declare name/value pairs to be passed into your templates. +# name: value diff --git a/cmd/helm/testdata/testcharts/chart-missing-libs/values.yaml b/cmd/helm/testdata/testcharts/chart-missing-libs/values.yaml new file mode 100644 index 000000000..d57f76b07 --- /dev/null +++ b/cmd/helm/testdata/testcharts/chart-missing-libs/values.yaml @@ -0,0 +1,4 @@ +# Default values for reqtest. +# This is a YAML-formatted file. +# Declare name/value pairs to be passed into your templates. +# name: value diff --git a/cmd/helm/testdata/testcharts/lib-charts/common-0.0.5.tgz b/cmd/helm/testdata/testcharts/lib-charts/common-0.0.5.tgz new file mode 100644 index 0000000000000000000000000000000000000000..ca0a64ae31477b801f86d8e7ddd4d0adc254deaa GIT binary patch literal 8347 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 literal 0 HcmV?d00001 diff --git a/cmd/helm/testdata/testcharts/lib-charts/compressedchart-0.1.0.tgz b/cmd/helm/testdata/testcharts/lib-charts/compressedchart-0.1.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..575b271286ca8a01b723298c49dedba66c6c18c6 GIT binary patch literal 542 zcmV+(0^$81iwG0|32ul0|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PL4di`y^|hWG4WG2L8RXjD7vWMOYhb13u^wwIoYVoz*QSu&EG zG;H_3cVsVVQK6y4WNFYth!rF2Bbs;KaiN>mptV>QH8<|nYyZu5ypb29krLPQd4DCs zYno+?eY?M(<+D7yfbmxF7dq>>q3MquC*0hBLW#C8qIE*68@PoxC>!V_0oK~U+irzM zp+lP}-rx-c;gW37*#6O!Wh_medN+}OCDi|h%MR_h3E+_aXIIyu{^#jc)c+}%z!KNI zlMaTH?`0nZ1xqIIxfT}a!{N*A`*&07)o|yqgtd_9J1nt~+#vWoF+>rxTo?;Z!^*e) za3B=@-09AM!={y-G7C#!$Suuo`fK9pkYAqq?>T!y{qK)u-(s#kG8G)sf11w%{Vx`I z9`%0;$nd3x`+N3*GzdSSe9Q)yTWw@{`S1`Wc-DmaXEjxTqEg!6XmcF&|HU8me?E`; zKM51~D|p3hMXl1%r=D?m(;lNxvj$(SQ_+>I=5K g`+DbSZ3(MHEDIu$NaT2a1^@v6|5o&hN&pl90NmINwg3PC literal 0 HcmV?d00001 diff --git a/cmd/helm/testdata/testcharts/lib-charts/compressedchart-0.3.0.tgz b/cmd/helm/testdata/testcharts/lib-charts/compressedchart-0.3.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..89776bfa80fd8e37cb819073ce30792fbcb28fe3 GIT binary patch literal 538 zcmV+#0_FW5iwG0|32ul0|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PL4fYuhjw#&hXs31R)S-sgGc!Zg;A_f!_OaN*6{_+(qrsKLqLob$`stSdR^ z{gRKz^L@Q*ALo;NJizHz@DExagd1>v>^S|+JrPRsg_AZ&qpxs{8&VCrNWjWCyla=_ zGzIdR77bmY7cSYFobS4FHf20}?A;{(m%jejLbc>iYXFDzKbc)XlU>WOi zI7l4~wx)Fm)L10~d6r@4EzNfHd*ac~UmpAOJbU{3-yh4q#)3W43J&R?=aZiP=kq*I z`acIZq?Ezk9s4L6!cUYBZg88ag)XxpG*u%0Y~ZDJw30ul#72f1FJ3Wx(rOE%yPk1Lu;iemCYG_q?YG-t c9A&JM=~|FTBofE-D*yoh|LpYS&Hxku0CM*Yp8x;= literal 0 HcmV?d00001 diff --git a/pkg/resolver/resolver_test.go b/pkg/resolver/resolver_test.go index 8a4c0239a..d4e2440e8 100644 --- a/pkg/resolver/resolver_test.go +++ b/pkg/resolver/resolver_test.go @@ -21,7 +21,65 @@ import ( "k8s.io/helm/pkg/chart" ) -func TestResolve(t *testing.T) { +func TestDependencyResolve(t *testing.T) { + resolve(t, false) +} + +func TestLibraryResolve(t *testing.T) { + resolve(t, true) +} + +func TestHashReq(t *testing.T) { + expect := "sha256:d661820b01ed7bcf26eed8f01cf16380e0a76326ba33058d3150f919d9b15bc0" + req := []*chart.Dependency{ + {Name: "alpine", Version: "0.1.0", Repository: "http://localhost:8879/charts"}, + } + h, err := HashReq(req) + if err != nil { + t.Fatal(err) + } + if expect != h { + t.Errorf("Expected %q, got %q", expect, h) + } + + req = []*chart.Dependency{} + h, err = HashReq(req) + if err != nil { + t.Fatal(err) + } + if expect == h { + t.Errorf("Expected %q != %q", expect, h) + } +} + +func resolve(t *testing.T, isLib bool) { + var lock1 *chart.Lock + var lock2 *chart.Lock + if isLib { + lock1 = &chart.Lock{ + Libraries: []*chart.Dependency{ + {Name: "alpine", Repository: "http://example.com", Version: "0.2.0"}, + }, + } + lock2 = &chart.Lock{ + Libraries: []*chart.Dependency{ + {Name: "signtest", Repository: "file://../../../../cmd/helm/testdata/testcharts/signtest", Version: "0.1.0"}, + }, + } + + } else { + lock1 = &chart.Lock{ + Dependencies: []*chart.Dependency{ + {Name: "alpine", Repository: "http://example.com", Version: "0.2.0"}, + }, + } + lock2 = &chart.Lock{ + Dependencies: []*chart.Dependency{ + {Name: "signtest", Repository: "file://../../../../cmd/helm/testdata/testcharts/signtest", Version: "0.1.0"}, + }, + } + } + tests := []struct { name string req []*chart.Dependency @@ -61,22 +119,14 @@ func TestResolve(t *testing.T) { req: []*chart.Dependency{ {Name: "alpine", Repository: "http://example.com", Version: ">=0.1.0"}, }, - expect: &chart.Lock{ - Dependencies: []*chart.Dependency{ - {Name: "alpine", Repository: "http://example.com", Version: "0.2.0"}, - }, - }, + expect: lock1, }, { name: "repo from valid local path", req: []*chart.Dependency{ {Name: "signtest", Repository: "file://../../../../cmd/helm/testdata/testcharts/signtest", Version: "0.1.0"}, }, - expect: &chart.Lock{ - Dependencies: []*chart.Dependency{ - {Name: "signtest", Repository: "file://../../../../cmd/helm/testdata/testcharts/signtest", Version: "0.1.0"}, - }, - }, + expect: lock2, }, { name: "repo from invalid local path", @@ -95,12 +145,18 @@ func TestResolve(t *testing.T) { t.Fatal(err) } - l, err := r.Resolve(tt.req, repoNames, hash, false) - if err != nil { + var l *chart.Lock + var errRes error + if isLib { + l, errRes = r.Resolve(tt.req, repoNames, hash, true) + } else { + l, errRes = r.Resolve(tt.req, repoNames, hash, false) + } + if errRes != nil { if tt.err { continue } - t.Fatal(err) + t.Fatal(errRes) } if tt.err { @@ -114,11 +170,20 @@ func TestResolve(t *testing.T) { } // Check fields. - if len(l.Dependencies) != len(tt.req) { + var reqs []*chart.Dependency + var ttReqs []*chart.Dependency + if isLib { + reqs = l.Libraries + ttReqs = tt.expect.Libraries + } else { + reqs = l.Dependencies + ttReqs = tt.expect.Dependencies + } + if len(reqs) != len(tt.req) { t.Errorf("%s: wrong number of dependencies in lock", tt.name) } - d0 := l.Dependencies[0] - e0 := tt.expect.Dependencies[0] + d0 := reqs[0] + e0 := ttReqs[0] if d0.Name != e0.Name { t.Errorf("%s: expected name %s, got %s", tt.name, e0.Name, d0.Name) } @@ -130,26 +195,3 @@ func TestResolve(t *testing.T) { } } } - -func TestHashReq(t *testing.T) { - expect := "sha256:d661820b01ed7bcf26eed8f01cf16380e0a76326ba33058d3150f919d9b15bc0" - req := []*chart.Dependency{ - {Name: "alpine", Version: "0.1.0", Repository: "http://localhost:8879/charts"}, - } - h, err := HashReq(req) - if err != nil { - t.Fatal(err) - } - if expect != h { - t.Errorf("Expected %q, got %q", expect, h) - } - - req = []*chart.Dependency{} - h, err = HashReq(req) - if err != nil { - t.Fatal(err) - } - if expect == h { - t.Errorf("Expected %q != %q", expect, h) - } -}