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
 	}
 
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)
+}