github.com/xhghs/rclone@v1.51.1-0.20200430155106-e186a28cced8/fs/cache/cache_test.go (about)

     1  package cache
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"testing"
     7  
     8  	"github.com/rclone/rclone/fs"
     9  	"github.com/rclone/rclone/fstest/mockfs"
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  var (
    15  	called      = 0
    16  	errSentinel = errors.New("an error")
    17  )
    18  
    19  func mockNewFs(t *testing.T) (func(), func(path string) (fs.Fs, error)) {
    20  	called = 0
    21  	create := func(path string) (fs.Fs, error) {
    22  		assert.Equal(t, 0, called)
    23  		called++
    24  		switch path {
    25  		case "/":
    26  			return mockfs.NewFs("mock", "mock"), nil
    27  		case "/file.txt":
    28  			return mockfs.NewFs("mock", "mock"), fs.ErrorIsFile
    29  		case "/error":
    30  			return nil, errSentinel
    31  		}
    32  		panic(fmt.Sprintf("Unknown path %q", path))
    33  	}
    34  	cleanup := func() {
    35  		c.Clear()
    36  	}
    37  	return cleanup, create
    38  }
    39  
    40  func TestGet(t *testing.T) {
    41  	cleanup, create := mockNewFs(t)
    42  	defer cleanup()
    43  
    44  	assert.Equal(t, 0, c.Entries())
    45  
    46  	f, err := GetFn("/", create)
    47  	require.NoError(t, err)
    48  
    49  	assert.Equal(t, 1, c.Entries())
    50  
    51  	f2, err := GetFn("/", create)
    52  	require.NoError(t, err)
    53  
    54  	assert.Equal(t, f, f2)
    55  }
    56  
    57  func TestGetFile(t *testing.T) {
    58  	cleanup, create := mockNewFs(t)
    59  	defer cleanup()
    60  
    61  	assert.Equal(t, 0, c.Entries())
    62  
    63  	f, err := GetFn("/file.txt", create)
    64  	require.Equal(t, fs.ErrorIsFile, err)
    65  	require.NotNil(t, f)
    66  
    67  	assert.Equal(t, 1, c.Entries())
    68  
    69  	f2, err := GetFn("/file.txt", create)
    70  	require.Equal(t, fs.ErrorIsFile, err)
    71  	require.NotNil(t, f2)
    72  
    73  	assert.Equal(t, f, f2)
    74  }
    75  
    76  func TestGetError(t *testing.T) {
    77  	cleanup, create := mockNewFs(t)
    78  	defer cleanup()
    79  
    80  	assert.Equal(t, 0, c.Entries())
    81  
    82  	f, err := GetFn("/error", create)
    83  	require.Equal(t, errSentinel, err)
    84  	require.Equal(t, nil, f)
    85  
    86  	assert.Equal(t, 0, c.Entries())
    87  }
    88  
    89  func TestPut(t *testing.T) {
    90  	cleanup, create := mockNewFs(t)
    91  	defer cleanup()
    92  
    93  	f := mockfs.NewFs("mock", "mock")
    94  
    95  	assert.Equal(t, 0, c.Entries())
    96  
    97  	Put("/alien", f)
    98  
    99  	assert.Equal(t, 1, c.Entries())
   100  
   101  	fNew, err := GetFn("/alien", create)
   102  	require.NoError(t, err)
   103  	require.Equal(t, f, fNew)
   104  
   105  	assert.Equal(t, 1, c.Entries())
   106  }