github.com/10XDev/rclone@v1.52.3-0.20200626220027-16af9ab76b2a/vfs/vfstest/file.go (about)

     1  package vfstest
     2  
     3  import (
     4  	"os"
     5  	"runtime"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/rclone/rclone/vfs"
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  // TestFileModTime tests mod times on files
    15  func TestFileModTime(t *testing.T) {
    16  	run.skipIfNoFUSE(t)
    17  
    18  	run.createFile(t, "file", "123")
    19  
    20  	mtime := time.Date(2012, time.November, 18, 17, 32, 31, 0, time.UTC)
    21  	err := run.os.Chtimes(run.path("file"), mtime, mtime)
    22  	require.NoError(t, err)
    23  
    24  	info, err := run.os.Stat(run.path("file"))
    25  	require.NoError(t, err)
    26  
    27  	// avoid errors because of timezone differences
    28  	assert.Equal(t, info.ModTime().Unix(), mtime.Unix())
    29  
    30  	run.rm(t, "file")
    31  }
    32  
    33  // run.os.Create without opening for write too
    34  func osCreate(name string) (vfs.OsFiler, error) {
    35  	return run.os.OpenFile(name, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
    36  }
    37  
    38  // run.os.Create with append
    39  func osAppend(name string) (vfs.OsFiler, error) {
    40  	return run.os.OpenFile(name, os.O_WRONLY|os.O_APPEND, 0666)
    41  }
    42  
    43  // TestFileModTimeWithOpenWriters tests mod time on open files
    44  func TestFileModTimeWithOpenWriters(t *testing.T) {
    45  	run.skipIfNoFUSE(t)
    46  	if runtime.GOOS == "windows" {
    47  		t.Skip("Skipping test on Windows")
    48  	}
    49  
    50  	mtime := time.Date(2012, time.November, 18, 17, 32, 31, 0, time.UTC)
    51  	filepath := run.path("cp-archive-test")
    52  
    53  	f, err := osCreate(filepath)
    54  	require.NoError(t, err)
    55  
    56  	_, err = f.Write([]byte{104, 105})
    57  	require.NoError(t, err)
    58  
    59  	err = run.os.Chtimes(filepath, mtime, mtime)
    60  	require.NoError(t, err)
    61  
    62  	err = f.Close()
    63  	require.NoError(t, err)
    64  
    65  	run.waitForWriters()
    66  
    67  	info, err := run.os.Stat(filepath)
    68  	require.NoError(t, err)
    69  
    70  	// avoid errors because of timezone differences
    71  	assert.Equal(t, info.ModTime().Unix(), mtime.Unix())
    72  
    73  	run.rm(t, "cp-archive-test")
    74  }