Index: go/src/infra/tools/cipd/local/deployer_test.go |
diff --git a/go/src/infra/tools/cipd/local/deployer_test.go b/go/src/infra/tools/cipd/local/deployer_test.go |
index c184b24c78bc0588616746b00d19fac284166cd1..a9ed4e83fffddb14a829f00e2f2688c84f34542a 100644 |
--- a/go/src/infra/tools/cipd/local/deployer_test.go |
+++ b/go/src/infra/tools/cipd/local/deployer_test.go |
@@ -11,6 +11,7 @@ import ( |
"io/ioutil" |
"os" |
"path/filepath" |
+ "runtime" |
"sort" |
"testing" |
@@ -33,8 +34,9 @@ func TestUtilities(t *testing.T) { |
So(err, ShouldBeNil) |
f.Close() |
} |
- ensureLink := func(symlinkRel string, target string) error { |
- return os.Symlink(target, filepath.Join(tempDir, symlinkRel)) |
+ ensureLink := func(symlinkRel string, target string) { |
+ err := os.Symlink(target, filepath.Join(tempDir, symlinkRel)) |
+ So(err, ShouldBeNil) |
} |
Convey("scanPackageDir works with empty dir", func() { |
@@ -52,20 +54,38 @@ func TestUtilities(t *testing.T) { |
touch("dir/b/1") |
touch("dir/.cipdpkg/abc") |
touch("dir/.cipd/abc") |
- ensureLink("dir/a/sym_link", "target") |
- files, err := scanPackageDir(filepath.Join(tempDir, "dir"), nil) |
- So(err, ShouldBeNil) |
- names := sort.StringSlice{} |
- for _, f := range files { |
- names = append(names, f.Name) |
+ |
+ runScanPackageDir := func() sort.StringSlice { |
+ files, err := scanPackageDir(filepath.Join(tempDir, "dir"), nil) |
+ So(err, ShouldBeNil) |
+ names := sort.StringSlice{} |
+ for _, f := range files { |
+ names = append(names, f.Name) |
+ } |
+ names.Sort() |
+ return names |
+ } |
+ |
+ // Symlinks doesn't work on Windows, test them only on Posix. |
+ if runtime.GOOS == "windows" { |
+ Convey("works on Windows", func() { |
+ So(runScanPackageDir(), ShouldResemble, sort.StringSlice{ |
+ "a/1", |
+ "a/2", |
+ "b/1", |
+ }) |
+ }) |
+ } else { |
+ Convey("works on Posix", func() { |
+ ensureLink("dir/a/sym_link", "target") |
+ So(runScanPackageDir(), ShouldResemble, sort.StringSlice{ |
+ "a/1", |
+ "a/2", |
+ "a/sym_link", |
+ "b/1", |
+ }) |
+ }) |
} |
- names.Sort() |
- So(names, ShouldResemble, sort.StringSlice{ |
- "a/1", |
- "a/2", |
- "a/sym_link", |
- "b/1", |
- }) |
}) |
}) |
} |
@@ -92,6 +112,10 @@ func TestDeployInstance(t *testing.T) { |
} |
func TestDeployInstanceSymlinkMode(t *testing.T) { |
+ if runtime.GOOS == "windows" { |
+ t.Skip("Skipping on Windows: no symlinks") |
+ } |
+ |
Convey("Given a temp directory", t, func() { |
tempDir, err := ioutil.TempDir("", "cipd_test") |
So(err, ShouldBeNil) |
@@ -247,7 +271,11 @@ func TestDeployInstanceSymlinkMode(t *testing.T) { |
}) |
} |
-func TestDeployInstanceCopyMode(t *testing.T) { |
+func TestDeployInstanceCopyModePosix(t *testing.T) { |
+ if runtime.GOOS == "windows" { |
+ t.Skip("Skipping on windows") |
+ } |
+ |
Convey("Given a temp directory", t, func() { |
tempDir, err := ioutil.TempDir("", "cipd_test") |
So(err, ShouldBeNil) |
@@ -375,7 +403,144 @@ func TestDeployInstanceCopyMode(t *testing.T) { |
}) |
} |
+func TestDeployInstanceCopyModeWindows(t *testing.T) { |
Vadim Sh.
2015/07/28 01:20:18
copy pasta from TestDeployInstanceCopyModePosix ad
|
+ if runtime.GOOS != "windows" { |
+ t.Skip("Skipping on posix") |
+ } |
+ |
+ Convey("Given a temp directory", t, func() { |
+ tempDir, err := ioutil.TempDir("", "cipd_test") |
+ So(err, ShouldBeNil) |
+ Reset(func() { os.RemoveAll(tempDir) }) |
+ |
+ Convey("DeployInstance new empty package instance", func() { |
+ inst := makeTestInstance("test/package", nil, InstallModeCopy) |
+ info, err := NewDeployer(tempDir, nil).DeployInstance(inst) |
+ So(err, ShouldBeNil) |
+ So(info, ShouldResemble, inst.Pin()) |
+ So(scanDir(tempDir), ShouldResemble, []string{ |
+ ".cipd/pkgs/test_package_B6R4ErK5ko/0123456789abcdef00000123456789abcdef0000/.cipdpkg/manifest.json", |
+ ".cipd/pkgs/test_package_B6R4ErK5ko/_current.txt", |
+ }) |
+ cur := readFile(tempDir, ".cipd/pkgs/test_package_B6R4ErK5ko/_current.txt") |
+ So(cur, ShouldEqual, "0123456789abcdef00000123456789abcdef0000") |
+ }) |
+ |
+ Convey("DeployInstance new non-empty package instance", func() { |
+ inst := makeTestInstance("test/package", []File{ |
+ NewTestFile("some/file/path", "data a", false), |
+ NewTestFile("some/executable", "data b", true), |
+ }, InstallModeCopy) |
+ _, err := NewDeployer(tempDir, nil).DeployInstance(inst) |
+ So(err, ShouldBeNil) |
+ So(scanDir(tempDir), ShouldResemble, []string{ |
+ ".cipd/pkgs/test_package_B6R4ErK5ko/0123456789abcdef00000123456789abcdef0000/.cipdpkg/manifest.json", |
+ ".cipd/pkgs/test_package_B6R4ErK5ko/_current.txt", |
+ "some/executable", |
+ "some/file/path", |
+ }) |
+ cur := readFile(tempDir, ".cipd/pkgs/test_package_B6R4ErK5ko/_current.txt") |
+ So(cur, ShouldEqual, "0123456789abcdef00000123456789abcdef0000") |
+ }) |
+ |
+ Convey("Redeploy same package instance", func() { |
+ inst := makeTestInstance("test/package", []File{ |
+ NewTestFile("some/file/path", "data a", false), |
+ NewTestFile("some/executable", "data b", true), |
+ }, InstallModeCopy) |
+ _, err := NewDeployer(tempDir, nil).DeployInstance(inst) |
+ So(err, ShouldBeNil) |
+ _, err = NewDeployer(tempDir, nil).DeployInstance(inst) |
+ So(err, ShouldBeNil) |
+ So(scanDir(tempDir), ShouldResemble, []string{ |
+ ".cipd/pkgs/test_package_B6R4ErK5ko/0123456789abcdef00000123456789abcdef0000/.cipdpkg/manifest.json", |
+ ".cipd/pkgs/test_package_B6R4ErK5ko/_current.txt", |
+ "some/executable", |
+ "some/file/path", |
+ }) |
+ cur := readFile(tempDir, ".cipd/pkgs/test_package_B6R4ErK5ko/_current.txt") |
+ So(cur, ShouldEqual, "0123456789abcdef00000123456789abcdef0000") |
+ }) |
+ |
+ Convey("DeployInstance package update", func() { |
+ oldPkg := makeTestInstance("test/package", []File{ |
+ NewTestFile("some/file/path", "data a old", false), |
+ NewTestFile("some/executable", "data b old", true), |
+ NewTestFile("old only", "data c old", true), |
+ NewTestFile("mode change 1", "data d", true), |
+ NewTestFile("mode change 2", "data e", false), |
+ }, InstallModeCopy) |
+ oldPkg.instanceID = "0000000000000000000000000000000000000000" |
+ |
+ newPkg := makeTestInstance("test/package", []File{ |
+ NewTestFile("some/file/path", "data a new", false), |
+ NewTestFile("some/executable", "data b new", true), |
+ NewTestFile("mode change 1", "data d", false), |
+ NewTestFile("mode change 2", "data d", true), |
+ }, InstallModeCopy) |
+ newPkg.instanceID = "1111111111111111111111111111111111111111" |
+ |
+ _, err := NewDeployer(tempDir, nil).DeployInstance(oldPkg) |
+ So(err, ShouldBeNil) |
+ _, err = NewDeployer(tempDir, nil).DeployInstance(newPkg) |
+ So(err, ShouldBeNil) |
+ |
+ So(scanDir(tempDir), ShouldResemble, []string{ |
+ ".cipd/pkgs/test_package_B6R4ErK5ko/1111111111111111111111111111111111111111/.cipdpkg/manifest.json", |
+ ".cipd/pkgs/test_package_B6R4ErK5ko/_current.txt", |
+ "mode change 1", |
+ "mode change 2", |
+ "some/executable", |
+ "some/file/path", |
+ }) |
+ cur := readFile(tempDir, ".cipd/pkgs/test_package_B6R4ErK5ko/_current.txt") |
+ So(cur, ShouldEqual, "1111111111111111111111111111111111111111") |
+ }) |
+ |
+ Convey("DeployInstance two different packages", func() { |
+ pkg1 := makeTestInstance("test/package", []File{ |
+ NewTestFile("some/file/path", "data a old", false), |
+ NewTestFile("some/executable", "data b old", true), |
+ NewTestFile("pkg1 file", "data c", false), |
+ }, InstallModeCopy) |
+ pkg1.instanceID = "0000000000000000000000000000000000000000" |
+ |
+ // Nesting in package names is allowed. |
+ pkg2 := makeTestInstance("test/package/another", []File{ |
+ NewTestFile("some/file/path", "data a new", false), |
+ NewTestFile("some/executable", "data b new", true), |
+ NewTestFile("pkg2 file", "data d", false), |
+ }, InstallModeCopy) |
+ pkg2.instanceID = "1111111111111111111111111111111111111111" |
+ |
+ _, err := NewDeployer(tempDir, nil).DeployInstance(pkg1) |
+ So(err, ShouldBeNil) |
+ _, err = NewDeployer(tempDir, nil).DeployInstance(pkg2) |
+ So(err, ShouldBeNil) |
+ |
+ So(scanDir(tempDir), ShouldResemble, []string{ |
+ ".cipd/pkgs/package_another_4HL4H61fGm/1111111111111111111111111111111111111111/.cipdpkg/manifest.json", |
+ ".cipd/pkgs/package_another_4HL4H61fGm/_current.txt", |
+ ".cipd/pkgs/test_package_B6R4ErK5ko/0000000000000000000000000000000000000000/.cipdpkg/manifest.json", |
+ ".cipd/pkgs/test_package_B6R4ErK5ko/_current.txt", |
+ "pkg1 file", |
+ "pkg2 file", |
+ "some/executable", |
+ "some/file/path", |
+ }) |
+ cur1 := readFile(tempDir, ".cipd/pkgs/package_another_4HL4H61fGm/_current.txt") |
+ So(cur1, ShouldEqual, "1111111111111111111111111111111111111111") |
+ cur2 := readFile(tempDir, ".cipd/pkgs/test_package_B6R4ErK5ko/_current.txt") |
+ So(cur2, ShouldEqual, "0000000000000000000000000000000000000000") |
+ }) |
+ }) |
+} |
+ |
func TestDeployInstanceSwitchingModes(t *testing.T) { |
+ if runtime.GOOS == "windows" { |
+ t.Skip("Skipping on Windows: no symlinks") |
+ } |
+ |
Convey("Given a temp directory", t, func() { |
tempDir, err := ioutil.TempDir("", "cipd_test") |
So(err, ShouldBeNil) |
@@ -470,7 +635,7 @@ func TestFindDeployed(t *testing.T) { |
}) |
} |
-func TestRemoveDeployed(t *testing.T) { |
+func TestRemoveDeployedCommon(t *testing.T) { |
Convey("Given a temp directory", t, func() { |
tempDir, err := ioutil.TempDir("", "cipd_test") |
So(err, ShouldBeNil) |
@@ -480,6 +645,18 @@ func TestRemoveDeployed(t *testing.T) { |
err := NewDeployer(tempDir, nil).RemoveDeployed("package/path") |
So(err, ShouldBeNil) |
}) |
+ }) |
+} |
+ |
+func TestRemoveDeployedPosix(t *testing.T) { |
+ if runtime.GOOS == "windows" { |
+ t.Skip("Skipping on windows") |
+ } |
+ |
+ Convey("Given a temp directory", t, func() { |
+ tempDir, err := ioutil.TempDir("", "cipd_test") |
+ So(err, ShouldBeNil) |
+ Reset(func() { os.RemoveAll(tempDir) }) |
Convey("RemoveDeployed works", func() { |
d := NewDeployer(tempDir, nil) |
@@ -516,6 +693,50 @@ func TestRemoveDeployed(t *testing.T) { |
}) |
} |
+func TestRemoveDeployedWindows(t *testing.T) { |
+ if runtime.GOOS != "windows" { |
+ t.Skip("Skipping on posix") |
+ } |
+ |
+ Convey("Given a temp directory", t, func() { |
+ tempDir, err := ioutil.TempDir("", "cipd_test") |
+ So(err, ShouldBeNil) |
+ Reset(func() { os.RemoveAll(tempDir) }) |
+ |
+ Convey("RemoveDeployed works", func() { |
+ d := NewDeployer(tempDir, nil) |
+ |
+ // Deploy some instance (to keep it). |
+ inst := makeTestInstance("test/package/123", []File{ |
+ NewTestFile("some/file/path1", "data a", false), |
+ NewTestFile("some/executable1", "data b", true), |
+ }, InstallModeCopy) |
+ _, err := d.DeployInstance(inst) |
+ So(err, ShouldBeNil) |
+ |
+ // Deploy another instance (to remove it). |
+ inst = makeTestInstance("test/package", []File{ |
+ NewTestFile("some/file/path2", "data a", false), |
+ NewTestFile("some/executable2", "data b", true), |
+ }, InstallModeCopy) |
+ _, err = d.DeployInstance(inst) |
+ So(err, ShouldBeNil) |
+ |
+ // Now remove the second package. |
+ err = d.RemoveDeployed("test/package") |
+ So(err, ShouldBeNil) |
+ |
+ // Verify the final state (only first package should survive). |
+ So(scanDir(tempDir), ShouldResemble, []string{ |
+ ".cipd/pkgs/package_123_Wnok5l4iFr/0123456789abcdef00000123456789abcdef0000/.cipdpkg/manifest.json", |
+ ".cipd/pkgs/package_123_Wnok5l4iFr/_current.txt", |
+ "some/executable1", |
+ "some/file/path1", |
+ }) |
+ }) |
+ }) |
+} |
+ |
//////////////////////////////////////////////////////////////////////////////// |
type testPackageInstance struct { |
@@ -596,3 +817,11 @@ func scanDir(root string) (out []string) { |
} |
return |
} |
+ |
+// readFile reads content of an existing text file. Root path is provided as |
+// a native path, rel - as a slash-separated path. |
+func readFile(root, rel string) string { |
+ body, err := ioutil.ReadFile(filepath.Join(root, filepath.FromSlash(rel))) |
+ So(err, ShouldBeNil) |
+ return string(body) |
+} |