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

     1  package cache
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  	"github.com/stretchr/testify/require"
    11  )
    12  
    13  var (
    14  	called      = 0
    15  	errSentinel = errors.New("an error")
    16  	errCached   = errors.New("a cached error")
    17  )
    18  
    19  func setup(t *testing.T) (*Cache, CreateFunc) {
    20  	called = 0
    21  	create := func(path string) (interface{}, bool, error) {
    22  		assert.Equal(t, 0, called)
    23  		called++
    24  		switch path {
    25  		case "/":
    26  			return "/", true, nil
    27  		case "/file.txt":
    28  			return "/file.txt", true, errCached
    29  		case "/error":
    30  			return nil, false, errSentinel
    31  		}
    32  		panic(fmt.Sprintf("Unknown path %q", path))
    33  	}
    34  	c := New()
    35  	return c, create
    36  }
    37  
    38  func TestGet(t *testing.T) {
    39  	c, create := setup(t)
    40  
    41  	assert.Equal(t, 0, len(c.cache))
    42  
    43  	f, err := c.Get("/", create)
    44  	require.NoError(t, err)
    45  
    46  	assert.Equal(t, 1, len(c.cache))
    47  
    48  	f2, err := c.Get("/", create)
    49  	require.NoError(t, err)
    50  
    51  	assert.Equal(t, f, f2)
    52  }
    53  
    54  func TestGetFile(t *testing.T) {
    55  	c, create := setup(t)
    56  
    57  	assert.Equal(t, 0, len(c.cache))
    58  
    59  	f, err := c.Get("/file.txt", create)
    60  	require.Equal(t, errCached, err)
    61  
    62  	assert.Equal(t, 1, len(c.cache))
    63  
    64  	f2, err := c.Get("/file.txt", create)
    65  	require.Equal(t, errCached, err)
    66  
    67  	assert.Equal(t, f, f2)
    68  }
    69  
    70  func TestGetError(t *testing.T) {
    71  	c, create := setup(t)
    72  
    73  	assert.Equal(t, 0, len(c.cache))
    74  
    75  	f, err := c.Get("/error", create)
    76  	require.Equal(t, errSentinel, err)
    77  	require.Equal(t, nil, f)
    78  
    79  	assert.Equal(t, 0, len(c.cache))
    80  }
    81  
    82  func TestPut(t *testing.T) {
    83  	c, create := setup(t)
    84  
    85  	assert.Equal(t, 0, len(c.cache))
    86  
    87  	c.Put("/alien", "slime")
    88  
    89  	assert.Equal(t, 1, len(c.cache))
    90  
    91  	fNew, err := c.Get("/alien", create)
    92  	require.NoError(t, err)
    93  	require.Equal(t, "slime", fNew)
    94  
    95  	assert.Equal(t, 1, len(c.cache))
    96  }
    97  
    98  func TestCacheExpire(t *testing.T) {
    99  	c, create := setup(t)
   100  
   101  	c.expireInterval = time.Millisecond
   102  	assert.Equal(t, false, c.expireRunning)
   103  
   104  	_, err := c.Get("/", create)
   105  	require.NoError(t, err)
   106  
   107  	c.mu.Lock()
   108  	entry := c.cache["/"]
   109  
   110  	assert.Equal(t, 1, len(c.cache))
   111  	c.mu.Unlock()
   112  	c.cacheExpire()
   113  	c.mu.Lock()
   114  	assert.Equal(t, 1, len(c.cache))
   115  	entry.lastUsed = time.Now().Add(-c.expireDuration - 60*time.Second)
   116  	assert.Equal(t, true, c.expireRunning)
   117  	c.mu.Unlock()
   118  	time.Sleep(250 * time.Millisecond)
   119  	c.mu.Lock()
   120  	assert.Equal(t, false, c.expireRunning)
   121  	assert.Equal(t, 0, len(c.cache))
   122  	c.mu.Unlock()
   123  }
   124  
   125  func TestClear(t *testing.T) {
   126  	c, create := setup(t)
   127  
   128  	assert.Equal(t, 0, len(c.cache))
   129  
   130  	_, err := c.Get("/", create)
   131  	require.NoError(t, err)
   132  
   133  	assert.Equal(t, 1, len(c.cache))
   134  
   135  	c.Clear()
   136  
   137  	assert.Equal(t, 0, len(c.cache))
   138  }
   139  
   140  func TestEntries(t *testing.T) {
   141  	c, create := setup(t)
   142  
   143  	assert.Equal(t, 0, c.Entries())
   144  
   145  	_, err := c.Get("/", create)
   146  	require.NoError(t, err)
   147  
   148  	assert.Equal(t, 1, c.Entries())
   149  
   150  	c.Clear()
   151  
   152  	assert.Equal(t, 0, c.Entries())
   153  }
   154  
   155  func TestGetMaybe(t *testing.T) {
   156  	c, create := setup(t)
   157  
   158  	value, found := c.GetMaybe("/")
   159  	assert.Equal(t, false, found)
   160  	assert.Nil(t, value)
   161  
   162  	f, err := c.Get("/", create)
   163  	require.NoError(t, err)
   164  
   165  	value, found = c.GetMaybe("/")
   166  	assert.Equal(t, true, found)
   167  	assert.Equal(t, f, value)
   168  
   169  	c.Clear()
   170  
   171  	value, found = c.GetMaybe("/")
   172  	assert.Equal(t, false, found)
   173  	assert.Nil(t, value)
   174  }