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  }