github.com/ncw/rclone@v1.48.1-0.20190724201158-a35aa1360e3e/fs/cache/cache_test.go (about)

     1  package cache
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/ncw/rclone/fs"
    10  	"github.com/ncw/rclone/fstest/mockfs"
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  var (
    16  	called      = 0
    17  	errSentinel = errors.New("an error")
    18  )
    19  
    20  func mockNewFs(t *testing.T) func() {
    21  	called = 0
    22  	oldFsNewFs := fsNewFs
    23  	fsNewFs = func(path string) (fs.Fs, error) {
    24  		assert.Equal(t, 0, called)
    25  		called++
    26  		switch path {
    27  		case "/":
    28  			return mockfs.NewFs("mock", "mock"), nil
    29  		case "/file.txt":
    30  			return mockfs.NewFs("mock", "mock"), fs.ErrorIsFile
    31  		case "/error":
    32  			return nil, errSentinel
    33  		}
    34  		panic(fmt.Sprintf("Unknown path %q", path))
    35  	}
    36  	return func() {
    37  		fsNewFs = oldFsNewFs
    38  		fsCacheMu.Lock()
    39  		fsCache = map[string]*cacheEntry{}
    40  		expireRunning = false
    41  		fsCacheMu.Unlock()
    42  	}
    43  }
    44  
    45  func TestGet(t *testing.T) {
    46  	defer mockNewFs(t)()
    47  
    48  	assert.Equal(t, 0, len(fsCache))
    49  
    50  	f, err := Get("/")
    51  	require.NoError(t, err)
    52  
    53  	assert.Equal(t, 1, len(fsCache))
    54  
    55  	f2, err := Get("/")
    56  	require.NoError(t, err)
    57  
    58  	assert.Equal(t, f, f2)
    59  }
    60  
    61  func TestGetFile(t *testing.T) {
    62  	defer mockNewFs(t)()
    63  
    64  	assert.Equal(t, 0, len(fsCache))
    65  
    66  	f, err := Get("/file.txt")
    67  	require.Equal(t, fs.ErrorIsFile, err)
    68  
    69  	assert.Equal(t, 1, len(fsCache))
    70  
    71  	f2, err := Get("/file.txt")
    72  	require.Equal(t, fs.ErrorIsFile, err)
    73  
    74  	assert.Equal(t, f, f2)
    75  }
    76  
    77  func TestGetError(t *testing.T) {
    78  	defer mockNewFs(t)()
    79  
    80  	assert.Equal(t, 0, len(fsCache))
    81  
    82  	f, err := Get("/error")
    83  	require.Equal(t, errSentinel, err)
    84  	require.Equal(t, nil, f)
    85  
    86  	assert.Equal(t, 0, len(fsCache))
    87  }
    88  
    89  func TestPut(t *testing.T) {
    90  	defer mockNewFs(t)()
    91  
    92  	f := mockfs.NewFs("mock", "mock")
    93  
    94  	assert.Equal(t, 0, len(fsCache))
    95  
    96  	Put("/alien", f)
    97  
    98  	assert.Equal(t, 1, len(fsCache))
    99  
   100  	fNew, err := Get("/alien")
   101  	require.NoError(t, err)
   102  	require.Equal(t, f, fNew)
   103  
   104  	assert.Equal(t, 1, len(fsCache))
   105  }
   106  
   107  func TestCacheExpire(t *testing.T) {
   108  	defer mockNewFs(t)()
   109  
   110  	cacheExpireInterval = time.Millisecond
   111  	assert.Equal(t, false, expireRunning)
   112  
   113  	_, err := Get("/")
   114  	require.NoError(t, err)
   115  
   116  	fsCacheMu.Lock()
   117  	entry := fsCache["/"]
   118  
   119  	assert.Equal(t, 1, len(fsCache))
   120  	fsCacheMu.Unlock()
   121  	cacheExpire()
   122  	fsCacheMu.Lock()
   123  	assert.Equal(t, 1, len(fsCache))
   124  	entry.lastUsed = time.Now().Add(-cacheExpireDuration - 60*time.Second)
   125  	assert.Equal(t, true, expireRunning)
   126  	fsCacheMu.Unlock()
   127  	time.Sleep(10 * time.Millisecond)
   128  	fsCacheMu.Lock()
   129  	assert.Equal(t, false, expireRunning)
   130  	assert.Equal(t, 0, len(fsCache))
   131  	fsCacheMu.Unlock()
   132  }
   133  
   134  func TestClear(t *testing.T) {
   135  	defer mockNewFs(t)()
   136  
   137  	assert.Equal(t, 0, len(fsCache))
   138  
   139  	_, err := Get("/")
   140  	require.NoError(t, err)
   141  
   142  	assert.Equal(t, 1, len(fsCache))
   143  
   144  	Clear()
   145  
   146  	assert.Equal(t, 0, len(fsCache))
   147  }