diff options
Diffstat (limited to 'tests/runfiles/fs_test.go')
-rw-r--r-- | tests/runfiles/fs_test.go | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/tests/runfiles/fs_test.go b/tests/runfiles/fs_test.go new file mode 100644 index 00000000..3b66c480 --- /dev/null +++ b/tests/runfiles/fs_test.go @@ -0,0 +1,121 @@ +// Copyright 2021 Google LLC +// +// 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 +// +// https://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. + +//go:build go1.16 +// +build go1.16 + +package runfiles_test + +import ( + "io" + "io/fs" + "os" + "path/filepath" + "runtime" + "testing" + "testing/fstest" + + "github.com/bazelbuild/rules_go/go/runfiles" +) + +func TestFS(t *testing.T) { + fsys, err := runfiles.New() + if err != nil { + t.Fatal(err) + } + + // Ensure that the Runfiles object implements FS interfaces. + var _ fs.FS = fsys + var _ fs.StatFS = fsys + var _ fs.ReadFileFS = fsys + + if runtime.GOOS == "windows" { + // Currently the result of + // + // fsys.Rlocation("io_bazel_rules_go/go/runfiles/test.txt") + // fsys.Rlocation("bazel_tools/tools/bash/runfiles/runfiles.bash") + // fsys.Rlocation("io_bazel_rules_go/go/runfiles/testprog/testprog") + // + // would be a full path like these + // + // C:\b\bk-windows-1z0z\bazel\rules-go-golang\go\tools\bazel\runfiles\test.txt + // C:\b\zslxztin\external\bazel_tools\tools\bash\runfiles\runfiles.bash + // C:\b\pm4ep4b2\execroot\io_bazel_rules_go\bazel-out\x64_windows-fastbuild\bin\go\tools\bazel\runfiles\testprog\testprog + // + // Which does not follow any particular patter / rules. + // This makes it very hard to define what we are looking for on Windows. + // So let's skip this for now. + return + } + + expected1 := "io_bazel_rules_go/tests/runfiles/test.txt" + expected2 := "io_bazel_rules_go/tests/runfiles/testprog/testprog_/testprog" + expected3 := "bazel_tools/tools/bash/runfiles/runfiles.bash" + if err := fstest.TestFS(fsys, expected1, expected2, expected3); err != nil { + t.Error(err) + } +} + +func TestFS_empty(t *testing.T) { + dir := t.TempDir() + manifest := filepath.Join(dir, "manifest") + if err := os.WriteFile(manifest, []byte("__init__.py \n"), 0o600); err != nil { + t.Fatal(err) + } + fsys, err := runfiles.New(runfiles.ManifestFile(manifest), runfiles.ProgramName("/invalid"), runfiles.Directory("/invalid")) + if err != nil { + t.Fatal(err) + } + t.Run("Open", func(t *testing.T) { + fd, err := fsys.Open("__init__.py") + if err != nil { + t.Fatal(err) + } + defer fd.Close() + got, err := io.ReadAll(fd) + if err != nil { + t.Error(err) + } + if len(got) != 0 { + t.Errorf("got nonempty contents: %q", got) + } + }) + t.Run("Stat", func(t *testing.T) { + got, err := fsys.Stat("__init__.py") + if err != nil { + t.Fatal(err) + } + if got.Name() != "__init__.py" { + t.Errorf("Name: got %q, want %q", got.Name(), "__init__.py") + } + if got.Size() != 0 { + t.Errorf("Size: got %d, want %d", got.Size(), 0) + } + if !got.Mode().IsRegular() { + t.Errorf("IsRegular: got %v, want %v", got.Mode().IsRegular(), true) + } + if got.IsDir() { + t.Errorf("IsDir: got %v, want %v", got.IsDir(), false) + } + }) + t.Run("ReadFile", func(t *testing.T) { + got, err := fsys.ReadFile("__init__.py") + if err != nil { + t.Error(err) + } + if len(got) != 0 { + t.Errorf("got nonempty contents: %q", got) + } + }) +} |