Commit ab724f92 authored by Russ Cox's avatar Russ Cox

os, syscall: test Chtimes on directories, fix on Windows

Fixes #8090.

LGTM=alex.brainman
R=alex.brainman
CC=golang-codereviews
https://golang.org/cl/154020043
parent 4731c382
...@@ -124,7 +124,22 @@ func newFile(testName string, t *testing.T) (f *File) { ...@@ -124,7 +124,22 @@ func newFile(testName string, t *testing.T) (f *File) {
} }
f, err := ioutil.TempFile(dir, "_Go_"+testName) f, err := ioutil.TempFile(dir, "_Go_"+testName)
if err != nil { if err != nil {
t.Fatalf("open %s: %s", testName, err) t.Fatalf("TempFile %s: %s", testName, err)
}
return
}
func newDir(testName string, t *testing.T) (name string) {
// Use a local file system, not NFS.
// On Unix, override $TMPDIR in case the user
// has it set to an NFS-mounted directory.
dir := ""
if runtime.GOOS != "android" && runtime.GOOS != "windows" {
dir = "/tmp"
}
name, err := ioutil.TempDir(dir, "_Go_"+testName)
if err != nil {
t.Fatalf("TempDir %s: %s", testName, err)
} }
return return
} }
...@@ -755,35 +770,49 @@ func TestTruncate(t *testing.T) { ...@@ -755,35 +770,49 @@ func TestTruncate(t *testing.T) {
} }
} }
// Use TempDir() to make sure we're on a local file system, // Use TempDir (via newFile) to make sure we're on a local file system,
// so that timings are not distorted by latency and caching. // so that timings are not distorted by latency and caching.
// On NFS, timings can be off due to caching of meta-data on // On NFS, timings can be off due to caching of meta-data on
// NFS servers (Issue 848). // NFS servers (Issue 848).
func TestChtimes(t *testing.T) { func TestChtimes(t *testing.T) {
f := newFile("TestChtimes", t) f := newFile("TestChtimes", t)
defer Remove(f.Name()) defer Remove(f.Name())
defer f.Close()
f.Write([]byte("hello, world\n")) f.Write([]byte("hello, world\n"))
f.Close() f.Close()
st, err := Stat(f.Name()) testChtimes(t, f.Name())
}
// Use TempDir (via newDir) to make sure we're on a local file system,
// so that timings are not distorted by latency and caching.
// On NFS, timings can be off due to caching of meta-data on
// NFS servers (Issue 848).
func TestChtimesDir(t *testing.T) {
name := newDir("TestChtimes", t)
defer RemoveAll(name)
testChtimes(t, name)
}
func testChtimes(t *testing.T, name string) {
st, err := Stat(name)
if err != nil { if err != nil {
t.Fatalf("Stat %s: %s", f.Name(), err) t.Fatalf("Stat %s: %s", name, err)
} }
preStat := st preStat := st
// Move access and modification time back a second // Move access and modification time back a second
at := Atime(preStat) at := Atime(preStat)
mt := preStat.ModTime() mt := preStat.ModTime()
err = Chtimes(f.Name(), at.Add(-time.Second), mt.Add(-time.Second)) err = Chtimes(name, at.Add(-time.Second), mt.Add(-time.Second))
if err != nil { if err != nil {
t.Fatalf("Chtimes %s: %s", f.Name(), err) t.Fatalf("Chtimes %s: %s", name, err)
} }
st, err = Stat(f.Name()) st, err = Stat(name)
if err != nil { if err != nil {
t.Fatalf("second Stat %s: %s", f.Name(), err) t.Fatalf("second Stat %s: %s", name, err)
} }
postStat := st postStat := st
......
...@@ -468,7 +468,7 @@ func Utimes(path string, tv []Timeval) (err error) { ...@@ -468,7 +468,7 @@ func Utimes(path string, tv []Timeval) (err error) {
} }
h, e := CreateFile(pathp, h, e := CreateFile(pathp,
FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil, FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)
if e != nil { if e != nil {
return e return e
} }
...@@ -488,7 +488,7 @@ func UtimesNano(path string, ts []Timespec) (err error) { ...@@ -488,7 +488,7 @@ func UtimesNano(path string, ts []Timespec) (err error) {
} }
h, e := CreateFile(pathp, h, e := CreateFile(pathp,
FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil, FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)
if e != nil { if e != nil {
return e return e
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment