github.com/status-im/status-go@v1.1.0/services/wallet/balance/ttl_cache_test.go (about)

     1  package balance
     2  
     3  import (
     4  	"math/big"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/stretchr/testify/require"
     9  
    10  	"github.com/ethereum/go-ethereum/common"
    11  )
    12  
    13  func Test_ttlCacheAll(t *testing.T) {
    14  	const ttl = 10 * time.Millisecond
    15  	cache := newCacheWithTTL(ttl)
    16  
    17  	// init args
    18  	block := big.NewInt(1)
    19  	chainID := uint64(1)
    20  	account := common.Address{1}
    21  	balance := big.NewInt(1)
    22  
    23  	// Test balance
    24  	cache.AddBalance(account, chainID, block, balance)
    25  	require.Equal(t, 1, cache.BalanceSize(account, chainID))
    26  	require.Equal(t, 0, cache.NonceSize(account, chainID))
    27  
    28  	balRes := cache.GetBalance(account, chainID, block)
    29  	require.Equal(t, balance, balRes)
    30  
    31  	cache.Clear()
    32  	require.Equal(t, 0, cache.BalanceSize(account, chainID))
    33  	require.Equal(t, 0, cache.NonceSize(account, chainID))
    34  
    35  	// Test nonce
    36  	nonce := int64(2)
    37  	cache.AddNonce(account, chainID, block, &nonce)
    38  	require.Equal(t, 1, cache.NonceSize(account, chainID))
    39  	require.Equal(t, 0, cache.BalanceSize(account, chainID))
    40  
    41  	nonceRes := cache.GetNonce(account, chainID, block)
    42  	require.Equal(t, nonce, *nonceRes)
    43  	cache.Clear()
    44  	require.Equal(t, 0, cache.BalanceSize(account, chainID))
    45  	require.Equal(t, 0, cache.NonceSize(account, chainID))
    46  
    47  	// Test cache expiration
    48  	cache.Clear()
    49  	cache.AddBalance(account, chainID, block, balance)
    50  	cache.AddNonce(account, chainID, block, &nonce)
    51  	time.Sleep(ttl * 2) // wait for cache to expire
    52  	require.Equal(t, 0, cache.BalanceSize(account, chainID))
    53  	require.Equal(t, 0, cache.NonceSize(account, chainID))
    54  	require.Equal(t, 1, cache.nonceRangeCache.size(account, chainID)) // not updated by ttlCache for now
    55  	cache.Clear()
    56  
    57  	// Test nonceRange size after adding nonce
    58  	cache.Clear()
    59  	cache.AddNonce(account, chainID, block, &nonce)
    60  	require.Equal(t, 1, cache.nonceRangeCache.size(account, chainID))
    61  	require.Equal(t, 1, len(cache.nonceRangeCache.sortedRanges))
    62  
    63  	// Test nonceRange size after clearing
    64  	cache.nonceRangeCache.clear()
    65  	require.Equal(t, 0, cache.nonceRangeCache.size(account, chainID))
    66  	require.Equal(t, 0, len(cache.nonceRangeCache.sortedRanges))
    67  }