github.com/treeverse/lakefs@v1.24.1-0.20240520134607-95648127bfb0/pkg/graveler/committed/unmarshal_iterator_test.go (about) 1 package committed_test 2 3 import ( 4 "testing" 5 6 "github.com/go-test/deep" 7 "github.com/golang/mock/gomock" 8 "github.com/treeverse/lakefs/pkg/graveler" 9 "github.com/treeverse/lakefs/pkg/graveler/committed" 10 "github.com/treeverse/lakefs/pkg/graveler/committed/mock" 11 ) 12 13 func TestUnmarshalIterator(t *testing.T) { 14 tests := []struct { 15 Name string 16 Keys []graveler.Key 17 Values []*graveler.Value 18 }{ 19 { 20 Name: "empty", 21 Keys: make([]graveler.Key, 0), 22 Values: make([]*graveler.Value, 0), 23 }, 24 { 25 Name: "one", 26 Keys: []graveler.Key{graveler.Key("k1")}, 27 Values: []*graveler.Value{{Identity: []byte(""), Data: []byte("")}}, 28 }, 29 { 30 Name: "two", 31 Keys: []graveler.Key{ 32 graveler.Key("k1"), 33 graveler.Key("k2"), 34 }, 35 Values: []*graveler.Value{ 36 {Identity: []byte("id1"), Data: []byte("data1")}, 37 {Identity: []byte("id2"), Data: []byte("data2")}, 38 }, 39 }, 40 } 41 42 for _, tt := range tests { 43 t.Run(tt.Name, func(t *testing.T) { 44 ctrl := gomock.NewController(t) 45 defer ctrl.Finish() 46 47 // we expect the iterator to call our iterator n+1 times and check an error on the last call 48 mockIt := mock.NewMockValueIterator(ctrl) 49 mockIt.EXPECT().Next().Times(len(tt.Keys)). 50 Return(true) 51 for i := range tt.Keys { 52 mockIt.EXPECT().Value().Times(1). 53 Return(&committed.Record{ 54 Key: committed.Key(tt.Keys[i]), 55 Value: committed.MustMarshalValue(tt.Values[i]), 56 }) 57 } 58 mockIt.EXPECT().Next().Times(1).Return(false) 59 mockIt.EXPECT().Err().Times(1).Return(nil) 60 61 // use the iterator and collect the values 62 keys := make([]graveler.Key, 0) 63 values := make([]*graveler.Value, 0) 64 it := committed.NewUnmarshalIterator(mockIt) 65 for it.Next() { 66 v := it.Value() 67 if v == nil { 68 t.Fatal("Iterator return value is nil after next") 69 } 70 keys = append(keys, v.Key) 71 values = append(values, v.Value) 72 } 73 if err := it.Err(); err != nil { 74 t.Fatal("Iteration ended with error", err) 75 } 76 // verify keys and values 77 if diff := deep.Equal(keys, tt.Keys); diff != nil { 78 t.Fatal("Difference found in keys", diff) 79 } 80 if diff := deep.Equal(values, tt.Values); diff != nil { 81 t.Fatal("Difference found in values", diff) 82 } 83 }) 84 } 85 }