github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/msp/cache/second_chance_test.go (about) 1 /* 2 Copyright hechain. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package cache 8 9 import ( 10 "fmt" 11 "sync" 12 "testing" 13 14 "github.com/stretchr/testify/require" 15 ) 16 17 func TestSecondChanceCache(t *testing.T) { 18 cache := newSecondChanceCache(2) 19 require.NotNil(t, cache) 20 21 cache.add("a", "xyz") 22 23 cache.add("b", "123") 24 // get b, b referenced bit is set to true 25 obj, ok := cache.get("b") 26 require.True(t, ok) 27 require.Equal(t, "123", obj.(string)) 28 29 // add c. victim scan: delete a and set b as the next candidate of a victim 30 cache.add("c", "777") 31 32 // check a is deleted 33 _, ok = cache.get("a") 34 require.False(t, ok) 35 36 // add d. victim scan: b referenced bit is set to false and delete c 37 cache.add("d", "555") 38 39 // check c is deleted 40 _, ok = cache.get("c") 41 require.False(t, ok) 42 43 // check b and d 44 obj, ok = cache.get("b") 45 require.True(t, ok) 46 require.Equal(t, "123", obj.(string)) 47 obj, ok = cache.get("d") 48 require.True(t, ok) 49 require.Equal(t, "555", obj.(string)) 50 } 51 52 func TestSecondChanceCacheConcurrent(t *testing.T) { 53 cache := newSecondChanceCache(25) 54 55 workers := 16 56 wg := sync.WaitGroup{} 57 wg.Add(workers) 58 59 key1 := "key1" 60 val1 := key1 61 62 for i := 0; i < workers; i++ { 63 id := i 64 key2 := fmt.Sprintf("key2-%d", i) 65 val2 := key2 66 67 go func() { 68 for j := 0; j < 10000; j++ { 69 key3 := fmt.Sprintf("key3-%d-%d", id, j) 70 val3 := key3 71 cache.add(key3, val3) 72 73 val, ok := cache.get(key1) 74 if ok { 75 require.Equal(t, val1, val.(string)) 76 } 77 cache.add(key1, val1) 78 79 val, ok = cache.get(key2) 80 if ok { 81 require.Equal(t, val2, val.(string)) 82 } 83 cache.add(key2, val2) 84 85 key4 := fmt.Sprintf("key4-%d", j) 86 val4 := key4 87 val, ok = cache.get(key4) 88 if ok { 89 require.Equal(t, val4, val.(string)) 90 } 91 cache.add(key4, val4) 92 93 val, ok = cache.get(key3) 94 if ok { 95 require.Equal(t, val3, val.(string)) 96 } 97 } 98 99 wg.Done() 100 }() 101 } 102 wg.Wait() 103 }