github.com/artpar/rclone@v1.67.3/backend/local/remove_test.go (about)

     1  package local
     2  
     3  import (
     4  	"os"
     5  	"sync"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  	"github.com/stretchr/testify/require"
    11  )
    12  
    13  // Check we can remove an open file
    14  func TestRemove(t *testing.T) {
    15  	fd, err := os.CreateTemp("", "rclone-remove-test")
    16  	require.NoError(t, err)
    17  	name := fd.Name()
    18  	defer func() {
    19  		_ = os.Remove(name)
    20  	}()
    21  
    22  	exists := func() bool {
    23  		_, err := os.Stat(name)
    24  		if err == nil {
    25  			return true
    26  		} else if os.IsNotExist(err) {
    27  			return false
    28  		}
    29  		require.NoError(t, err)
    30  		return false
    31  	}
    32  
    33  	assert.True(t, exists())
    34  	// close the file in the background
    35  	var wg sync.WaitGroup
    36  	wg.Add(1)
    37  	go func() {
    38  		defer wg.Done()
    39  		time.Sleep(250 * time.Millisecond)
    40  		require.NoError(t, fd.Close())
    41  	}()
    42  	// delete the open file
    43  	err = remove(name)
    44  	require.NoError(t, err)
    45  	// check it no longer exists
    46  	assert.False(t, exists())
    47  	// wait for background close
    48  	wg.Wait()
    49  }