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

     1  package file
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"io/ioutil"
     7  	"os"
     8  	"path"
     9  	"testing"
    10  
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  // Create a test directory then tidy up
    16  func testDir(t *testing.T) (string, func()) {
    17  	dir, err := ioutil.TempDir("", "rclone-test")
    18  	require.NoError(t, err)
    19  	return dir, func() {
    20  		assert.NoError(t, os.RemoveAll(dir))
    21  	}
    22  }
    23  
    24  // This lists dir and checks the listing is as expected without checking the size
    25  func checkListingNoSize(t *testing.T, dir string, want []string) {
    26  	var got []string
    27  	nodes, err := ioutil.ReadDir(dir)
    28  	require.NoError(t, err)
    29  	for _, node := range nodes {
    30  		got = append(got, fmt.Sprintf("%s,%v", node.Name(), node.IsDir()))
    31  	}
    32  	assert.Equal(t, want, got)
    33  }
    34  
    35  // This lists dir and checks the listing is as expected
    36  func checkListing(t *testing.T, dir string, want []string) {
    37  	var got []string
    38  	nodes, err := ioutil.ReadDir(dir)
    39  	require.NoError(t, err)
    40  	for _, node := range nodes {
    41  		got = append(got, fmt.Sprintf("%s,%d,%v", node.Name(), node.Size(), node.IsDir()))
    42  	}
    43  	assert.Equal(t, want, got)
    44  }
    45  
    46  // Test we can rename an open file
    47  func TestOpenFileRename(t *testing.T) {
    48  	dir, tidy := testDir(t)
    49  	defer tidy()
    50  
    51  	filepath := path.Join(dir, "file1")
    52  	f, err := Create(filepath)
    53  	require.NoError(t, err)
    54  
    55  	_, err = f.Write([]byte("hello"))
    56  	assert.NoError(t, err)
    57  
    58  	checkListingNoSize(t, dir, []string{
    59  		"file1,false",
    60  	})
    61  
    62  	// Delete the file first
    63  	assert.NoError(t, os.Remove(filepath))
    64  
    65  	// .. then close it
    66  	assert.NoError(t, f.Close())
    67  
    68  	checkListing(t, dir, nil)
    69  }
    70  
    71  // Test we can delete an open file
    72  func TestOpenFileDelete(t *testing.T) {
    73  	dir, tidy := testDir(t)
    74  	defer tidy()
    75  
    76  	filepath := path.Join(dir, "file1")
    77  	f, err := Create(filepath)
    78  	require.NoError(t, err)
    79  
    80  	_, err = f.Write([]byte("hello"))
    81  	assert.NoError(t, err)
    82  
    83  	checkListingNoSize(t, dir, []string{
    84  		"file1,false",
    85  	})
    86  
    87  	// Rename the file while open
    88  	filepath2 := path.Join(dir, "file2")
    89  	assert.NoError(t, os.Rename(filepath, filepath2))
    90  
    91  	checkListingNoSize(t, dir, []string{
    92  		"file2,false",
    93  	})
    94  
    95  	// .. then close it
    96  	assert.NoError(t, f.Close())
    97  
    98  	checkListing(t, dir, []string{
    99  		"file2,5,false",
   100  	})
   101  }
   102  
   103  // Smoke test the Open, OpenFile and Create functions
   104  func TestOpenFileOperations(t *testing.T) {
   105  	dir, tidy := testDir(t)
   106  	defer tidy()
   107  
   108  	filepath := path.Join(dir, "file1")
   109  
   110  	// Create the file
   111  
   112  	f, err := Create(filepath)
   113  	require.NoError(t, err)
   114  
   115  	_, err = f.Write([]byte("hello"))
   116  	assert.NoError(t, err)
   117  
   118  	assert.NoError(t, f.Close())
   119  
   120  	checkListing(t, dir, []string{
   121  		"file1,5,false",
   122  	})
   123  
   124  	// Append onto the file
   125  
   126  	f, err = OpenFile(filepath, os.O_RDWR|os.O_APPEND, 0666)
   127  	require.NoError(t, err)
   128  
   129  	_, err = f.Write([]byte("HI"))
   130  	assert.NoError(t, err)
   131  
   132  	assert.NoError(t, f.Close())
   133  
   134  	checkListing(t, dir, []string{
   135  		"file1,7,false",
   136  	})
   137  
   138  	// Read it back in
   139  
   140  	f, err = Open(filepath)
   141  	require.NoError(t, err)
   142  	var b = make([]byte, 10)
   143  	n, err := f.Read(b)
   144  	assert.True(t, err == io.EOF || err == nil)
   145  	assert.Equal(t, 7, n)
   146  	assert.Equal(t, "helloHI", string(b[:n]))
   147  
   148  	assert.NoError(t, f.Close())
   149  
   150  	checkListing(t, dir, []string{
   151  		"file1,7,false",
   152  	})
   153  
   154  }