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