Skip to content

Commit

Permalink
Spec: make it possible to run fileutil specs in parallel
Browse files Browse the repository at this point in the history
  • Loading branch information
aramprice authored and nader-ziada committed Dec 19, 2024
1 parent 6006851 commit 9b6ac71
Show file tree
Hide file tree
Showing 10 changed files with 116 additions and 90 deletions.
62 changes: 59 additions & 3 deletions fileutil/commands_suite_test.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,69 @@
package fileutil_test

import (
"io"
"io/fs"
"os"
"path/filepath"
"testing"

. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"

"testing"
)

func TestCommands(t *testing.T) {
func TestFileutil(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecs(t, "Fileutil Suite")
}

var testAssetsDir string
var testAssetsFixtureDir string

func localCopyFSForGo122(dir string, fsys fs.FS) error {
return fs.WalkDir(fsys, ".", func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}

newPath := filepath.Join(dir, path)
if d.IsDir() {
return os.MkdirAll(newPath, 0777)
}

if !d.Type().IsRegular() {
return &os.PathError{Op: "CopyFS", Path: path, Err: os.ErrInvalid}
}

r, err := fsys.Open(path)
if err != nil {
return err
}
defer r.Close()
info, err := r.Stat()
if err != nil {
return err
}
w, err := os.OpenFile(newPath, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0666|info.Mode()&0777)
if err != nil {
return err
}

if _, err := io.Copy(w, r); err != nil {
w.Close()
return &os.PathError{Op: "Copy", Path: newPath, Err: err}
}
return w.Close()
})
}

var _ = BeforeEach(func() {
assetsDirFS := os.DirFS(filepath.Join(".", "test_assets"))

testAssetsDir = GinkgoT().TempDir()

// TODO: use `os.CopyFS` instead of `localCopyFSForGo122` once we upgrade Golang versions
err := localCopyFSForGo122(testAssetsDir, assetsDirFS)
Expect(err).NotTo(HaveOccurred())

testAssetsFixtureDir = filepath.Join(testAssetsDir, "fixture_dir")
})
74 changes: 33 additions & 41 deletions fileutil/generic_cp_copier_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,29 +14,31 @@ import (
boshsys "github.com/cloudfoundry/bosh-utils/system"
)

func filesInDir(dir string) []string {
var copiedFiles []string

err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !info.IsDir() {
copiedFiles = append(copiedFiles, path)
}
return nil
})

Expect(err).ToNot(HaveOccurred())

sort.Strings(copiedFiles)

return copiedFiles
}

var _ = Describe("genericCpCopier", func() {
var (
fs boshsys.FileSystem
cpCopier Copier
)
filesInDir := func(dir string) []string {
copiedFiles := []string{}
err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !info.IsDir() {
copiedFiles = append(copiedFiles, path)
}
return nil
})

Expect(err).ToNot(HaveOccurred())

sort.Strings(copiedFiles)

return copiedFiles
}

