| Index: go/src/infra/tools/cipd/files_test.go
|
| diff --git a/go/src/infra/tools/cipd/files_test.go b/go/src/infra/tools/cipd/files_test.go
|
| deleted file mode 100644
|
| index 3e53af341e151e86d9c647142f030ac34902cc78..0000000000000000000000000000000000000000
|
| --- a/go/src/infra/tools/cipd/files_test.go
|
| +++ /dev/null
|
| @@ -1,474 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -package cipd
|
| -
|
| -import (
|
| - "io/ioutil"
|
| - "os"
|
| - "path/filepath"
|
| - "testing"
|
| -
|
| - . "github.com/smartystreets/goconvey/convey"
|
| -)
|
| -
|
| -func TestScanFileSystem(t *testing.T) {
|
| - Convey("Given a temp directory", t, func() {
|
| - tempDir, err := ioutil.TempDir("", "cipd_test")
|
| - So(err, ShouldBeNil)
|
| - Reset(func() { os.RemoveAll(tempDir) })
|
| -
|
| - Convey("Scan empty dir works", func() {
|
| - files, err := ScanFileSystem(tempDir, tempDir, nil)
|
| - So(files, ShouldBeEmpty)
|
| - So(err, ShouldBeNil)
|
| - })
|
| -
|
| - Convey("Discovering single file works", func() {
|
| - writeFile(tempDir, "single_file", "12345", 0666)
|
| - files, err := ScanFileSystem(tempDir, tempDir, nil)
|
| - So(len(files), ShouldEqual, 1)
|
| - So(err, ShouldBeNil)
|
| -
|
| - file := files[0]
|
| - So(file.Name(), ShouldEqual, "single_file")
|
| - So(file.Size(), ShouldEqual, uint64(5))
|
| - So(file.Executable(), ShouldBeFalse)
|
| -
|
| - r, err := file.Open()
|
| - if r != nil {
|
| - defer r.Close()
|
| - }
|
| - So(err, ShouldBeNil)
|
| - buf, err := ioutil.ReadAll(r)
|
| - So(buf, ShouldResemble, []byte("12345"))
|
| - So(err, ShouldBeNil)
|
| - })
|
| -
|
| - Convey("Discovering single executable file works", func() {
|
| - writeFile(tempDir, "single_file", "12345", 0766)
|
| - files, err := ScanFileSystem(tempDir, tempDir, nil)
|
| - So(len(files), ShouldEqual, 1)
|
| - So(err, ShouldBeNil)
|
| - file := files[0]
|
| - So(file.Executable(), ShouldBeTrue)
|
| - })
|
| -
|
| - Convey("Relative symlink to outside of package cause error", func() {
|
| - writeSymlink(tempDir, "a/b1/rel_symlink", filepath.FromSlash("../../.."))
|
| - _, err := ScanFileSystem(tempDir, tempDir, nil)
|
| - So(err, ShouldNotBeNil)
|
| - })
|
| -
|
| - Convey("Enumerating subdirectories", func() {
|
| - writeFile(tempDir, "a", "", 0666)
|
| - writeFile(tempDir, "b", "", 0666)
|
| - writeFile(tempDir, "1/a", "", 0666)
|
| - writeFile(tempDir, "1/b", "", 0666)
|
| - writeFile(tempDir, "1/2/a", "", 0666)
|
| - files, err := ScanFileSystem(tempDir, tempDir, nil)
|
| - So(err, ShouldBeNil)
|
| - names := []string{}
|
| - for _, f := range files {
|
| - names = append(names, f.Name())
|
| - }
|
| - // Order matters. Slashes matters.
|
| - So(names, ShouldResemble, []string{
|
| - "1/2/a",
|
| - "1/a",
|
| - "1/b",
|
| - "a",
|
| - "b",
|
| - })
|
| - })
|
| -
|
| - Convey("Empty subdirectories are skipped", func() {
|
| - mkDir(tempDir, "a")
|
| - mkDir(tempDir, "1/2/3")
|
| - mkDir(tempDir, "1/c")
|
| - writeFile(tempDir, "1/d/file", "1234", 0666)
|
| - files, err := ScanFileSystem(tempDir, tempDir, nil)
|
| - So(len(files), ShouldEqual, 1)
|
| - So(err, ShouldBeNil)
|
| - So(files[0].Name(), ShouldEqual, "1/d/file")
|
| - })
|
| -
|
| - Convey("Non root start path works", func() {
|
| - writeFile(tempDir, "a", "", 0666)
|
| - writeFile(tempDir, "b", "", 0666)
|
| - writeFile(tempDir, "1/a", "", 0666)
|
| - writeFile(tempDir, "1/b", "", 0666)
|
| - writeFile(tempDir, "1/2/a", "", 0666)
|
| - files, err := ScanFileSystem(filepath.Join(tempDir, "1"), tempDir, nil)
|
| - So(err, ShouldBeNil)
|
| - names := []string{}
|
| - for _, f := range files {
|
| - names = append(names, f.Name())
|
| - }
|
| - // Order matters. Slashes matters.
|
| - So(names, ShouldResemble, []string{
|
| - "1/2/a",
|
| - "1/a",
|
| - "1/b",
|
| - })
|
| - })
|
| -
|
| - Convey("Start path must be under root", func() {
|
| - _, err := ScanFileSystem(filepath.Dir(tempDir), tempDir, nil)
|
| - So(err, ShouldNotBeNil)
|
| - })
|
| -
|
| - Convey("Exclude filter works", func() {
|
| - writeFile(tempDir, "a", "", 0666)
|
| - writeFile(tempDir, "b", "", 0666)
|
| - writeFile(tempDir, "1/a", "", 0666)
|
| - writeFile(tempDir, "1/b", "", 0666)
|
| - writeFile(tempDir, "1/2/a", "", 0666)
|
| -
|
| - // Exclude "a" and entire "1/" directory.
|
| - excluderCalls := []string{}
|
| - excluder := func(abs string) bool {
|
| - excluderCalls = append(excluderCalls, abs)
|
| - if abs == filepath.Join(tempDir, "a") {
|
| - return true
|
| - }
|
| - if abs == filepath.Join(tempDir, "1") {
|
| - return true
|
| - }
|
| - return false
|
| - }
|
| -
|
| - files, err := ScanFileSystem(tempDir, tempDir, excluder)
|
| - So(err, ShouldBeNil)
|
| - So(len(files), ShouldEqual, 1)
|
| - So(files[0].Name(), ShouldEqual, "b")
|
| -
|
| - // "1/*" subdir should have been skipped completely.
|
| - So(excluderCalls, ShouldResemble, []string{
|
| - filepath.Join(tempDir, "1"),
|
| - filepath.Join(tempDir, "a"),
|
| - filepath.Join(tempDir, "b"),
|
| - })
|
| - })
|
| - })
|
| -}
|
| -
|
| -func TestWrapFile(t *testing.T) {
|
| - Convey("Given a temp directory", t, func() {
|
| - tempDir, err := ioutil.TempDir("", "cipd_test")
|
| - So(err, ShouldBeNil)
|
| - Reset(func() { os.RemoveAll(tempDir) })
|
| -
|
| - Convey("WrapFile simple file works", func() {
|
| - writeFile(tempDir, "dir/a/b", "12345", 0666)
|
| - out, err := WrapFile(filepath.Join(tempDir, "dir", "a", "b"), tempDir, nil)
|
| - So(err, ShouldBeNil)
|
| - So(out.Name(), ShouldEqual, "dir/a/b")
|
| - })
|
| -
|
| - Convey("WrapFile executable file works", func() {
|
| - writeFile(tempDir, "single_file", "12345", 0766)
|
| - out, err := WrapFile(filepath.Join(tempDir, "single_file"), tempDir, nil)
|
| - So(err, ShouldBeNil)
|
| - So(out.Executable(), ShouldBeTrue)
|
| - })
|
| -
|
| - Convey("WrapFile directory fails", func() {
|
| - mkDir(tempDir, "dir")
|
| - _, err := WrapFile(filepath.Join(tempDir, "dir"), tempDir, nil)
|
| - So(err, ShouldNotBeNil)
|
| - })
|
| -
|
| - Convey("WrapFile outside of root fails", func() {
|
| - mkDir(tempDir, "a")
|
| - writeFile(tempDir, "b", "body", 0666)
|
| - _, err := WrapFile(filepath.Join(tempDir, "b"), filepath.Join(tempDir, "a"), nil)
|
| - So(err, ShouldNotBeNil)
|
| - })
|
| -
|
| - Convey("WrapFile outside of root fails (tricky path)", func() {
|
| - mkDir(tempDir, "a")
|
| - // "abc" starts with "a", it tricks naive string.HasPrefix subpath check.
|
| - writeFile(tempDir, "abc", "body", 0666)
|
| - _, err := WrapFile(filepath.Join(tempDir, "abc"), filepath.Join(tempDir, "a"), nil)
|
| - So(err, ShouldNotBeNil)
|
| - })
|
| -
|
| - Convey("WrapFile rel symlink in root", func() {
|
| - writeSymlink(tempDir, "a/b/c", filepath.FromSlash("../../d"))
|
| - mkDir(tempDir, "d")
|
| - out, err := WrapFile(filepath.Join(tempDir, "a", "b", "c"), tempDir, nil)
|
| - So(err, ShouldBeNil)
|
| - ensureSymlinkTarget(out, "../../d")
|
| - })
|
| -
|
| - Convey("WrapFile rel symlink outside root", func() {
|
| - writeSymlink(tempDir, "a/b/c", filepath.FromSlash("../../../d"))
|
| - _, err := WrapFile(filepath.Join(tempDir, "a", "b", "c"), tempDir, nil)
|
| - So(err, ShouldNotBeNil)
|
| - })
|
| -
|
| - Convey("WrapFile abs symlink in root", func() {
|
| - writeSymlink(tempDir, "a/b/c", filepath.Join(tempDir, "a", "d"))
|
| - out, err := WrapFile(filepath.Join(tempDir, "a", "b", "c"), tempDir, nil)
|
| - So(err, ShouldBeNil)
|
| - ensureSymlinkTarget(out, "../d")
|
| - })
|
| -
|
| - Convey("WrapFile abs symlink outside root", func() {
|
| - writeSymlink(tempDir, "a/b/c", filepath.Dir(tempDir))
|
| - out, err := WrapFile(filepath.Join(tempDir, "a", "b", "c"), tempDir, nil)
|
| - So(err, ShouldBeNil)
|
| - ensureSymlinkTarget(out, filepath.ToSlash(filepath.Dir(tempDir)))
|
| - })
|
| - })
|
| -}
|
| -
|
| -func mkDir(root string, path string) {
|
| - abs := filepath.Join(root, filepath.FromSlash(path))
|
| - err := os.MkdirAll(abs, 0777)
|
| - if err != nil {
|
| - panic("Failed to create a directory under temp directory")
|
| - }
|
| -}
|
| -
|
| -func writeFile(root string, path string, data string, mode os.FileMode) {
|
| - abs := filepath.Join(root, filepath.FromSlash(path))
|
| - os.MkdirAll(filepath.Dir(abs), 0777)
|
| - err := ioutil.WriteFile(abs, []byte(data), mode)
|
| - if err != nil {
|
| - panic("Failed to write a temp file")
|
| - }
|
| -}
|
| -
|
| -func writeSymlink(root string, path string, target string) {
|
| - abs := filepath.Join(root, filepath.FromSlash(path))
|
| - os.MkdirAll(filepath.Dir(abs), 0777)
|
| - err := os.Symlink(target, abs)
|
| - if err != nil {
|
| - panic("Failed to create symlink")
|
| - }
|
| -}
|
| -
|
| -func ensureSymlinkTarget(file File, target string) {
|
| - So(file.Symlink(), ShouldBeTrue)
|
| - discoveredTarget, err := file.SymlinkTarget()
|
| - So(err, ShouldBeNil)
|
| - So(discoveredTarget, ShouldEqual, target)
|
| -}
|
| -
|
| -func TestFileSystemDestination(t *testing.T) {
|
| - Convey("Given a temp directory", t, func() {
|
| - tempDir, err := ioutil.TempDir("", "cipd_test")
|
| - destDir := filepath.Join(tempDir, "dest")
|
| - So(err, ShouldBeNil)
|
| - dest := NewFileSystemDestination(destDir)
|
| - Reset(func() { os.RemoveAll(tempDir) })
|
| -
|
| - writeFileToDest := func(name string, executable bool, data string) {
|
| - writer, err := dest.CreateFile(name, executable)
|
| - if writer != nil {
|
| - defer writer.Close()
|
| - }
|
| - So(err, ShouldBeNil)
|
| - _, err = writer.Write([]byte(data))
|
| - So(err, ShouldBeNil)
|
| - }
|
| -
|
| - writeSymlinkToDest := func(name string, target string) {
|
| - err := dest.CreateSymlink(name, target)
|
| - So(err, ShouldBeNil)
|
| - }
|
| -
|
| - Convey("Empty success write works", func() {
|
| - So(dest.Begin(), ShouldBeNil)
|
| - So(dest.End(true), ShouldBeNil)
|
| -
|
| - // Should create a new directory.
|
| - stat, err := os.Stat(destDir)
|
| - So(err, ShouldBeNil)
|
| - So(stat.IsDir(), ShouldBeTrue)
|
| -
|
| - // And it should be empty.
|
| - files, err := ScanFileSystem(destDir, destDir, nil)
|
| - So(err, ShouldBeNil)
|
| - So(len(files), ShouldEqual, 0)
|
| - })
|
| -
|
| - Convey("Empty failed write works", func() {
|
| - So(dest.Begin(), ShouldBeNil)
|
| - So(dest.End(false), ShouldBeNil)
|
| -
|
| - // Doesn't create a directory.
|
| - _, err := os.Stat(destDir)
|
| - So(os.IsNotExist(err), ShouldBeTrue)
|
| - })
|
| -
|
| - Convey("Double begin or double end fails", func() {
|
| - So(dest.Begin(), ShouldBeNil)
|
| - So(dest.Begin(), ShouldNotBeNil)
|
| - So(dest.End(true), ShouldBeNil)
|
| - So(dest.End(true), ShouldNotBeNil)
|
| - })
|
| -
|
| - Convey("CreateFile works only when destination is open", func() {
|
| - wr, err := dest.CreateFile("testing", true)
|
| - So(wr, ShouldBeNil)
|
| - So(err, ShouldNotBeNil)
|
| - })
|
| -
|
| - Convey("CreateFile rejects invalid relative paths", func() {
|
| - So(dest.Begin(), ShouldBeNil)
|
| - defer dest.End(true)
|
| -
|
| - // Rel path that is still inside the package is ok.
|
| - wr, err := dest.CreateFile("a/b/c/../../../d", false)
|
| - So(err, ShouldBeNil)
|
| - wr.Close()
|
| -
|
| - // Rel path pointing outside is forbidden.
|
| - _, err = dest.CreateFile("a/b/c/../../../../d", false)
|
| - So(err, ShouldNotBeNil)
|
| - })
|
| -
|
| - Convey("CreateSymlink rejects invalid relative paths", func() {
|
| - So(dest.Begin(), ShouldBeNil)
|
| - defer dest.End(true)
|
| -
|
| - // Rel symlink to a file inside the destination is OK.
|
| - So(dest.CreateSymlink("a/b/c", "../.."), ShouldBeNil)
|
| - // Rel symlink to a file outside -> error.
|
| - So(dest.CreateSymlink("a/b/c", "../../.."), ShouldNotBeNil)
|
| - })
|
| -
|
| - Convey("Committing bunch of files works", func() {
|
| - So(dest.Begin(), ShouldBeNil)
|
| - writeFileToDest("a", false, "a data")
|
| - writeFileToDest("exe", true, "exe data")
|
| - writeFileToDest("dir/c", false, "dir/c data")
|
| - writeFileToDest("dir/dir/d", false, "dir/dir/c data")
|
| - writeSymlinkToDest("abs_symlink", filepath.FromSlash(tempDir))
|
| - writeSymlinkToDest("dir/dir/rel_symlink", "../../a")
|
| - So(dest.End(true), ShouldBeNil)
|
| -
|
| - // Ensure everything is there.
|
| - files, err := ScanFileSystem(destDir, destDir, nil)
|
| - So(err, ShouldBeNil)
|
| - names := []string{}
|
| - for _, f := range files {
|
| - names = append(names, f.Name())
|
| - }
|
| - So(names, ShouldResemble, []string{
|
| - "a",
|
| - "abs_symlink",
|
| - "dir/c",
|
| - "dir/dir/d",
|
| - "dir/dir/rel_symlink",
|
| - "exe",
|
| - })
|
| -
|
| - // Ensure data is valid (check first file only).
|
| - r, err := files[0].Open()
|
| - if r != nil {
|
| - defer r.Close()
|
| - }
|
| - So(err, ShouldBeNil)
|
| - data, err := ioutil.ReadAll(r)
|
| - So(err, ShouldBeNil)
|
| - So(data, ShouldResemble, []byte("a data"))
|
| -
|
| - // Ensure file mode is valid.
|
| - So(files[5].Name(), ShouldEqual, "exe")
|
| - So(files[5].Executable(), ShouldBeTrue)
|
| -
|
| - // Ensure absolute symlink if valid.
|
| - So(files[1].Name(), ShouldEqual, "abs_symlink")
|
| - ensureSymlinkTarget(files[1], filepath.FromSlash(tempDir))
|
| -
|
| - // Ensure relative symlink is valid.
|
| - So(files[4].Name(), ShouldEqual, "dir/dir/rel_symlink")
|
| - ensureSymlinkTarget(files[4], "../../a")
|
| -
|
| - // Ensure no temp files left.
|
| - allFiles, err := ScanFileSystem(tempDir, tempDir, nil)
|
| - So(len(allFiles), ShouldEqual, len(files))
|
| - })
|
| -
|
| - Convey("Rolling back bunch of files works", func() {
|
| - So(dest.Begin(), ShouldBeNil)
|
| - writeFileToDest("a", false, "a data")
|
| - writeFileToDest("dir/c", false, "dir/c data")
|
| - writeSymlinkToDest("dir/d", "c")
|
| - So(dest.End(false), ShouldBeNil)
|
| -
|
| - // No dest directory.
|
| - _, err := os.Stat(destDir)
|
| - So(os.IsNotExist(err), ShouldBeTrue)
|
| -
|
| - // Ensure no temp files left.
|
| - allFiles, err := ScanFileSystem(tempDir, tempDir, nil)
|
| - So(len(allFiles), ShouldEqual, 0)
|
| - })
|
| -
|
| - Convey("Overwriting a directory works", func() {
|
| - // Create dest directory manually with some stuff.
|
| - err := os.Mkdir(destDir, 0777)
|
| - So(err, ShouldBeNil)
|
| - err = ioutil.WriteFile(filepath.Join(destDir, "data"), []byte("data"), 0666)
|
| - So(err, ShouldBeNil)
|
| -
|
| - // Now deploy something to it.
|
| - So(dest.Begin(), ShouldBeNil)
|
| - writeFileToDest("a", false, "a data")
|
| - writeSymlinkToDest("b", "a")
|
| - So(dest.End(true), ShouldBeNil)
|
| -
|
| - // Overwritten.
|
| - files, err := ScanFileSystem(destDir, destDir, nil)
|
| - So(err, ShouldBeNil)
|
| - So(len(files), ShouldEqual, 2)
|
| - So(files[0].Name(), ShouldEqual, "a")
|
| - So(files[1].Name(), ShouldEqual, "b")
|
| - })
|
| -
|
| - Convey("Not overwriting a directory works", func() {
|
| - // Create dest directory manually with some stuff.
|
| - err := os.Mkdir(destDir, 0777)
|
| - So(err, ShouldBeNil)
|
| - err = ioutil.WriteFile(filepath.Join(destDir, "data"), []byte("data"), 0666)
|
| - So(err, ShouldBeNil)
|
| -
|
| - // Now attempt deploy something to it, but roll back.
|
| - So(dest.Begin(), ShouldBeNil)
|
| - writeFileToDest("a", false, "a data")
|
| - writeSymlinkToDest("b", "a")
|
| - So(dest.End(false), ShouldBeNil)
|
| -
|
| - // Kept as is.
|
| - files, err := ScanFileSystem(destDir, destDir, nil)
|
| - So(err, ShouldBeNil)
|
| - So(len(files), ShouldEqual, 1)
|
| - So(files[0].Name(), ShouldEqual, "data")
|
| - })
|
| -
|
| - Convey("Opening file twice fails", func() {
|
| - So(dest.Begin(), ShouldBeNil)
|
| - writeFileToDest("a", false, "a data")
|
| - w, err := dest.CreateFile("a", false)
|
| - So(w, ShouldBeNil)
|
| - So(err, ShouldNotBeNil)
|
| - So(dest.End(true), ShouldBeNil)
|
| - })
|
| -
|
| - Convey("End with opened files fail", func() {
|
| - So(dest.Begin(), ShouldBeNil)
|
| - w, err := dest.CreateFile("a", false)
|
| - So(w, ShouldNotBeNil)
|
| - So(err, ShouldBeNil)
|
| - So(dest.End(true), ShouldNotBeNil)
|
| - w.Close()
|
| - So(dest.End(true), ShouldBeNil)
|
| - })
|
| - })
|
| -}
|
|
|