From affddb3b96a9ade465bd4518f2d66121132b0673 Mon Sep 17 00:00:00 2001 From: Philip Laine Date: Tue, 22 Oct 2024 19:07:06 +0200 Subject: [PATCH] Refactor compose e2e test to not depend on CLI output Signed-off-by: Philip Laine --- src/test/e2e/09_component_compose_test.go | 204 +++++++++++----------- 1 file changed, 98 insertions(+), 106 deletions(-) diff --git a/src/test/e2e/09_component_compose_test.go b/src/test/e2e/09_component_compose_test.go index 8c369feab9..c651753b58 100644 --- a/src/test/e2e/09_component_compose_test.go +++ b/src/test/e2e/09_component_compose_test.go @@ -5,97 +5,116 @@ package test import ( + "context" "fmt" - "os" "path/filepath" + "runtime" "testing" + goyaml "github.com/goccy/go-yaml" "github.com/stretchr/testify/require" - "github.com/stretchr/testify/suite" -) - -type CompositionSuite struct { - suite.Suite - *require.Assertions -} -var ( - composeExample = filepath.Join("examples", "composable-packages") - composeExamplePath string - composeTest = filepath.Join("src", "test", "packages", "09-composable-packages") - composeTestPath string - composeTestBadLocalOS = filepath.Join("src", "test", "packages", "09-composable-packages", "bad-local-os") + layout2 "github.com/zarf-dev/zarf/src/internal/packager2/layout" ) -func (suite *CompositionSuite) SetupSuite() { - suite.Assertions = require.New(suite.T()) +func TestComposabilityExample(t *testing.T) { + t.Parallel() - // Setup the package paths after e2e has been initialized - composeExamplePath = filepath.Join("build", fmt.Sprintf("zarf-package-composable-packages-%s.tar.zst", e2e.Arch)) - composeTestPath = filepath.Join("build", fmt.Sprintf("zarf-package-test-compose-package-%s.tar.zst", e2e.Arch)) -} + // Skip for Windows until path separators in packages are standardized. + if runtime.GOOS == "windows" { + t.SkipNow() + } -func (suite *CompositionSuite) TearDownSuite() { - err := os.RemoveAll(composeExamplePath) - suite.NoError(err) - err = os.RemoveAll(composeTestPath) - suite.NoError(err) -} + tmpDir := t.TempDir() + composeExample := filepath.Join("examples", "composable-packages") + _, _, err := e2e.Zarf(t, "package", "create", composeExample, "-o", tmpDir, "--no-color", "--confirm", "--zarf-cache", tmpDir) + require.NoError(t, err) -func (suite *CompositionSuite) Test_0_ComposabilityExample() { - suite.T().Log("E2E: Package Compose Example") + tarPath := filepath.Join(tmpDir, fmt.Sprintf("zarf-package-composable-packages-%s.tar.zst", e2e.Arch)) + pkgLayout, err := layout2.LoadFromTar(context.Background(), tarPath, layout2.PackageLayoutOptions{}) + require.NoError(t, err) - _, stdErr, err := e2e.Zarf(suite.T(), "package", "create", composeExample, "-o", "build", "--no-color", "--confirm") - suite.NoError(err) + require.Len(t, pkgLayout.Pkg.Components, 2) + b, err := goyaml.Marshal(pkgLayout.Pkg.Components) + require.NoError(t, err) - // Ensure that common names merge - manifests := e2e.NormalizeYAMLFilenames(` + expectedYaml := fmt.Sprintf(`- name: local-games-path + description: Example of a local composed package with a unique description for this component + required: true manifests: - name: multi-games namespace: dos-games files: - ../dos-games/manifests/deployment.yaml - ../dos-games/manifests/service.yaml - - quake-service.yaml`) - suite.Contains(stdErr, manifests) - - // Ensure that the action was appended - suite.Contains(stdErr, ` + - quake-service.yaml + images: + - ghcr.io/zarf-dev/doom-game:0.0.1 +- name: oci-games-url + manifests: + - name: multi-games + namespace: dos-games + files: + - ../../../../../../..%s/oci/dirs/9ece174e362633b637e3c6b554b70f7d009d0a27107bee822336fdf2ce9a9def/manifests/multi-games-0.yaml + - ../../../../../../..%s/oci/dirs/9ece174e362633b637e3c6b554b70f7d009d0a27107bee822336fdf2ce9a9def/manifests/multi-games-1.yaml + images: - ghcr.io/zarf-dev/doom-game:0.0.1 actions: onDeploy: before: - - cmd: ./zarf tools kubectl get -n dos-games deployment -o jsonpath={.items[0].metadata.creationTimestamp}`) + - cmd: ./zarf tools kubectl get -n dos-games deployment -o jsonpath={.items[0].metadata.creationTimestamp} + after: + - wait: + cluster: + kind: deployment + name: game + namespace: dos-games + condition: available +`, tmpDir, tmpDir) + require.Equal(t, expectedYaml, string(b)) } -func (suite *CompositionSuite) Test_1_FullComposability() { - suite.T().Log("E2E: Full Package Compose") +func TestFullComposability(t *testing.T) { + t.Parallel() + + // Skip for Windows until path separators in packages are standardized. + if runtime.GOOS == "windows" { + t.SkipNow() + } + + tmpDir := t.TempDir() + composeTest := filepath.Join("src", "test", "packages", "09-composable-packages") + _, _, err := e2e.Zarf(t, "package", "create", composeTest, "-o", tmpDir, "--no-color", "--confirm") + require.NoError(t, err) - _, stdErr, err := e2e.Zarf(suite.T(), "package", "create", composeTest, "-o", "build", "--no-color", "--confirm") - suite.NoError(err) + tarPath := filepath.Join(tmpDir, fmt.Sprintf("zarf-package-test-compose-package-%s-0.0.1.tar.zst", e2e.Arch)) + pkgLayout, err := layout2.LoadFromTar(context.Background(), tarPath, layout2.PackageLayoutOptions{}) + require.NoError(t, err) - // Ensure that names merge and that composition is added appropriately + require.Len(t, pkgLayout.Pkg.Components, 1) + b, err := goyaml.Marshal(pkgLayout.Pkg.Components) + require.NoError(t, err) - // Check metadata - suite.Contains(stdErr, ` -- name: test-compose-package + expectedYaml := `- name: test-compose-package description: A contrived example for podinfo using many Zarf primitives for compose testing required: true only: localOS: linux -`) - - // Check files - suite.Contains(stdErr, e2e.NormalizeYAMLFilenames(` - files: - - source: files/coffee-ipsum.txt - target: coffee-ipsum.txt - - source: files/coffee-ipsum.txt - target: coffee-ipsum.txt -`)) - - // Check charts - suite.Contains(stdErr, e2e.NormalizeYAMLFilenames(` + manifests: + - name: connect-service + namespace: podinfo-override + files: + - files/service.yaml + - files/service.yaml + kustomizations: + - files + - files + - name: connect-service-two + namespace: podinfo-compose-two + files: + - files/service.yaml + kustomizations: + - files charts: - name: podinfo-compose version: 6.4.0 @@ -112,39 +131,6 @@ func (suite *CompositionSuite) Test_1_FullComposability() { releaseName: podinfo-compose-two valuesFiles: - files/test-values.yaml -`)) - - // Check manifests - suite.Contains(stdErr, e2e.NormalizeYAMLFilenames(` - manifests: - - name: connect-service - namespace: podinfo-override - files: - - files/service.yaml - - files/service.yaml - kustomizations: - - files - - files - - name: connect-service-two - namespace: podinfo-compose-two - files: - - files/service.yaml - kustomizations: - - files -`)) - - // Check images + repos - suite.Contains(stdErr, ` - images: - - ghcr.io/stefanprodan/podinfo:6.4.0 - - ghcr.io/stefanprodan/podinfo:6.4.1 - repos: - - https://github.com/zarf-dev/zarf-public-test.git - - https://github.com/zarf-dev/zarf-public-test.git@refs/heads/dragons -`) - - // Check dataInjections - suite.Contains(stdErr, ` dataInjections: - source: files target: @@ -158,10 +144,17 @@ func (suite *CompositionSuite) Test_1_FullComposability() { selector: app.kubernetes.io/name=podinfo-compose container: podinfo path: /home/app/service.yaml -`) - - // Check actions - suite.Contains(stdErr, ` + files: + - source: files/coffee-ipsum.txt + target: coffee-ipsum.txt + - source: files/coffee-ipsum.txt + target: coffee-ipsum.txt + images: + - ghcr.io/stefanprodan/podinfo:6.4.0 + - ghcr.io/stefanprodan/podinfo:6.4.1 + repos: + - https://github.com/zarf-dev/zarf-public-test.git + - https://github.com/zarf-dev/zarf-public-test.git@refs/heads/dragons actions: onCreate: before: @@ -177,17 +170,16 @@ func (suite *CompositionSuite) Test_1_FullComposability() { kind: deployment name: podinfo-compose-two namespace: podinfo-compose-two - condition: available`) + condition: available +` + require.Equal(t, expectedYaml, string(b)) } -func (suite *CompositionSuite) Test_2_ComposabilityBadLocalOS() { - suite.T().Log("E2E: Package Compose Example") - - _, stdErr, err := e2e.Zarf(suite.T(), "package", "create", composeTestBadLocalOS, "-o", "build", "--no-color", "--confirm") - suite.Error(err) - suite.Contains(e2e.StripMessageFormatting(stdErr), "\"only.localOS\" \"linux\" cannot be redefined as \"windows\" during compose") -} +func TestComposabilityBadLocalOS(t *testing.T) { + t.Parallel() -func TestCompositionSuite(t *testing.T) { - suite.Run(t, new(CompositionSuite)) + composeTestBadLocalOS := filepath.Join("src", "test", "packages", "09-composable-packages", "bad-local-os") + _, stdErr, err := e2e.Zarf(t, "package", "create", composeTestBadLocalOS, "-o", "build", "--no-color", "--confirm") + require.Error(t, err) + require.Contains(t, e2e.StripMessageFormatting(stdErr), "\"only.localOS\" \"linux\" cannot be redefined as \"windows\" during compose") }