github.com/treeverse/lakefs@v1.24.1-0.20240520134607-95648127bfb0/pkg/graveler/committed/value_test.go (about) 1 package committed_test 2 3 import ( 4 "errors" 5 "testing" 6 7 "github.com/go-test/deep" 8 "github.com/treeverse/lakefs/pkg/graveler" 9 "github.com/treeverse/lakefs/pkg/graveler/committed" 10 ) 11 12 func TestGravelerValueMarshal(t *testing.T) { 13 cases := []struct { 14 name string 15 v graveler.Value 16 b []byte 17 }{ 18 {name: "empty", v: graveler.Value{}, b: []byte{0, 0}}, 19 {name: "identity", v: graveler.Value{Identity: []byte("foo")}, b: []byte{6, 102, 111, 111, 0}}, 20 {name: "data", v: graveler.Value{Data: []byte("the quick brown fox")}, b: []byte{0, 38, 116, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120}}, 21 {name: "identityAndData", v: graveler.Value{Identity: []byte("foo"), Data: []byte("the quick brown fox")}, b: []byte{6, 102, 111, 111, 38, 116, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120}}, 22 } 23 24 for _, c := range cases { 25 t.Run(c.name, func(t *testing.T) { 26 b, err := committed.MarshalValue(&c.v) 27 if err != nil { 28 t.Error(err) 29 } 30 if diffs := deep.Equal(b, c.b); diffs != nil { 31 t.Error("bad bytes: ", diffs) 32 } 33 }) 34 } 35 } 36 37 func TestGravelerValueUnmarshal(t *testing.T) { 38 cases := []struct { 39 name string 40 v *graveler.Value 41 b []byte 42 err error 43 }{ 44 {name: "empty", v: &graveler.Value{}, b: []byte{0, 0}}, 45 {name: "identity", v: &graveler.Value{Identity: []byte("foo")}, b: []byte{6, 102, 111, 111, 0}}, 46 {name: "data", v: &graveler.Value{Data: []byte("the quick brown fox")}, b: []byte{0, 38, 116, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120}}, 47 {name: "identityAndData", v: &graveler.Value{Identity: []byte("foo"), Data: []byte("the quick brown fox")}, b: []byte{6, 102, 111, 111, 38, 116, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120}}, 48 {name: "failIdentityNegativeLength", b: []byte{3, 102, 111, 111, 0}, err: committed.ErrBadValueBytes}, 49 {name: "failIdentityTooShort", b: []byte{4, 102, 111, 111, 0}, err: committed.ErrBadValueBytes}, 50 {name: "failIdentityTooLong", b: []byte{16, 102, 111, 111, 0}, err: committed.ErrBadValueBytes}, 51 {name: "failIdentityDataNegativeLength", b: []byte{6, 102, 111, 111, 17, 116, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120}, err: committed.ErrBadValueBytes}, 52 {name: "identityAndDataAndLeftovers", v: &graveler.Value{Identity: []byte("foo"), Data: []byte("the quick brown fox")}, b: []byte{6, 102, 111, 111, 38, 116, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 1, 2, 3, 4, 5, 6, 7, 8, 9}}, 53 {name: "failIdentityDataTooLong", b: []byte{6, 102, 111, 111, 250, 116, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120}, err: committed.ErrBadValueBytes}, 54 } 55 56 for _, c := range cases { 57 if c.v != nil && c.v.Identity == nil { 58 c.v.Identity = make([]byte, 0) 59 } 60 if c.v != nil && c.v.Data == nil { 61 c.v.Data = make([]byte, 0) 62 } 63 t.Run(c.name, func(t *testing.T) { 64 v, err := committed.UnmarshalValue(c.b) 65 if !errors.Is(err, c.err) { 66 t.Errorf("got error %s != %s", err, c.err) 67 } 68 if diffs := deep.Equal(v, c.v); diffs != nil { 69 t.Errorf("bad value %+v: %s", v, diffs) 70 } 71 }) 72 } 73 }