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  }