@@ -30,8 +30,10 @@ import (
30
30
"testing"
31
31
"time"
32
32
33
- "github.com/apache/kvrocks/tests/gocase/util "
33
+ "github.com/stretchr/testify/assert "
34
34
"github.com/stretchr/testify/require"
35
+
36
+ "github.com/apache/kvrocks/tests/gocase/util"
35
37
)
36
38
37
39
func getKeys (hash map [string ]string ) []string {
@@ -118,6 +120,136 @@ var testHash = func(t *testing.T, configs util.KvrocksServerConfigs) {
118
120
require .Equal (t , int64 (1 ), rdb .HSet (ctx , "hmsetmulti" , "key1" , "val1" , "key3" , "val3" ).Val ())
119
121
})
120
122
123
+ t .Run ("HSETEXPIRE wrong number of args" , func (t * testing.T ) {
124
+ pattern := ".*wrong number.*"
125
+ ttlStr := "3600"
126
+ testKey := "hsetKey"
127
+ r := rdb .Do (ctx , "hsetexpire" , testKey , ttlStr )
128
+ util .ErrorRegexp (t , r .Err (), pattern )
129
+ })
130
+
131
+ t .Run ("HSETEXPIRE incomplete pairs" , func (t * testing.T ) {
132
+ pattern := ".*field-value pairs must be complete.*"
133
+ ttlStr := "3600"
134
+ testKey := "hsetKey"
135
+ r := rdb .Do (ctx , "hsetexpire" , testKey , ttlStr , "key1" , "val1" , "key2" )
136
+ util .ErrorRegexp (t , r .Err (), pattern )
137
+ })
138
+
139
+ t .Run ("HSET/HSETEXPIRE/HSETEXPIRE/persist update expire time" , func (t * testing.T ) {
140
+ ttlStr := "3600"
141
+ testKey := "hsetKeyUpdateTime"
142
+ // create an hash without expiration
143
+ r := rdb .Do (ctx , "hset" , testKey , "key1" , "val1" , "key2" , "val2" )
144
+ require .NoError (t , r .Err ())
145
+ noExp := rdb .ExpireTime (ctx , testKey )
146
+ // make sure there is not exp set on the key
147
+ assert .Equal (t , - 1 * time .Nanosecond , noExp .Val ())
148
+ // validate we inserted the key/vals
149
+ values := rdb .HGetAll (ctx , testKey )
150
+ assert .Equal (t , 2 , len (values .Val ()))
151
+
152
+ // update the hash and add expiration
153
+ r = rdb .Do (ctx , "hsetexpire" , testKey , ttlStr , "key3" , "val3" )
154
+ require .NoError (t , r .Err ())
155
+ assert .Equal (t , "OK" , r .Val ())
156
+ firstExp := rdb .ExpireTime (ctx , testKey )
157
+ firstExpireTime := time .Date (1970 , 1 , 1 , 0 , 0 , 0 , 0 , time .UTC ).Add (firstExp .Val ()).Unix ()
158
+ // validate there is exp set on the key
159
+ assert .NotEqual (t , - 1 , firstExpireTime )
160
+ assert .Greater (t , firstExpireTime , time .Now ().Unix ())
161
+ // validate we updated the key/vals
162
+ values = rdb .HGetAll (ctx , testKey )
163
+ assert .Equal (t , 3 , len (values .Val ()))
164
+
165
+ // update the has and expiration
166
+ time .Sleep (1 * time .Second )
167
+ r = rdb .Do (ctx , "hsetexpire" , testKey , ttlStr , "key4" , "val4" )
168
+ require .NoError (t , r .Err ())
169
+ assert .Equal (t , "OK" , r .Val ())
170
+ // validate there is exp set on the key and it is new
171
+ secondExp := rdb .ExpireTime (ctx , testKey )
172
+ secondExpireTime := time .Date (1970 , 1 , 1 , 0 , 0 , 0 , 0 , time .UTC ).Add (secondExp .Val ()).Unix ()
173
+ assert .NotEqual (t , - 1 , secondExpireTime )
174
+ assert .Greater (t , secondExpireTime , time .Now ().Unix ())
175
+ assert .Greater (t , secondExpireTime , firstExpireTime )
176
+ // validate we updated the key/vals
177
+ values = rdb .HGetAll (ctx , testKey )
178
+ assert .Equal (t , 4 , len (values .Val ()))
179
+
180
+ //remove expiration on the key and verify
181
+ r = rdb .Do (ctx , "persist" , testKey )
182
+ require .NoError (t , r .Err ())
183
+ persist := rdb .ExpireTime (ctx , testKey )
184
+ assert .Equal (t , - 1 * time .Nanosecond , persist .Val ())
185
+ // validate we still have the correct number of key/vals
186
+ values = rdb .HGetAll (ctx , testKey )
187
+ assert .Equal (t , 4 , len (values .Val ()))
188
+ })
189
+
190
+ t .Run ("HSETEXPIRE/HLEN/EXPIRETIME - Small hash creation" , func (t * testing.T ) {
191
+ ttlStr := "3600"
192
+ testKey := "hsetexsmallhash"
193
+ hsetExSmallHash := make (map [string ]string )
194
+ for i := 0 ; i < 8 ; i ++ {
195
+ key := "__avoid_collisions__" + util .RandString (0 , 8 , util .Alpha )
196
+ val := "__avoid_collisions__" + util .RandString (0 , 8 , util .Alpha )
197
+ if _ , ok := hsetExSmallHash [key ]; ok {
198
+ i --
199
+ }
200
+ rdb .Do (ctx , "hsetexpire" , testKey , ttlStr , key , val )
201
+ hsetExSmallHash [key ] = val
202
+ }
203
+ require .Equal (t , int64 (8 ), rdb .HLen (ctx , testKey ).Val ())
204
+ val := rdb .ExpireTime (ctx , testKey ).Val ()
205
+ expireTime := time .Date (1970 , 1 , 1 , 0 , 0 , 0 , 0 , time .UTC ).Add (val ).Unix ()
206
+ require .Greater (t , expireTime , time .Now ().Unix ())
207
+ })
208
+
209
+ t .Run ("HSETEXPIRE/HLEN/EXPIRETIME - Big hash creation" , func (t * testing.T ) {
210
+ ttlStr := "3600"
211
+ testKey := "hsetexbighash"
212
+ hsetExBigHash := make (map [string ]string )
213
+ for i := 0 ; i < 1024 ; i ++ {
214
+ key := "__avoid_collisions__" + util .RandString (0 , 8 , util .Alpha )
215
+ val := "__avoid_collisions__" + util .RandString (0 , 8 , util .Alpha )
216
+ if _ , ok := hsetExBigHash [key ]; ok {
217
+ i --
218
+ }
219
+ rdb .Do (ctx , "hsetexpire" , testKey , ttlStr , key , val )
220
+ hsetExBigHash [key ] = val
221
+ }
222
+ require .Equal (t , int64 (1024 ), rdb .HLen (ctx , testKey ).Val ())
223
+ val := rdb .ExpireTime (ctx , testKey ).Val ()
224
+ expireTime := time .Date (1970 , 1 , 1 , 0 , 0 , 0 , 0 , time .UTC ).Add (val ).Unix ()
225
+ require .Greater (t , expireTime , time .Now ().Unix ())
226
+ })
227
+
228
+ t .Run ("HSETEXPIRE/HLEN/EXPIRETIME - Multi field-value pairs creation" , func (t * testing.T ) {
229
+ ttlStr := "3600"
230
+ testKey := "hsetexbighashPair"
231
+ hsetExBigHash := make (map [string ]string )
232
+ cmd := []string {"hsetexpire" , testKey , ttlStr }
233
+ for i := 0 ; i < 10 ; i ++ {
234
+ key := "__avoid_collisions__" + util .RandString (0 , 8 , util .Alpha )
235
+ val := "__avoid_collisions__" + util .RandString (0 , 8 , util .Alpha )
236
+ if _ , ok := hsetExBigHash [key ]; ok {
237
+ i --
238
+ }
239
+ cmd = append (cmd , key , val )
240
+ hsetExBigHash [key ] = val
241
+ }
242
+ args := make ([]interface {}, len (cmd ))
243
+ for i , v := range cmd {
244
+ args [i ] = v
245
+ }
246
+ rdb .Do (ctx , args ... )
247
+ require .Equal (t , int64 (10 ), rdb .HLen (ctx , testKey ).Val ())
248
+ val := rdb .ExpireTime (ctx , testKey ).Val ()
249
+ expireTime := time .Date (1970 , 1 , 1 , 0 , 0 , 0 , 0 , time .UTC ).Add (val ).Unix ()
250
+ require .Greater (t , expireTime , time .Now ().Unix ())
251
+ })
252
+
121
253
t .Run ("HGET against the small hash" , func (t * testing.T ) {
122
254
var err error
123
255
for key , val := range smallhash {
0 commit comments