@@ -23,7 +23,6 @@ import (
23
23
24
24
clientv3 "go.etcd.io/etcd/client/v3"
25
25
"go.etcd.io/etcd/tests/v3/framework/config"
26
- intf "go.etcd.io/etcd/tests/v3/framework/interfaces"
27
26
"go.etcd.io/etcd/tests/v3/framework/testutils"
28
27
)
29
28
@@ -240,285 +239,3 @@ func TestKV_GetRev(t *testing.T) {
240
239
})
241
240
}
242
241
}
243
-
244
- // putTest - Basic put/get test functionality
245
- func putTest (ctx context.Context , t * testing.T , client intf.Client ) {
246
- key , value := "foo" , "bar"
247
-
248
- // Put the key-value pair
249
- err := client .Put (ctx , key , value , config.PutOptions {})
250
- require .NoError (t , err )
251
-
252
- // Verify it was stored correctly
253
- getResp , err := client .Get (ctx , key , config.GetOptions {})
254
- require .NoError (t , err )
255
- require .Equal (t , 1 , len (getResp .Kvs ))
256
- require .Equal (t , key , string (getResp .Kvs [0 ].Key ))
257
- require .Equal (t , value , string (getResp .Kvs [0 ].Value ))
258
- }
259
-
260
- // getTest - Comprehensive get operations with prefix, sorting, and limits
261
- func getTest (ctx context.Context , t * testing.T , client intf.Client ) {
262
- // Test data
263
- kvs := []struct { key , val string }{
264
- {"key1" , "val1" }, {"key2" , "val2" }, {"key3" , "val3" },
265
- }
266
- revkvs := []struct { key , val string }{
267
- {"key3" , "val3" }, {"key2" , "val2" }, {"key1" , "val1" },
268
- }
269
-
270
- // Put test data
271
- for i := range kvs {
272
- err := client .Put (ctx , kvs [i ].key , kvs [i ].val , config.PutOptions {})
273
- require .NoError (t , err , "getTest #%d: Put error" , i )
274
- }
275
-
276
- // Test cases
277
- tests := []struct {
278
- name string
279
- options config.GetOptions
280
- wkv []struct { key , val string }
281
- }{
282
- {"single key" , config.GetOptions {}, []struct { key , val string }{{"key1" , "val1" }}},
283
- {"prefix all" , config.GetOptions {Prefix : true }, kvs },
284
- {"prefix with key" , config.GetOptions {Prefix : true }, kvs },
285
- {"prefix with limit" , config.GetOptions {Prefix : true , Limit : 2 }, kvs [:2 ]},
286
- {"sort by modify ascending" , config.GetOptions {Prefix : true , SortBy : clientv3 .SortByModRevision , Order : clientv3 .SortAscend }, kvs },
287
- {"sort by version ascending" , config.GetOptions {Prefix : true , SortBy : clientv3 .SortByVersion , Order : clientv3 .SortAscend }, kvs },
288
- {"sort by create ascending" , config.GetOptions {Prefix : true , SortBy : clientv3 .SortByCreateRevision , Order : clientv3 .SortAscend }, kvs },
289
- {"sort by create descending" , config.GetOptions {Prefix : true , SortBy : clientv3 .SortByCreateRevision , Order : clientv3 .SortDescend }, revkvs },
290
- {"sort by key descending" , config.GetOptions {Prefix : true , SortBy : clientv3 .SortByKey , Order : clientv3 .SortDescend }, revkvs },
291
- }
292
-
293
- testKeys := []string {"key1" , "" , "" , "key" , "key" , "key" , "key" , "key" , "key" }
294
-
295
- for i , tt := range tests {
296
- t .Run (tt .name , func (t * testing.T ) {
297
- getResp , err := client .Get (ctx , testKeys [i ], tt .options )
298
- require .NoError (t , err , "getTest #%d: Get error" , i )
299
-
300
- require .Equal (t , len (tt .wkv ), len (getResp .Kvs ), "getTest #%d: wrong number of keys" , i )
301
- for j , expectedKv := range tt .wkv {
302
- require .Equal (t , expectedKv .key , string (getResp .Kvs [j ].Key ), "getTest #%d: wrong key at index %d" , i , j )
303
- require .Equal (t , expectedKv .val , string (getResp .Kvs [j ].Value ), "getTest #%d: wrong value at index %d" , i , j )
304
- }
305
- })
306
- }
307
- }
308
-
309
- // getFormatTest - Test different ways of getting formatted data
310
- func getFormatTest (ctx context.Context , t * testing.T , client intf.Client ) {
311
- // Put test data
312
- key , value := "abc" , "123"
313
- err := client .Put (ctx , key , value , config.PutOptions {})
314
- require .NoError (t , err )
315
-
316
- tests := []struct {
317
- name string
318
- options config.GetOptions
319
- validateFunc func (t * testing.T , resp * clientv3.GetResponse )
320
- }{
321
- {
322
- name : "normal get" ,
323
- options : config.GetOptions {},
324
- validateFunc : func (t * testing.T , resp * clientv3.GetResponse ) {
325
- require .Equal (t , 1 , len (resp .Kvs ))
326
- require .Equal (t , key , string (resp .Kvs [0 ].Key ))
327
- require .Equal (t , value , string (resp .Kvs [0 ].Value ))
328
- },
329
- },
330
- {
331
- name : "keys only" ,
332
- options : config.GetOptions {KeysOnly : true },
333
- validateFunc : func (t * testing.T , resp * clientv3.GetResponse ) {
334
- require .Equal (t , 1 , len (resp .Kvs ))
335
- require .Equal (t , key , string (resp .Kvs [0 ].Key ))
336
- require .Empty (t , resp .Kvs [0 ].Value )
337
- },
338
- },
339
- {
340
- name : "count only" ,
341
- options : config.GetOptions {CountOnly : true },
342
- validateFunc : func (t * testing.T , resp * clientv3.GetResponse ) {
343
- require .Equal (t , int64 (1 ), resp .Count )
344
- require .Equal (t , 0 , len (resp .Kvs )) // No keys returned with CountOnly
345
- },
346
- },
347
- }
348
-
349
- for _ , tt := range tests {
350
- t .Run (tt .name , func (t * testing.T ) {
351
- getResp , err := client .Get (ctx , key , tt .options )
352
- require .NoError (t , err )
353
- tt .validateFunc (t , getResp )
354
- })
355
- }
356
- }
357
-
358
- // getMinMaxCreateModRevTest - Test get operations with revision validation
359
- func getMinMaxCreateModRevTest (ctx context.Context , t * testing.T , client intf.Client ) {
360
- kvs := []struct { key , val string }{
361
- {"key1" , "val1" }, // First put
362
- {"key2" , "val2" }, // Second put
363
- {"key1" , "val3" }, // Update key1
364
- {"key4" , "val4" }, // Third unique key
365
- }
366
-
367
- // Track revisions for validation
368
- var revisions []int64
369
- for i := range kvs {
370
- err := client .Put (ctx , kvs [i ].key , kvs [i ].val , config.PutOptions {})
371
- require .NoError (t , err , "getMinMaxCreateModRevTest #%d: Put error" , i )
372
-
373
- // Get the current revision
374
- getResp , err := client .Get (ctx , kvs [i ].key , config.GetOptions {})
375
- require .NoError (t , err )
376
- if len (getResp .Kvs ) > 0 {
377
- revisions = append (revisions , getResp .Kvs [0 ].ModRevision )
378
- }
379
- }
380
-
381
- tests := []struct {
382
- name string
383
- key string
384
- options config.GetOptions
385
- validateFunc func (t * testing.T , resp * clientv3.GetResponse )
386
- }{
387
- {
388
- name : "prefix get all keys" ,
389
- key : "key" ,
390
- options : config.GetOptions {
391
- Prefix : true ,
392
- },
393
- validateFunc : func (t * testing.T , resp * clientv3.GetResponse ) {
394
- require .Equal (t , 3 , len (resp .Kvs )) // key1, key2, key4
395
- keys := make (map [string ]string )
396
- for _ , kv := range resp .Kvs {
397
- keys [string (kv .Key )] = string (kv .Value )
398
- }
399
- require .Equal (t , "val3" , keys ["key1" ]) // Updated value
400
- require .Equal (t , "val2" , keys ["key2" ])
401
- require .Equal (t , "val4" , keys ["key4" ])
402
- },
403
- },
404
- {
405
- name : "get with revision filter" ,
406
- key : "key1" ,
407
- options : config.GetOptions {
408
- Revision : int (revisions [0 ]), // Get key1 at first revision
409
- },
410
- validateFunc : func (t * testing.T , resp * clientv3.GetResponse ) {
411
- require .Equal (t , 1 , len (resp .Kvs ))
412
- require .Equal (t , "key1" , string (resp .Kvs [0 ].Key ))
413
- require .Equal (t , "val1" , string (resp .Kvs [0 ].Value ))
414
- },
415
- },
416
- {
417
- name : "verify create vs modify revisions" ,
418
- key : "key" ,
419
- options : config.GetOptions {
420
- Prefix : true ,
421
- SortBy : clientv3 .SortByCreateRevision ,
422
- Order : clientv3 .SortAscend ,
423
- },
424
- validateFunc : func (t * testing.T , resp * clientv3.GetResponse ) {
425
- require .Equal (t , 3 , len (resp .Kvs ))
426
- // Verify that CreateRevision and ModRevision are tracked correctly
427
- for _ , kv := range resp .Kvs {
428
- require .Greater (t , kv .CreateRevision , int64 (0 ))
429
- require .Greater (t , kv .ModRevision , int64 (0 ))
430
- require .GreaterOrEqual (t , kv .ModRevision , kv .CreateRevision )
431
- }
432
- },
433
- },
434
- }
435
-
436
- for _ , tt := range tests {
437
- t .Run (tt .name , func (t * testing.T ) {
438
- getResp , err := client .Get (ctx , tt .key , tt .options )
439
- require .NoError (t , err )
440
- tt .validateFunc (t , getResp )
441
- })
442
- }
443
- }
444
-
445
- // delTest - Test comprehensive delete operations
446
- func delTest (ctx context.Context , t * testing.T , client intf.Client ) {
447
- tests := []struct {
448
- name string
449
- puts []struct { key , val string }
450
- deleteKey string
451
- deleteOpts config.DeleteOptions
452
- deletedNum int64
453
- }{
454
- {
455
- name : "delete all with prefix" ,
456
- puts : []struct { key , val string }{
457
- {"foo1" , "bar" }, {"foo2" , "bar" }, {"foo3" , "bar" },
458
- },
459
- deleteKey : "" ,
460
- deleteOpts : config.DeleteOptions {Prefix : true },
461
- deletedNum : 3 ,
462
- },
463
- {
464
- name : "delete non-existent key" ,
465
- puts : []struct { key , val string }{
466
- {"this" , "value" },
467
- },
468
- deleteKey : "that" ,
469
- deleteOpts : config.DeleteOptions {},
470
- deletedNum : 0 ,
471
- },
472
- {
473
- name : "delete single key" ,
474
- puts : []struct { key , val string }{
475
- {"sample" , "value" },
476
- },
477
- deleteKey : "sample" ,
478
- deleteOpts : config.DeleteOptions {},
479
- deletedNum : 1 ,
480
- },
481
- {
482
- name : "delete with prefix pattern" ,
483
- puts : []struct { key , val string }{
484
- {"key1" , "val1" }, {"key2" , "val2" }, {"key3" , "val3" },
485
- },
486
- deleteKey : "key" ,
487
- deleteOpts : config.DeleteOptions {Prefix : true },
488
- deletedNum : 3 ,
489
- },
490
- {
491
- name : "delete range" ,
492
- puts : []struct { key , val string }{
493
- {"zoo1" , "bar" }, {"zoo2" , "bar2" }, {"zoo3" , "bar3" },
494
- },
495
- deleteKey : "zoo1" ,
496
- deleteOpts : config.DeleteOptions {Prefix : true }, // Similar to --from-key
497
- deletedNum : 3 ,
498
- },
499
- }
500
-
501
- for i , tt := range tests {
502
- t .Run (tt .name , func (t * testing.T ) {
503
- // Put test data
504
- for j := range tt .puts {
505
- err := client .Put (ctx , tt .puts [j ].key , tt .puts [j ].val , config.PutOptions {})
506
- require .NoError (t , err , "delTest #%d-%d: Put error" , i , j )
507
- }
508
-
509
- // Delete operation
510
- delResp , err := client .Delete (ctx , tt .deleteKey , tt .deleteOpts )
511
- require .NoError (t , err , "delTest #%d: Delete error" , i )
512
- require .Equal (t , tt .deletedNum , delResp .Deleted , "delTest #%d: wrong deleted count" , i )
513
-
514
- // Verify deletion by checking remaining keys
515
- if tt .deletedNum > 0 {
516
- getResp , err := client .Get (ctx , tt .deleteKey , config.GetOptions {Prefix : true })
517
- require .NoError (t , err )
518
- if tt .deleteOpts .Prefix {
519
- require .Equal (t , 0 , len (getResp .Kvs ), "delTest #%d: keys still exist after prefix delete" , i )
520
- }
521
- }
522
- })
523
- }
524
- }
0 commit comments