git.frostfs.info/TrueCloudLab/frostfs-sdk-go@v0.0.0-20241022124111-5361f0ecebd3/object/raw_test.go (about)

     1  package object
     2  
     3  import (
     4  	"crypto/rand"
     5  	"crypto/sha256"
     6  	"testing"
     7  
     8  	"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/object"
     9  	"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/checksum"
    10  	cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test"
    11  	oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
    12  	sessiontest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/session/test"
    13  	usertest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/user/test"
    14  	"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/version"
    15  	"github.com/stretchr/testify/require"
    16  )
    17  
    18  func randID(t *testing.T) oid.ID {
    19  	var id oid.ID
    20  	id.SetSHA256(randSHA256Checksum(t))
    21  
    22  	return id
    23  }
    24  
    25  func randSHA256Checksum(t *testing.T) (cs [sha256.Size]byte) {
    26  	_, err := rand.Read(cs[:])
    27  	require.NoError(t, err)
    28  
    29  	return
    30  }
    31  
    32  func randTZChecksum(t *testing.T) (cs [64]byte) {
    33  	_, err := rand.Read(cs[:])
    34  	require.NoError(t, err)
    35  
    36  	return
    37  }
    38  
    39  func TestObject_SetID(t *testing.T) {
    40  	obj := New()
    41  
    42  	id := randID(t)
    43  
    44  	obj.SetID(id)
    45  
    46  	oID, set := obj.ID()
    47  	require.True(t, set)
    48  	require.Equal(t, id, oID)
    49  }
    50  
    51  func TestObject_SetPayload(t *testing.T) {
    52  	obj := New()
    53  
    54  	payload := make([]byte, 10)
    55  	_, _ = rand.Read(payload)
    56  
    57  	obj.SetPayload(payload)
    58  
    59  	require.Equal(t, payload, obj.Payload())
    60  }
    61  
    62  func TestObject_SetVersion(t *testing.T) {
    63  	obj := New()
    64  
    65  	var ver version.Version
    66  	ver.SetMajor(1)
    67  	ver.SetMinor(2)
    68  
    69  	obj.SetVersion(&ver)
    70  
    71  	require.Equal(t, ver, *obj.Version())
    72  }
    73  
    74  func TestObject_SetPayloadSize(t *testing.T) {
    75  	obj := New()
    76  
    77  	sz := uint64(133)
    78  	obj.SetPayloadSize(sz)
    79  
    80  	require.Equal(t, sz, obj.PayloadSize())
    81  }
    82  
    83  func TestObject_SetContainerID(t *testing.T) {
    84  	obj := New()
    85  
    86  	cid := cidtest.ID()
    87  
    88  	obj.SetContainerID(cid)
    89  
    90  	cID, set := obj.ContainerID()
    91  	require.True(t, set)
    92  	require.Equal(t, cid, cID)
    93  }
    94  
    95  func TestObject_SetOwnerID(t *testing.T) {
    96  	obj := New()
    97  
    98  	ownerID := usertest.ID()
    99  
   100  	obj.SetOwnerID(ownerID)
   101  
   102  	require.Equal(t, ownerID, obj.OwnerID())
   103  }
   104  
   105  func TestObject_SetCreationEpoch(t *testing.T) {
   106  	obj := New()
   107  
   108  	creat := uint64(228)
   109  	obj.SetCreationEpoch(creat)
   110  
   111  	require.Equal(t, creat, obj.CreationEpoch())
   112  }
   113  
   114  func TestObject_SetPayloadChecksum(t *testing.T) {
   115  	obj := New()
   116  	var cs checksum.Checksum
   117  	cs.SetSHA256(randSHA256Checksum(t))
   118  
   119  	obj.SetPayloadChecksum(cs)
   120  	cs2, set := obj.PayloadChecksum()
   121  
   122  	require.True(t, set)
   123  	require.Equal(t, cs, cs2)
   124  }
   125  
   126  func TestObject_SetPayloadHomomorphicHash(t *testing.T) {
   127  	obj := New()
   128  
   129  	var cs checksum.Checksum
   130  	cs.SetTillichZemor(randTZChecksum(t))
   131  
   132  	obj.SetPayloadHomomorphicHash(cs)
   133  	cs2, set := obj.PayloadHomomorphicHash()
   134  
   135  	require.True(t, set)
   136  	require.Equal(t, cs, cs2)
   137  }
   138  
   139  func TestObject_SetAttributes(t *testing.T) {
   140  	obj := New()
   141  
   142  	a1 := NewAttribute()
   143  	a1.SetKey("key1")
   144  	a1.SetValue("val1")
   145  
   146  	a2 := NewAttribute()
   147  	a2.SetKey("key2")
   148  	a2.SetValue("val2")
   149  
   150  	obj.SetAttributes(*a1, *a2)
   151  
   152  	require.Equal(t, []Attribute{*a1, *a2}, obj.Attributes())
   153  }
   154  
   155  func TestObject_SetPreviousID(t *testing.T) {
   156  	obj := New()
   157  
   158  	prev := randID(t)
   159  
   160  	obj.SetPreviousID(prev)
   161  
   162  	oID, set := obj.PreviousID()
   163  
   164  	require.True(t, set)
   165  	require.Equal(t, prev, oID)
   166  }
   167  
   168  func TestObject_SetChildren(t *testing.T) {
   169  	obj := New()
   170  
   171  	id1 := randID(t)
   172  	id2 := randID(t)
   173  
   174  	obj.SetChildren(id1, id2)
   175  
   176  	require.Equal(t, []oid.ID{id1, id2}, obj.Children())
   177  }
   178  
   179  func TestObject_SetSplitID(t *testing.T) {
   180  	obj := New()
   181  
   182  	require.Nil(t, obj.SplitID())
   183  
   184  	splitID := NewSplitID()
   185  	obj.SetSplitID(splitID)
   186  
   187  	require.Equal(t, obj.SplitID(), splitID)
   188  }
   189  
   190  func TestObject_SetParent(t *testing.T) {
   191  	obj := New()
   192  
   193  	require.Nil(t, obj.Parent())
   194  
   195  	par := New()
   196  	par.SetID(randID(t))
   197  	par.SetContainerID(cidtest.ID())
   198  
   199  	obj.SetParent(par)
   200  
   201  	require.Equal(t, par, obj.Parent())
   202  }
   203  
   204  func TestObject_ToV2(t *testing.T) {
   205  	objV2 := new(object.Object)
   206  	objV2.SetPayload([]byte{1, 2, 3})
   207  
   208  	obj := NewFromV2(objV2)
   209  
   210  	require.Equal(t, objV2, obj.ToV2())
   211  }
   212  
   213  func TestObject_SetSessionToken(t *testing.T) {
   214  	obj := New()
   215  
   216  	tok := sessiontest.ObjectSigned()
   217  
   218  	obj.SetSessionToken(tok)
   219  
   220  	require.Equal(t, tok, obj.SessionToken())
   221  }
   222  
   223  func TestObject_CutPayload(t *testing.T) {
   224  	o1 := New()
   225  
   226  	p1 := []byte{12, 3}
   227  	o1.SetPayload(p1)
   228  
   229  	sz := uint64(13)
   230  	o1.SetPayloadSize(sz)
   231  
   232  	o2 := o1.CutPayload()
   233  
   234  	require.Equal(t, sz, o2.PayloadSize())
   235  	require.Empty(t, o2.Payload())
   236  
   237  	sz++
   238  	o1.SetPayloadSize(sz)
   239  
   240  	require.Equal(t, sz, o1.PayloadSize())
   241  	require.Equal(t, sz, o2.PayloadSize())
   242  
   243  	p2 := []byte{4, 5, 6}
   244  	o2.SetPayload(p2)
   245  
   246  	require.Equal(t, p2, o2.Payload())
   247  	require.Equal(t, p1, o1.Payload())
   248  }
   249  
   250  func TestObject_SetParentID(t *testing.T) {
   251  	obj := New()
   252  
   253  	id := randID(t)
   254  	obj.SetParentID(id)
   255  
   256  	oID, set := obj.ParentID()
   257  	require.True(t, set)
   258  	require.Equal(t, id, oID)
   259  }
   260  
   261  func TestObject_ResetRelations(t *testing.T) {
   262  	obj := New()
   263  
   264  	obj.SetPreviousID(randID(t))
   265  
   266  	obj.ResetRelations()
   267  
   268  	_, set := obj.PreviousID()
   269  	require.False(t, set)
   270  }
   271  
   272  func TestObject_HasParent(t *testing.T) {
   273  	obj := New()
   274  
   275  	obj.InitRelations()
   276  
   277  	require.True(t, obj.HasParent())
   278  
   279  	obj.ResetRelations()
   280  
   281  	require.False(t, obj.HasParent())
   282  }
   283  
   284  func TestObjectEncoding(t *testing.T) {
   285  	o := New()
   286  	o.SetID(randID(t))
   287  	o.SetContainerID(cidtest.ID())
   288  
   289  	t.Run("binary", func(t *testing.T) {
   290  		data, err := o.Marshal()
   291  		require.NoError(t, err)
   292  
   293  		o2 := New()
   294  		require.NoError(t, o2.Unmarshal(data))
   295  
   296  		require.Equal(t, o, o2)
   297  	})
   298  
   299  	t.Run("json", func(t *testing.T) {
   300  		data, err := o.MarshalJSON()
   301  		require.NoError(t, err)
   302  
   303  		o2 := New()
   304  		require.NoError(t, o2.UnmarshalJSON(data))
   305  
   306  		require.Equal(t, o, o2)
   307  	})
   308  }