diff options
author | Jakob Unterwurzacher | 2016-10-19 22:25:54 +0200 |
---|---|---|
committer | Jakob Unterwurzacher | 2016-10-19 22:25:54 +0200 |
commit | 589748548f24429bb30a8aafb3cae0d295b07da0 (patch) | |
tree | 24f60b0d7c199e8da75236747c9bf0a0f2d2da5c | |
parent | 600ceece359d835934ad039bdd0e83cd647c410f (diff) |
tests: add 1980.tar.gz extract test
Test that we get the right timestamp when extracting a tarball.
Also simplify the workaround in doTestUtimesNano() and fix the
fact that it was running no test at all.
-rw-r--r-- | internal/fusefrontend/file.go | 19 | ||||
-rw-r--r-- | tests/defaults/main_test.go | 20 | ||||
-rw-r--r-- | tests/matrix/matrix_test.go | 17 |
3 files changed, 35 insertions, 21 deletions
diff --git a/internal/fusefrontend/file.go b/internal/fusefrontend/file.go index 2692c70..e021962 100644 --- a/internal/fusefrontend/file.go +++ b/internal/fusefrontend/file.go @@ -386,19 +386,20 @@ func (f *file) GetAttr(a *fuse.Attr) fuse.Status { return fuse.OK } -// BrokenAtimeOmit means that atime support is broken. +// BrokenAtime means that atime support is broken. // TODO drop this once https://github.com/hanwen/go-fuse/pull/131 is // merged -const BrokenAtimeOmit = true +const BrokenAtime = true func (f *file) Utimens(a *time.Time, m *time.Time) fuse.Status { - if BrokenAtimeOmit { - // Band-aid for a nil pointer crash, described in - // https://github.com/rfjakob/gocryptfs/issues/48 - // Also band-aid for "mtime gets set to atime". - // - // TODO drop this once https://github.com/hanwen/go-fuse/pull/131 is - // merged + if BrokenAtime { + if m == nil { + tlog.Warn.Printf("refusing to set the atime to prevent a crash in go-fuse") + return fuse.EINVAL + } + // Due to a bug in loopbackFile.Utimens, the "a" value will be used + // to set both mtime and atime. Because mtime is more important, we + // override "a". a = m } f.fdLock.RLock() diff --git a/tests/defaults/main_test.go b/tests/defaults/main_test.go index a623c48..849aa69 100644 --- a/tests/defaults/main_test.go +++ b/tests/defaults/main_test.go @@ -3,6 +3,7 @@ package defaults import ( "os" + "os/exec" "testing" "github.com/rfjakob/gocryptfs/tests/test_helpers" @@ -15,3 +16,22 @@ func TestMain(m *testing.M) { test_helpers.UnmountPanic(test_helpers.DefaultPlainDir) os.Exit(r) } + +// Test that we get the right timestamp when extracting a tarball. +func Test1980Tar(t *testing.T) { + c := exec.Command("tar", "xzf", "1980.tar.gz", "-C", test_helpers.DefaultPlainDir) + c.Stderr = os.Stderr + c.Stdout = os.Stdout + err := c.Run() + if err != nil { + t.Fatal(err) + } + fi, err := os.Stat(test_helpers.DefaultPlainDir + "/1980.txt") + if err != nil { + t.Fatal(err) + } + m := fi.ModTime().Unix() + if m != 315619323 { + t.Errorf("Wrong mtime: %d", m) + } +} diff --git a/tests/matrix/matrix_test.go b/tests/matrix/matrix_test.go index 9d42115..05b58ee 100644 --- a/tests/matrix/matrix_test.go +++ b/tests/matrix/matrix_test.go @@ -660,21 +660,10 @@ type utimesTestcaseStruct struct { func compareUtimes(want [2]syscall.Timespec, actual [2]syscall.Timespec) error { tsNames := []string{"atime", "mtime"} for i := range want { - if fusefrontend.BrokenAtimeOmit && i == 0 { - // Don't check atime. It's broken in go-fuse. - // TODO remove this once the pull request is merged: - // https://github.com/hanwen/go-fuse/pull/131 - continue - } if want[i].Sec != actual[i].Sec { return fmt.Errorf("Wrong %s seconds: want=%d actual=%d", tsNames[i], want[i].Sec, actual[i].Sec) } if want[i].Nsec != actual[i].Nsec { - if actual[i].Nsec == 0 { - // TODO remove this once the pull request is merged: - // https://github.com/hanwen/go-fuse/pull/131 - continue - } return fmt.Errorf("Wrong %s nanoseconds: want=%d actual=%d", tsNames[i], want[i].Nsec, actual[i].Nsec) } } @@ -688,6 +677,10 @@ const _UTIME_OMIT = ((1 << 30) - 2) func doTestUtimesNano(t *testing.T, path string) { utimeTestcases := []utimesTestcaseStruct{ { + in: [2]syscall.Timespec{{Sec: 50, Nsec: 0}, {Sec: 50, Nsec: 0}}, + out: [2]syscall.Timespec{{Sec: 50, Nsec: 0}, {Sec: 50, Nsec: 0}}, + }, + { in: [2]syscall.Timespec{{Sec: 1, Nsec: 2}, {Sec: 3, Nsec: 4}}, out: [2]syscall.Timespec{{Sec: 1, Nsec: 2}, {Sec: 3, Nsec: 4}}, }, @@ -703,7 +696,7 @@ func doTestUtimesNano(t *testing.T, path string) { if fusefrontend.BrokenAtimeOmit { // TODO remove this once the pull request is merged: // https://github.com/hanwen/go-fuse/pull/131 - utimeTestcases = utimeTestcases[0:0] + utimeTestcases = utimeTestcases[:1] } for i, tc := range utimeTestcases { err := syscall.UtimesNano(path, tc.in[:]) |