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  }