BeforeEach(func() {
logger := boshlog.NewLogger(boshlog.LevelNone)
Expand All @@ -47,7 +49,6 @@ var _ = Describe("genericCpCopier", func() {
Describe("FilteredCopyToTemp", func() {

It("copies all regular files from filtered copy to temp", func() {
srcDir := fixtureSrcDir()
filters := []string{
filepath.Join("**", "*.stdout.log"),
"*.stderr.log",
Expand All @@ -56,15 +57,12 @@ var _ = Describe("genericCpCopier", func() {
filepath.Join("some_directory", "**", "*"),
}

dstDir, err := cpCopier.FilteredCopyToTemp(srcDir, filters)
dstDir, err := cpCopier.FilteredCopyToTemp(testAssetsFixtureDir, filters)
Expect(err).ToNot(HaveOccurred())

defer os.RemoveAll(dstDir)

copiedFiles := filesInDir(dstDir)

Expect(err).ToNot(HaveOccurred())

Expect(copiedFiles[0:5]).To(Equal([]string{
filepath.Join(dstDir, "app.stderr.log"),
filepath.Join(dstDir, "app.stdout.log"),
Expand Down Expand Up @@ -105,10 +103,11 @@ var _ = Describe("genericCpCopier", func() {
Skip("Pending on Windows, relative symlinks are not supported")
}

srcDir := fixtureSrcDir()
symlinkPath, err := createTestSymlink()
symlinkBasename := "symlink_dir"
symlinkPath := filepath.Join(testAssetsFixtureDir, symlinkBasename)
symlinkTarget := filepath.Join(testAssetsDir, "symlink_target")
err := os.Symlink(symlinkTarget, symlinkPath)
Expect(err).To(Succeed())
defer os.Remove(symlinkPath)

filters := []string{
filepath.Join("**", "*.stdout.log"),
Expand All @@ -118,18 +117,17 @@ var _ = Describe("genericCpCopier", func() {
filepath.Join("some_directory", "**", "*"),
}

dstDir, err := cpCopier.FilteredCopyToTemp(srcDir, filters)
dstDir, err := cpCopier.FilteredCopyToTemp(testAssetsFixtureDir, filters)
Expect(err).ToNot(HaveOccurred())

defer os.RemoveAll(dstDir)

copiedFiles := filesInDir(dstDir)

Expect(err).ToNot(HaveOccurred())

Expect(copiedFiles[5:]).To(Equal([]string{
filepath.Join(dstDir, "symlink_dir", "app.stdout.log"),
filepath.Join(dstDir, "symlink_dir", "sub_dir", "sub_app.stdout.log"),
filepath.Join(dstDir, symlinkBasename, "app.stdout.log"),
filepath.Join(dstDir, symlinkBasename, "sub_dir", "sub_app.stdout.log"),
}))
})

Expand All @@ -142,14 +140,12 @@ var _ = Describe("genericCpCopier", func() {
})

It("fixes permissions on destination directory", func() {
srcDir := fixtureSrcDir()
filters := []string{
"**/*",
}

dstDir, err := cpCopier.FilteredCopyToTemp(srcDir, filters)
dstDir, err := cpCopier.FilteredCopyToTemp(testAssetsFixtureDir, filters)
Expect(err).ToNot(HaveOccurred())

defer os.RemoveAll(dstDir)

tarDirStat, err := os.Stat(dstDir)
Expand All @@ -159,14 +155,12 @@ var _ = Describe("genericCpCopier", func() {
})

It("copies the content of directories when specified as a filter", func() {
srcDir := fixtureSrcDir()
filters := []string{
"some_directory",
}

dstDir, err := cpCopier.FilteredCopyToTemp(srcDir, filters)
dstDir, err := cpCopier.FilteredCopyToTemp(testAssetsFixtureDir, filters)
Expect(err).ToNot(HaveOccurred())

defer os.RemoveAll(dstDir)

copiedFiles := filesInDir(dstDir)
Expand All @@ -179,18 +173,16 @@ var _ = Describe("genericCpCopier", func() {

Describe("FilteredMultiCopyToTemp", func() {
It("copies all regular files from each provided directory to temp", func() {
srcDir := fixtureSrcDir()
filters := []string{
"**/*",
}
srcDirs := []DirToCopy{
{Dir: filepath.Join(srcDir), Prefix: "first_prefix"},
{Dir: filepath.Join(srcDir, "some_directory"), Prefix: "second_prefix"},
{Dir: filepath.Join(srcDir, "some_directory")},
{Dir: filepath.Join(testAssetsFixtureDir), Prefix: "first_prefix"},
{Dir: filepath.Join(testAssetsFixtureDir, "some_directory"), Prefix: "second_prefix"},
{Dir: filepath.Join(testAssetsFixtureDir, "some_directory")},
}
dstDir, err := cpCopier.FilteredMultiCopyToTemp(srcDirs, filters)
Expect(err).ToNot(HaveOccurred())

defer os.RemoveAll(dstDir)

copiedFiles := filesInDir(dstDir)
Expand Down
Loading

0 comments on commit 9b6ac71

Please sign in to comment.