package vfstest

import (
	"runtime"
	"testing"

	"github.com/stretchr/testify/require"
)

// TestTouchAndDelete checks that writing a zero byte file and immediately
// deleting it is not racy. See https://github.com/rclone/rclone/issues/1181
func TestTouchAndDelete(t *testing.T) {
	run.skipIfNoFUSE(t)
	run.checkDir(t, "")

	run.createFile(t, "touched", "")
	run.rm(t, "touched")

	run.checkDir(t, "")
}

// TestRenameOpenHandle checks that a file with open writers is successfully
// renamed after all writers close. See https://github.com/rclone/rclone/issues/2130
func TestRenameOpenHandle(t *testing.T) {
	run.skipIfNoFUSE(t)
	if runtime.GOOS == "windows" {
		t.Skip("Skipping test on Windows")
	}

	run.checkDir(t, "")

	// create file
	example := []byte("Some Data")
	path := run.path("rename")
	file, err := osCreate(path)
	require.NoError(t, err)

	// write some data
	_, err = file.Write(example)
	require.NoError(t, err)
	err = file.Sync()
	require.NoError(t, err)

	// attempt to rename open file
	err = run.os.Rename(path, path+"bla")
	require.NoError(t, err)

	// close open writers to allow rename on remote to go through
	err = file.Close()
	require.NoError(t, err)

	run.waitForWriters()

	// verify file was renamed properly
	run.checkDir(t, "renamebla 9")

	// cleanup
	run.rm(t, "renamebla")
	run.checkDir(t, "")
}