From 775529f1ff7c8a5e5199461b8015b462dbaa29b1 Mon Sep 17 00:00:00 2001 From: Florian Weingarten Date: Thu, 9 Jul 2015 10:52:44 -0400 Subject: [PATCH 1/2] Fix darwin tests --- node_test.go | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/node_test.go b/node_test.go index 73b06183b..fb1200be7 100644 --- a/node_test.go +++ b/node_test.go @@ -4,6 +4,7 @@ import ( "io/ioutil" "os" "path/filepath" + "runtime" "testing" "time" @@ -138,11 +139,33 @@ func TestNodeRestoreAt(t *testing.T) { "%v: UID doesn't match (%v != %v)", test.Type, test.UID, n2.UID) Assert(t, test.GID == n2.GID, "%v: GID doesn't match (%v != %v)", test.Type, test.GID, n2.GID) - Assert(t, test.Mode == n2.Mode, - "%v: mode doesn't match (%v != %v)", test.Type, test.Mode, n2.Mode) - Assert(t, test.ModTime == n2.ModTime, - "%v: ModTime dosn't match (%v != %v)", test.Type, test.ModTime, n2.ModTime) - Assert(t, test.AccessTime == n2.AccessTime, - "%v: AccessTime doesn't match (%v != %v)", test.Type, test.AccessTime, n2.AccessTime) + + if test.Type != "symlink" { + Assert(t, test.Mode == n2.Mode, + "%v: mode doesn't match (%v != %v)", test.Type, test.Mode, n2.Mode) + } + + AssertFsTimeEqual(t, "AccessTime", test.Type, test.AccessTime, n2.AccessTime) + AssertFsTimeEqual(t, "ModTime", test.Type, test.ModTime, n2.ModTime) } } + +func AssertFsTimeEqual(t *testing.T, label string, nodeType string, t1 time.Time, t2 time.Time) { + var equal bool + + if runtime.GOOS == "darwin" { + // Go currently doesn't support setting timestamps of symbolic links on darwin + if nodeType == "symlink" { + return + } + + // HFS+ timestamps don't support sub-second precision, + // see https://en.wikipedia.org/wiki/Comparison_of_file_systems + diff := int(t1.Sub(t2).Seconds()) + equal = diff == 0 + } else { + equal = t1.Equal(t2) + } + + Assert(t, equal, "%s: %s doesn't match (%v != %v)", label, nodeType, t1, t2) +} From c2d5a9209eec005317395ec78f727f1a41f8a1cf Mon Sep 17 00:00:00 2001 From: Florian Weingarten Date: Thu, 9 Jul 2015 11:13:40 -0400 Subject: [PATCH 2/2] fix darwin integration tests --- cmd/restic/integration_helpers_test.go | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/cmd/restic/integration_helpers_test.go b/cmd/restic/integration_helpers_test.go index b934bb0a7..8f815a0fe 100644 --- a/cmd/restic/integration_helpers_test.go +++ b/cmd/restic/integration_helpers_test.go @@ -5,6 +5,7 @@ import ( "io/ioutil" "os" "path/filepath" + "runtime" "syscall" "testing" @@ -55,25 +56,32 @@ func walkDir(dir string) <-chan *dirEntry { func (e *dirEntry) equals(other *dirEntry) bool { if e.path != other.path { - fmt.Fprintf(os.Stderr, "%v: path does not match\n", e.path) + fmt.Fprintf(os.Stderr, "%v: path does not match (%v != %v)\n", e.path, e.path, other.path) return false } if e.fi.Mode() != other.fi.Mode() { - fmt.Fprintf(os.Stderr, "%v: mode does not match\n", e.path) + fmt.Fprintf(os.Stderr, "%v: mode does not match (%v != %v)\n", e.path, e.fi.Mode(), other.fi.Mode()) return false } - if e.fi.ModTime() != other.fi.ModTime() { - fmt.Fprintf(os.Stderr, "%v: ModTime does not match\n", e.path) - return false + if runtime.GOOS != "darwin" { + if e.fi.ModTime() != other.fi.ModTime() { + fmt.Fprintf(os.Stderr, "%v: ModTime does not match (%v != %v)\n", e.path, e.fi.ModTime(), other.fi.ModTime()) + return false + } } stat, _ := e.fi.Sys().(*syscall.Stat_t) stat2, _ := other.fi.Sys().(*syscall.Stat_t) - if stat.Uid != stat2.Uid || stat2.Gid != stat2.Gid { - fmt.Fprintf(os.Stderr, "%v: UID or GID do not match\n", e.path) + if stat.Uid != stat2.Uid { + fmt.Fprintf(os.Stderr, "%v: UID does not match (%v != %v)\n", e.path, stat.Uid, stat2.Uid) + return false + } + + if stat.Gid != stat2.Gid { + fmt.Fprintf(os.Stderr, "%v: GID does not match (%v != %v)\n", e.path, stat.Gid, stat2.Gid) return false }