github.com/rclone/rclone@v1.66.1-0.20240517100346-7b89735ae726/vfs/vfstest/read.go (about) 1 package vfstest 2 3 import ( 4 "io" 5 "testing" 6 7 "github.com/stretchr/testify/assert" 8 ) 9 10 // TestReadByByte reads by byte including don't read any bytes 11 func TestReadByByte(t *testing.T) { 12 run.skipIfNoFUSE(t) 13 14 var data = []byte("hellohello") 15 run.createFile(t, "testfile", string(data)) 16 run.checkDir(t, "testfile 10") 17 18 for i := 0; i < len(data); i++ { 19 fd, err := run.os.Open(run.path("testfile")) 20 assert.NoError(t, err) 21 for j := 0; j < i; j++ { 22 buf := make([]byte, 1) 23 n, err := io.ReadFull(fd, buf) 24 assert.NoError(t, err) 25 assert.Equal(t, 1, n) 26 assert.Equal(t, buf[0], data[j]) 27 } 28 err = fd.Close() 29 assert.NoError(t, err) 30 } 31 32 run.rm(t, "testfile") 33 } 34 35 // TestReadChecksum checks the checksum reading is working 36 func TestReadChecksum(t *testing.T) { 37 run.skipIfNoFUSE(t) 38 39 // create file big enough so we exceed any single FUSE read 40 // request 41 b := make([]rune, 3*128*1024) 42 for i := range b { 43 b[i] = 'r' 44 } 45 run.createFile(t, "bigfile", string(b)) 46 47 // The hash comparison would fail in Flush, if we did not 48 // ensure we read the whole file 49 fd, err := run.os.Open(run.path("bigfile")) 50 assert.NoError(t, err) 51 buf := make([]byte, 10) 52 _, err = io.ReadFull(fd, buf) 53 assert.NoError(t, err) 54 err = fd.Close() 55 assert.NoError(t, err) 56 57 // The hash comparison would fail, because we only read parts 58 // of the file 59 fd, err = run.os.Open(run.path("bigfile")) 60 assert.NoError(t, err) 61 // read at start 62 _, err = io.ReadFull(fd, buf) 63 assert.NoError(t, err) 64 // read at end 65 _, err = fd.Seek(int64(len(b)-len(buf)), io.SeekStart) 66 assert.NoError(t, err) 67 _, err = io.ReadFull(fd, buf) 68 assert.NoError(t, err) 69 // ensure we don't compare hashes 70 err = fd.Close() 71 assert.NoError(t, err) 72 73 run.rm(t, "bigfile") 74 } 75 76 // TestReadSeek test seeking 77 func TestReadSeek(t *testing.T) { 78 run.skipIfNoFUSE(t) 79 80 var data = []byte("helloHELLO") 81 run.createFile(t, "testfile", string(data)) 82 run.checkDir(t, "testfile 10") 83 84 fd, err := run.os.Open(run.path("testfile")) 85 assert.NoError(t, err) 86 87 // Seek to half way 88 _, err = fd.Seek(5, io.SeekStart) 89 assert.NoError(t, err) 90 91 buf, err := io.ReadAll(fd) 92 assert.NoError(t, err) 93 assert.Equal(t, buf, []byte("HELLO")) 94 95 // Test seeking to the end 96 _, err = fd.Seek(10, io.SeekStart) 97 assert.NoError(t, err) 98 99 buf, err = io.ReadAll(fd) 100 assert.NoError(t, err) 101 assert.Equal(t, buf, []byte("")) 102 103 // Test seeking beyond the end 104 _, err = fd.Seek(1000000, io.SeekStart) 105 assert.NoError(t, err) 106 107 buf, err = io.ReadAll(fd) 108 assert.NoError(t, err) 109 assert.Equal(t, buf, []byte("")) 110 111 // Now back to the start 112 _, err = fd.Seek(0, io.SeekStart) 113 assert.NoError(t, err) 114 115 buf, err = io.ReadAll(fd) 116 assert.NoError(t, err) 117 assert.Equal(t, buf, []byte("helloHELLO")) 118 119 err = fd.Close() 120 assert.NoError(t, err) 121 122 run.rm(t, "testfile") 123 }