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 }