github.com/ssgreg/logf@v1.4.1/cache_test.go (about)

     1  package logf
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/require"
     7  )
     8  
     9  var (
    10  	goldenFirst  = []byte("first")
    11  	goldenSecond = []byte("second")
    12  	goldenThird  = []byte("third")
    13  )
    14  
    15  func TestCacheNew(t *testing.T) {
    16  	c := NewCache(2)
    17  	require.EqualValues(t, 0, c.Len())
    18  }
    19  
    20  func TestCacheCleanEmpty(t *testing.T) {
    21  	c := NewCache(2)
    22  
    23  	c.Clean()
    24  	require.EqualValues(t, 0, c.Len())
    25  }
    26  
    27  func TestCacheGetAbsentBuffer(t *testing.T) {
    28  	c := NewCache(2)
    29  
    30  	_, ok := c.Get(0)
    31  	require.False(t, ok)
    32  }
    33  
    34  func TestCacheSetOneBuffer(t *testing.T) {
    35  	c := NewCache(2)
    36  
    37  	c.Set(0, goldenFirst)
    38  	require.EqualValues(t, 1, c.Len())
    39  
    40  	_, ok := c.Get(1)
    41  	require.False(t, ok)
    42  
    43  	buf, ok := c.Get(0)
    44  	require.True(t, ok)
    45  	require.EqualValues(t, goldenFirst, buf)
    46  
    47  	// Try to get the buffer for the second time.
    48  	buf, ok = c.Get(0)
    49  	require.True(t, ok)
    50  	require.EqualValues(t, goldenFirst, buf)
    51  }
    52  
    53  func TestCacheDefaultInsertionOrder(t *testing.T) {
    54  	c := NewCache(2)
    55  
    56  	c.Set(0, goldenFirst)
    57  	require.EqualValues(t, 1, c.Len())
    58  	c.Set(1, goldenSecond)
    59  	require.EqualValues(t, 2, c.Len())
    60  	c.Set(2, goldenThird)
    61  	require.EqualValues(t, 2, c.Len())
    62  
    63  	// The buffer with ID 0 should be removed from the cache.
    64  	_, ok := c.Get(0)
    65  	require.False(t, ok)
    66  
    67  	// Others should exist.
    68  	buf, ok := c.Get(1)
    69  	require.True(t, ok)
    70  	require.EqualValues(t, goldenSecond, buf)
    71  
    72  	buf, ok = c.Get(2)
    73  	require.True(t, ok)
    74  	require.EqualValues(t, goldenThird, buf)
    75  }
    76  
    77  func TestCacheGetChangesOrder(t *testing.T) {
    78  	c := NewCache(2)
    79  
    80  	// Fill the cache.
    81  	c.Set(0, goldenFirst)
    82  	require.EqualValues(t, 1, c.Len())
    83  	c.Set(1, goldenSecond)
    84  	require.EqualValues(t, 2, c.Len())
    85  
    86  	// Change LRU order. 0 is LRU now.
    87  	buf, ok := c.Get(0)
    88  	require.True(t, ok)
    89  	require.EqualValues(t, goldenFirst, buf)
    90  
    91  	// Add a new one buffer. Last buffer should be removed.
    92  	c.Set(2, goldenThird)
    93  	require.EqualValues(t, 2, c.Len())
    94  
    95  	// The buffer with ID 1 should be removed from the cache.
    96  	_, ok = c.Get(1)
    97  	require.False(t, ok)
    98  
    99  	// Others should exist.
   100  	buf, ok = c.Get(0)
   101  	require.True(t, ok)
   102  	require.EqualValues(t, goldenFirst, buf)
   103  
   104  	buf, ok = c.Get(2)
   105  	require.True(t, ok)
   106  	require.EqualValues(t, goldenThird, buf)
   107  }
   108  
   109  func TestCacheSetOneBufferTwoTimes(t *testing.T) {
   110  	c := NewCache(2)
   111  
   112  	// Add one buffer.
   113  	c.Set(0, goldenFirst)
   114  	require.EqualValues(t, 1, c.Len())
   115  
   116  	// Check it.
   117  	buf, ok := c.Get(0)
   118  	require.True(t, ok)
   119  	require.EqualValues(t, goldenFirst, buf)
   120  
   121  	// Set another buffer with the same ID.
   122  	c.Set(0, goldenSecond)
   123  	require.EqualValues(t, 1, c.Len())
   124  
   125  	// Try to get the buffer for the second time.
   126  	buf, ok = c.Get(0)
   127  	require.True(t, ok)
   128  	require.EqualValues(t, goldenSecond, buf)
   129  }
   130  
   131  func BenchmarkAddWithRotation(b *testing.B) {
   132  	c := NewCache(100)
   133  
   134  	b.ResetTimer()
   135  	for i := 0; i < b.N; i++ {
   136  		c.Set(int32(i), goldenFirst)
   137  	}
   138  }
   139  
   140  func BenchmarkGetWith1000(b *testing.B) {
   141  	count := 1000
   142  	c := NewCache(count)
   143  
   144  	for i := 0; i < count; i++ {
   145  		c.Set(int32(i), goldenFirst)
   146  	}
   147  
   148  	b.ResetTimer()
   149  	for i := 0; i < b.N; i++ {
   150  		c.Get(int32(i % count))
   151  	}
   152  }