@@ -85,6 +85,64 @@ func TestRbMemoryStore_Scan(t *testing.T) {
8585 assert .Equal (t , 100 , cnt )
8686}
8787
88+ func TestRbMemoryStore_ScanKeys (t * testing.T ) {
89+ ctx := context .Background ()
90+ t .Parallel ()
91+ st := NewRbMemoryStore ()
92+
93+ for i := 0 ; i < 9999 ; i ++ {
94+ keyStr := "prefix " + strconv .Itoa (i ) + "foo"
95+ key := []byte (keyStr )
96+ b := make ([]byte , 8 )
97+ binary .PutVarint (b , int64 (i ))
98+ err := st .Put (ctx , key , b )
99+ assert .NoError (t , err )
100+ }
101+
102+ res , err := st .ScanKeys (ctx , []byte ("prefix" ), []byte ("z" ), 100 )
103+ assert .NoError (t , err )
104+ assert .Equal (t , 100 , len (res ))
105+
106+ sortedKeys := make ([][]byte , 9999 )
107+
108+ for _ , k := range res {
109+ str := string (k )
110+ i , err := strconv .Atoi (str [7 : len (str )- 3 ])
111+ assert .NoError (t , err )
112+ sortedKeys [i ] = k
113+ }
114+
115+ cnt := 0
116+ for i , k := range sortedKeys {
117+ if k == nil {
118+ continue
119+ }
120+ cnt ++
121+ assert .Equal (t , []byte ("prefix " + strconv .Itoa (i )+ "foo" ), k )
122+ }
123+
124+ assert .Equal (t , 100 , cnt )
125+ }
126+
127+ func TestRbMemoryStore_ScanKeysReturnsCopies (t * testing.T ) {
128+ ctx := context .Background ()
129+ st := NewRbMemoryStore ()
130+
131+ assert .NoError (t , st .Put (ctx , []byte ("foo" ), []byte ("bar" )))
132+
133+ res , err := st .ScanKeys (ctx , nil , nil , 10 )
134+ assert .NoError (t , err )
135+ if len (res ) == 0 {
136+ t .Fatalf ("expected keys, got none" )
137+ }
138+
139+ res [0 ][0 ] = 'x'
140+
141+ res2 , err := st .ScanKeys (ctx , nil , nil , 10 )
142+ assert .NoError (t , err )
143+ assert .Equal (t , []byte ("foo" ), res2 [0 ])
144+ }
145+
88146func TestRbMemoryStore_Txn (t * testing.T ) {
89147 t .Parallel ()
90148 t .Run ("success" , func (t * testing.T ) {
0 commit comments