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 }