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