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  }