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