github.com/10XDev/rclone@v1.52.3-0.20200626220027-16af9ab76b2a/backend/cache/cache_mount_unix_test.go (about)

     1  // +build linux,go1.13 darwin,go1.13 freebsd,go1.13
     2  // +build !race
     3  
     4  package cache_test
     5  
     6  import (
     7  	"os"
     8  	"testing"
     9  	"time"
    10  
    11  	"bazil.org/fuse"
    12  	fusefs "bazil.org/fuse/fs"
    13  	"github.com/rclone/rclone/cmd/mount"
    14  	"github.com/rclone/rclone/cmd/mountlib"
    15  	"github.com/rclone/rclone/fs"
    16  	"github.com/stretchr/testify/require"
    17  )
    18  
    19  func (r *run) mountFs(t *testing.T, f fs.Fs) {
    20  	device := f.Name() + ":" + f.Root()
    21  	var options = []fuse.MountOption{
    22  		fuse.MaxReadahead(uint32(mountlib.MaxReadAhead)),
    23  		fuse.Subtype("rclone"),
    24  		fuse.FSName(device), fuse.VolumeName(device),
    25  		fuse.NoAppleDouble(),
    26  		fuse.NoAppleXattr(),
    27  		//fuse.AllowOther(),
    28  	}
    29  	err := os.MkdirAll(r.mntDir, os.ModePerm)
    30  	require.NoError(t, err)
    31  	c, err := fuse.Mount(r.mntDir, options...)
    32  	require.NoError(t, err)
    33  	filesys := mount.NewFS(f)
    34  	server := fusefs.New(c, nil)
    35  
    36  	// Serve the mount point in the background returning error to errChan
    37  	r.unmountRes = make(chan error, 1)
    38  	go func() {
    39  		err := server.Serve(filesys)
    40  		closeErr := c.Close()
    41  		if err == nil {
    42  			err = closeErr
    43  		}
    44  		r.unmountRes <- err
    45  	}()
    46  
    47  	// check if the mount process has an error to report
    48  	<-c.Ready
    49  	require.NoError(t, c.MountError)
    50  
    51  	r.unmountFn = func() error {
    52  		// Shutdown the VFS
    53  		filesys.VFS.Shutdown()
    54  		return fuse.Unmount(r.mntDir)
    55  	}
    56  
    57  	r.vfs = filesys.VFS
    58  	r.isMounted = true
    59  }
    60  
    61  func (r *run) unmountFs(t *testing.T, f fs.Fs) {
    62  	var err error
    63  
    64  	for i := 0; i < 4; i++ {
    65  		err = r.unmountFn()
    66  		if err != nil {
    67  			//log.Printf("signal to umount failed - retrying: %v", err)
    68  			time.Sleep(3 * time.Second)
    69  			continue
    70  		}
    71  		break
    72  	}
    73  	require.NoError(t, err)
    74  	err = <-r.unmountRes
    75  	require.NoError(t, err)
    76  	err = r.vfs.CleanUp()
    77  	require.NoError(t, err)
    78  	r.isMounted = false
    79  }