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 }