// Copyright 2023 Google LLC // // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package common import ( "context" "fmt" "os" "path/filepath" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.skia.org/infra/task_driver/go/lib/os_steps" "go.skia.org/infra/task_driver/go/td" "go.skia.org/skia/infra/bots/task_drivers/testutils" ) func TestValidateLabelAndReturnOutputZipPath_ValidLabel_Success(t *testing.T) { test := func(label, expected string) { t.Run(label, func(t *testing.T) { actual, err := ValidateLabelAndReturnOutputsZipPath("/path/to/skia", label) require.NoError(t, err) assert.Equal(t, expected, actual) }) } test("//:foo", "/path/to/skia/bazel-testlogs/foo/test.outputs/outputs.zip") test("//foo:bar", "/path/to/skia/bazel-testlogs/foo/bar/test.outputs/outputs.zip") test("//foo/bar:baz", "/path/to/skia/bazel-testlogs/foo/bar/baz/test.outputs/outputs.zip") test("//foo/bar/baz:qux", "/path/to/skia/bazel-testlogs/foo/bar/baz/qux/test.outputs/outputs.zip") } func TestValidateLabelAndReturnOutputZipPath_InvalidLabel_Error(t *testing.T) { test := func(label string) { t.Run(label, func(t *testing.T) { _, err := ValidateLabelAndReturnOutputsZipPath("/path/to/skia", label) require.Error(t, err) assert.Contains(t, err.Error(), fmt.Sprintf("invalid label: %q", label)) }) } test("foo") test("/foo") test("//foo") test(":foo") test("/:foo") test("foo/bar") test("foo:bar") test("/foo/bar") test("/foo:bar") test(":foo/bar") test(":foo:bar") test("//foo/bar") test("foo/bar/baz") test("foo/bar:baz") test("foo:bar/baz") test("foo:bar:baz") test("/foo/bar/baz") test("/foo/bar:baz") test("/foo:bar/baz") test("/foo:bar:baz") test("//foo/bar/baz") test("//foo:bar/baz") test("//foo:bar:baz") } func TestExtractOutputsZip_Success(t *testing.T) { zipContents := map[string]string{ // File contents are not important for this test; only paths and file extensions are taken into // account. "alfa.png": "fake PNG file", "alfa.json": "fake JSON file", "bravo.PNG": "fake PNG", "bravo.JSON": "fake JSON file", "charlie.txt": "fake TXT file", // Neither PNG nor JSON; should be ignored. // Subdirectories should be ignored. "delta/echo.png": "fake PNG file", "delta/echo.json": "fake JSON file", "delta/echo.txt": "fake JSON file", } zipPath := filepath.Join(t.TempDir(), "outputs.zip") testutils.MakeZIP(t, zipPath, zipContents) extractionDir := t.TempDir() res := td.RunTestSteps(t, false, func(ctx context.Context) error { ctx = context.WithValue(ctx, os_steps.TempDirContextKey, testutils.MakeTempDirMockFn(t, extractionDir)) var err error extractionDir, err = ExtractOutputsZip(ctx, zipPath) require.NoError(t, err) return nil }) require.Empty(t, res.Errors) require.Empty(t, res.Exceptions) testutils.AssertStepNames(t, res, "Creating TempDir", fmt.Sprintf("Extract undeclared outputs archive %s into %s", zipPath, extractionDir), "Extracting file: alfa.json", "Extracting file: alfa.png", "Extracting file: bravo.JSON", "Extracting file: bravo.PNG", "Not extracting non-PNG / non-JSON file: charlie.txt", "Not extracting file within subdirectory: delta/echo.json", "Not extracting file within subdirectory: delta/echo.png", "Not extracting file within subdirectory: delta/echo.txt") extractedFiles := map[string]bool{} files, err := os.ReadDir(extractionDir) require.NoError(t, err) for _, file := range files { assert.False(t, file.IsDir()) extractedFiles[file.Name()] = true } assert.Equal(t, map[string]bool{ "alfa.png": true, "alfa.json": true, "bravo.PNG": true, "bravo.JSON": true, }, extractedFiles) }