helm_dependency_ensure_test.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. /*
  2. Copyright © The ESO Authors
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. https://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package hack
  14. import (
  15. "fmt"
  16. "os"
  17. "os/exec"
  18. "path/filepath"
  19. "testing"
  20. )
  21. func TestHelmDependencyEnsureSkipsBuildWhenDependenciesAreReady(t *testing.T) {
  22. t.Parallel()
  23. workdir := t.TempDir()
  24. marker := filepath.Join(workdir, "build-called")
  25. fakeHelm := writeFakeHelm(t, workdir, fakeHelmScript("v0.5.2", "ok", marker))
  26. cmd := exec.Command("bash", "helm.dependency.ensure.sh", "deploy/charts/external-secrets")
  27. cmd.Dir = "."
  28. cmd.Env = append(os.Environ(), "HELM_BIN="+fakeHelm)
  29. output, err := cmd.CombinedOutput()
  30. if err != nil {
  31. t.Fatalf("helper failed: %v\n%s", err, string(output))
  32. }
  33. if _, err := os.Stat(marker); !os.IsNotExist(err) {
  34. t.Fatalf("expected helper to skip helm dependency build when dependencies are already available")
  35. }
  36. }
  37. func TestHelmDependencyEnsureSkipsBuildWhenDependenciesAreUnpacked(t *testing.T) {
  38. t.Parallel()
  39. workdir := t.TempDir()
  40. marker := filepath.Join(workdir, "build-called")
  41. fakeHelm := writeFakeHelm(t, workdir, fakeHelmScript("v0.6.0", "unpacked", marker))
  42. cmd := exec.Command("bash", "helm.dependency.ensure.sh", "deploy/charts/external-secrets")
  43. cmd.Dir = "."
  44. cmd.Env = append(os.Environ(), "HELM_BIN="+fakeHelm)
  45. output, err := cmd.CombinedOutput()
  46. if err != nil {
  47. t.Fatalf("helper failed: %v\n%s", err, string(output))
  48. }
  49. if _, err := os.Stat(marker); !os.IsNotExist(err) {
  50. t.Fatalf("expected helper to skip helm dependency build when dependencies are unpacked locally")
  51. }
  52. }
  53. func TestHelmDependencyEnsureBuildsWhenDependenciesAreMissing(t *testing.T) {
  54. t.Parallel()
  55. workdir := t.TempDir()
  56. marker := filepath.Join(workdir, "build-called")
  57. fakeHelm := writeFakeHelm(t, workdir, fakeHelmScript("v0.5.2", "missing", marker))
  58. cmd := exec.Command("bash", "helm.dependency.ensure.sh", "deploy/charts/external-secrets")
  59. cmd.Dir = "."
  60. cmd.Env = append(os.Environ(), "HELM_BIN="+fakeHelm)
  61. output, err := cmd.CombinedOutput()
  62. if err != nil {
  63. t.Fatalf("helper failed: %v\n%s", err, string(output))
  64. }
  65. if _, err := os.Stat(marker); err != nil {
  66. t.Fatalf("expected helper to invoke helm dependency build when dependencies are missing: %v", err)
  67. }
  68. }
  69. func writeFakeHelm(t *testing.T, dir, content string) string {
  70. t.Helper()
  71. path := filepath.Join(dir, "helm")
  72. if err := os.WriteFile(path, []byte(content), 0o755); err != nil {
  73. t.Fatalf("write fake helm: %v", err)
  74. }
  75. return path
  76. }
  77. func fakeHelmScript(version, status, marker string) string {
  78. return fmt.Sprintf(`#!/usr/bin/env bash
  79. set -euo pipefail
  80. if [[ "$1" == "dependency" && "$2" == "list" ]]; then
  81. cat <<'EOF'
  82. NAME VERSION REPOSITORY STATUS
  83. bitwarden-sdk-server %s oci://ghcr.io/external-secrets/charts %s
  84. EOF
  85. exit 0
  86. fi
  87. if [[ "$1" == "dependency" && "$2" == "build" ]]; then
  88. touch %q
  89. exit 0
  90. fi
  91. echo "unexpected helm invocation: $*" >&2
  92. exit 1
  93. `, version, status, marker)
  94. }