...

Source file src/github.com/dgraph-io/ristretto/store_test.go

Documentation: github.com/dgraph-io/ristretto

     1  package ristretto
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/dgraph-io/ristretto/z"
     7  	"github.com/stretchr/testify/require"
     8  )
     9  
    10  func TestStoreSetGet(t *testing.T) {
    11  	s := newStore()
    12  	key, conflict := z.KeyToHash(1)
    13  	i := item{
    14  		key:      key,
    15  		conflict: conflict,
    16  		value:    2,
    17  	}
    18  	s.Set(&i)
    19  	val, ok := s.Get(key, conflict)
    20  	require.True(t, ok)
    21  	require.Equal(t, 2, val.(int))
    22  
    23  	i.value = 3
    24  	s.Set(&i)
    25  	val, ok = s.Get(key, conflict)
    26  	require.True(t, ok)
    27  	require.Equal(t, 3, val.(int))
    28  
    29  	key, conflict = z.KeyToHash(2)
    30  	i = item{
    31  		key:      key,
    32  		conflict: conflict,
    33  		value:    2,
    34  	}
    35  	s.Set(&i)
    36  	val, ok = s.Get(key, conflict)
    37  	require.True(t, ok)
    38  	require.Equal(t, 2, val.(int))
    39  }
    40  
    41  func TestStoreDel(t *testing.T) {
    42  	s := newStore()
    43  	key, conflict := z.KeyToHash(1)
    44  	i := item{
    45  		key:      key,
    46  		conflict: conflict,
    47  		value:    1,
    48  	}
    49  	s.Set(&i)
    50  	s.Del(key, conflict)
    51  	val, ok := s.Get(key, conflict)
    52  	require.False(t, ok)
    53  	require.Nil(t, val)
    54  
    55  	s.Del(2, 0)
    56  }
    57  
    58  func TestStoreClear(t *testing.T) {
    59  	s := newStore()
    60  	for i := uint64(0); i < 1000; i++ {
    61  		key, conflict := z.KeyToHash(i)
    62  		it := item{
    63  			key:      key,
    64  			conflict: conflict,
    65  			value:    i,
    66  		}
    67  		s.Set(&it)
    68  	}
    69  	s.Clear()
    70  	for i := uint64(0); i < 1000; i++ {
    71  		key, conflict := z.KeyToHash(i)
    72  		val, ok := s.Get(key, conflict)
    73  		require.False(t, ok)
    74  		require.Nil(t, val)
    75  	}
    76  }
    77  
    78  func TestStoreUpdate(t *testing.T) {
    79  	s := newStore()
    80  	key, conflict := z.KeyToHash(1)
    81  	i := item{
    82  		key:      key,
    83  		conflict: conflict,
    84  		value:    1,
    85  	}
    86  	s.Set(&i)
    87  	i.value = 2
    88  	require.True(t, s.Update(&i))
    89  
    90  	val, ok := s.Get(key, conflict)
    91  	require.True(t, ok)
    92  	require.NotNil(t, val)
    93  
    94  	val, ok = s.Get(key, conflict)
    95  	require.True(t, ok)
    96  	require.Equal(t, 2, val.(int))
    97  
    98  	i.value = 3
    99  	require.True(t, s.Update(&i))
   100  
   101  	val, ok = s.Get(key, conflict)
   102  	require.True(t, ok)
   103  	require.Equal(t, 3, val.(int))
   104  
   105  	key, conflict = z.KeyToHash(2)
   106  	i = item{
   107  		key:      key,
   108  		conflict: conflict,
   109  		value:    2,
   110  	}
   111  	require.False(t, s.Update(&i))
   112  	val, ok = s.Get(key, conflict)
   113  	require.False(t, ok)
   114  	require.Nil(t, val)
   115  }
   116  
   117  func TestStoreCollision(t *testing.T) {
   118  	s := newShardedMap()
   119  	s.shards[1].Lock()
   120  	s.shards[1].data[1] = storeItem{
   121  		key:      1,
   122  		conflict: 0,
   123  		value:    1,
   124  	}
   125  	s.shards[1].Unlock()
   126  	val, ok := s.Get(1, 1)
   127  	require.False(t, ok)
   128  	require.Nil(t, val)
   129  
   130  	i := item{
   131  		key:      1,
   132  		conflict: 1,
   133  		value:    2,
   134  	}
   135  	s.Set(&i)
   136  	val, ok = s.Get(1, 0)
   137  	require.True(t, ok)
   138  	require.NotEqual(t, 2, val.(int))
   139  
   140  	require.False(t, s.Update(&i))
   141  	val, ok = s.Get(1, 0)
   142  	require.True(t, ok)
   143  	require.NotEqual(t, 2, val.(int))
   144  
   145  	s.Del(1, 1)
   146  	val, ok = s.Get(1, 0)
   147  	require.True(t, ok)
   148  	require.NotNil(t, val)
   149  }
   150  
   151  func BenchmarkStoreGet(b *testing.B) {
   152  	s := newStore()
   153  	key, conflict := z.KeyToHash(1)
   154  	i := item{
   155  		key:      key,
   156  		conflict: conflict,
   157  		value:    1,
   158  	}
   159  	s.Set(&i)
   160  	b.SetBytes(1)
   161  	b.RunParallel(func(pb *testing.PB) {
   162  		for pb.Next() {
   163  			s.Get(key, conflict)
   164  		}
   165  	})
   166  }
   167  
   168  func BenchmarkStoreSet(b *testing.B) {
   169  	s := newStore()
   170  	key, conflict := z.KeyToHash(1)
   171  	b.SetBytes(1)
   172  	b.RunParallel(func(pb *testing.PB) {
   173  		for pb.Next() {
   174  			i := item{
   175  				key:      key,
   176  				conflict: conflict,
   177  				value:    1,
   178  			}
   179  			s.Set(&i)
   180  		}
   181  	})
   182  }
   183  
   184  func BenchmarkStoreUpdate(b *testing.B) {
   185  	s := newStore()
   186  	key, conflict := z.KeyToHash(1)
   187  	i := item{
   188  		key:      key,
   189  		conflict: conflict,
   190  		value:    1,
   191  	}
   192  	s.Set(&i)
   193  	b.SetBytes(1)
   194  	b.RunParallel(func(pb *testing.PB) {
   195  		for pb.Next() {
   196  			s.Update(&item{
   197  				key:      key,
   198  				conflict: conflict,
   199  				value:    2,
   200  			})
   201  		}
   202  	})
   203  }
   204  

View as plain text