mirror of
https://github.com/rclone/rclone.git
synced 2024-11-27 10:50:03 +08:00
42f0963bf9
Before this change asynchronous closes in cmount could cause sharing violations under Windows on Remove which manifest themselves frequently as test failures. This change lets the Remove be retried on a sharing violation under Windows.
51 lines
916 B
Go
51 lines
916 B
Go
package local
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"os"
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// Check we can remove an open file
|
|
func TestRemove(t *testing.T) {
|
|
fd, err := ioutil.TempFile("", "rclone-remove-test")
|
|
require.NoError(t, err)
|
|
name := fd.Name()
|
|
defer func() {
|
|
_ = os.Remove(name)
|
|
}()
|
|
|
|
exists := func() bool {
|
|
_, err := os.Stat(name)
|
|
if err == nil {
|
|
return true
|
|
} else if os.IsNotExist(err) {
|
|
return false
|
|
}
|
|
require.NoError(t, err)
|
|
return false
|
|
}
|
|
|
|
assert.True(t, exists())
|
|
// close the file in the background
|
|
var wg sync.WaitGroup
|
|
wg.Add(1)
|
|
go func() {
|
|
defer wg.Done()
|
|
time.Sleep(250 * time.Millisecond)
|
|
require.NoError(t, fd.Close())
|
|
}()
|
|
// delete the open file
|
|
err = remove(name)
|
|
require.NoError(t, err)
|
|
// check it no longer exists
|
|
assert.False(t, exists())
|
|
// wait for background close
|
|
wg.Wait()
|
|
}
|