github.com/ncw/rclone@v1.48.1-0.20190724201158-a35aa1360e3e/cmd/mountlib/mounttest/write_unix.go (about) 1 // +build linux darwin freebsd 2 3 package mounttest 4 5 import ( 6 "runtime" 7 "syscall" 8 "testing" 9 10 "github.com/stretchr/testify/assert" 11 ) 12 13 // TestWriteFileDoubleClose tests double close on write 14 func TestWriteFileDoubleClose(t *testing.T) { 15 run.skipIfNoFUSE(t) 16 if runtime.GOOS == "darwin" { 17 t.Skip("Skipping test on OSX") 18 } 19 20 out, err := osCreate(run.path("testdoubleclose")) 21 assert.NoError(t, err) 22 fd := out.Fd() 23 24 fd1, err := syscall.Dup(int(fd)) 25 assert.NoError(t, err) 26 27 fd2, err := syscall.Dup(int(fd)) 28 assert.NoError(t, err) 29 30 // close one of the dups - should produce no error 31 err = syscall.Close(fd1) 32 assert.NoError(t, err) 33 34 // write to the file 35 buf := []byte("hello") 36 n, err := out.Write(buf) 37 assert.NoError(t, err) 38 assert.Equal(t, 5, n) 39 40 // close it 41 err = out.Close() 42 assert.NoError(t, err) 43 44 // write to the other dup - should produce an error 45 _, err = syscall.Write(fd2, buf) 46 assert.Error(t, err, "input/output error") 47 48 // close the dup - should not produce an error 49 err = syscall.Close(fd2) 50 assert.NoError(t, err) 51 52 run.waitForWriters() 53 run.rm(t, "testdoubleclose") 54 }