github.com/keybase/client/go@v0.0.0-20241007131713-f10651d043c8/lru/lru_test.go (about)

     1  package lru
     2  
     3  import (
     4  	"fmt"
     5  	"github.com/keybase/client/go/libkb"
     6  	"github.com/stretchr/testify/require"
     7  	"golang.org/x/net/context"
     8  	"testing"
     9  )
    10  
    11  type obj struct {
    12  	I int
    13  	S string
    14  }
    15  
    16  func (o obj) DbKey() libkb.DbKey {
    17  	return libkb.DbKey{Typ: 20, Key: o.S}
    18  }
    19  
    20  func (o obj) MemKey() string {
    21  	return o.S
    22  }
    23  
    24  func TestLRU(t *testing.T) {
    25  	tc := libkb.SetupTest(t, "TestLookup", 1)
    26  	defer tc.Cleanup()
    27  
    28  	var objs []obj
    29  
    30  	N := 10
    31  	for i := 0; i < N; i++ {
    32  		objs = append(objs, obj{i, fmt.Sprintf("%d", i)})
    33  	}
    34  
    35  	lru := NewLRU(tc.G, 2, 1, obj{})
    36  	ctx := context.TODO()
    37  
    38  	testPut := func(i int) {
    39  		err := lru.Put(ctx, tc.G, objs[i], &objs[i])
    40  		require.NoError(t, err)
    41  	}
    42  
    43  	testPut(0)
    44  	testPut(1)
    45  
    46  	var stats stats
    47  
    48  	testGet := func(i int, memHit bool) {
    49  		ret, err := lru.Get(ctx, tc.G, objs[i])
    50  		require.NoError(t, err)
    51  		require.Equal(t, ret, &objs[i])
    52  		if memHit {
    53  			stats.memHit++
    54  		} else {
    55  			stats.diskHit++
    56  		}
    57  	}
    58  
    59  	testMiss := func(i int, isStale bool) {
    60  		ret, err := lru.Get(ctx, tc.G, objs[i])
    61  		require.NoError(t, err)
    62  		require.Nil(t, ret)
    63  		if isStale {
    64  			stats.diskStale++
    65  		} else {
    66  			stats.miss++
    67  		}
    68  	}
    69  
    70  	testStats := func() {
    71  		require.Equal(t, stats, lru.stats)
    72  	}
    73  
    74  	testGet(0, true)
    75  	testGet(1, true)
    76  	testMiss(2, false)
    77  	testStats()
    78  	lru.ClearMemory()
    79  	testGet(0, false)
    80  	testGet(1, false)
    81  	testStats()
    82  
    83  	// All of the following should be disk hits
    84  	for i := 0; i < N; i++ {
    85  		testPut(i)
    86  	}
    87  	for i := 0; i < N; i++ {
    88  		testGet(i, false)
    89  	}
    90  	testStats()
    91  
    92  	// test that a put of the old version fails to get when we
    93  	// want the new version
    94  	testPut(0)
    95  	lru.ClearMemory()
    96  	lru.version = 2
    97  	testMiss(0, true)
    98  	testStats()
    99  }