@@ -23,7 +23,6 @@ import (
2323
2424 clientv3 "go.etcd.io/etcd/client/v3"
2525 "go.etcd.io/etcd/tests/v3/framework/config"
26- intf "go.etcd.io/etcd/tests/v3/framework/interfaces"
2726 "go.etcd.io/etcd/tests/v3/framework/testutils"
2827)
2928
@@ -240,285 +239,3 @@ func TestKV_GetRev(t *testing.T) {
240239 })
241240 }
242241}
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