git.frostfs.info/TrueCloudLab/frostfs-sdk-go@v0.0.0-20241022124111-5361f0ecebd3/container/container_test.go (about) 1 package container_test 2 3 import ( 4 "crypto/sha256" 5 "strconv" 6 "testing" 7 "time" 8 9 v2container "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/container" 10 v2netmap "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/netmap" 11 "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs" 12 "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container" 13 cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id" 14 cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test" 15 containertest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/test" 16 frostfscrypto "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/crypto" 17 netmaptest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/netmap/test" 18 usertest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/user/test" 19 "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/version" 20 "github.com/google/uuid" 21 "github.com/nspcc-dev/neo-go/pkg/crypto/keys" 22 "github.com/stretchr/testify/require" 23 ) 24 25 func TestPlacementPolicyEncoding(t *testing.T) { 26 v := containertest.Container() 27 28 t.Run("binary", func(t *testing.T) { 29 var v2 container.Container 30 require.NoError(t, v2.Unmarshal(v.Marshal())) 31 32 require.Equal(t, v, v2) 33 }) 34 35 t.Run("json", func(t *testing.T) { 36 data, err := v.MarshalJSON() 37 require.NoError(t, err) 38 39 var v2 container.Container 40 require.NoError(t, v2.UnmarshalJSON(data)) 41 42 require.Equal(t, v, v2) 43 }) 44 } 45 46 func TestContainer_Init(t *testing.T) { 47 val := containertest.Container() 48 49 val.Init() 50 51 var msg v2container.Container 52 val.WriteToV2(&msg) 53 54 binNonce := msg.GetNonce() 55 56 var nonce uuid.UUID 57 require.NoError(t, nonce.UnmarshalBinary(binNonce)) 58 require.EqualValues(t, 4, nonce.Version()) 59 60 verV2 := msg.GetVersion() 61 require.NotNil(t, verV2) 62 63 var ver version.Version 64 require.NoError(t, ver.ReadFromV2(*verV2)) 65 66 require.Equal(t, version.Current(), ver) 67 68 var val2 container.Container 69 require.NoError(t, val2.ReadFromV2(msg)) 70 71 require.Equal(t, val, val2) 72 } 73 74 func TestContainer_Owner(t *testing.T) { 75 var val container.Container 76 77 require.Zero(t, val.Owner()) 78 79 val = containertest.Container() 80 81 owner := usertest.ID() 82 83 val.SetOwner(owner) 84 85 var msg v2container.Container 86 val.WriteToV2(&msg) 87 88 var msgOwner refs.OwnerID 89 owner.WriteToV2(&msgOwner) 90 91 require.Equal(t, &msgOwner, msg.GetOwnerID()) 92 93 var val2 container.Container 94 require.NoError(t, val2.ReadFromV2(msg)) 95 96 require.True(t, val2.Owner().Equals(owner)) 97 } 98 99 func TestContainer_BasicACL(t *testing.T) { 100 var val container.Container 101 102 require.Zero(t, val.BasicACL()) 103 104 val = containertest.Container() 105 106 basicACL := containertest.BasicACL() 107 val.SetBasicACL(basicACL) 108 109 var msg v2container.Container 110 val.WriteToV2(&msg) 111 112 require.EqualValues(t, basicACL.Bits(), msg.GetBasicACL()) 113 114 var val2 container.Container 115 require.NoError(t, val2.ReadFromV2(msg)) 116 117 require.Equal(t, basicACL, val2.BasicACL()) 118 } 119 120 func TestContainer_PlacementPolicy(t *testing.T) { 121 var val container.Container 122 123 require.Zero(t, val.PlacementPolicy()) 124 125 val = containertest.Container() 126 127 pp := netmaptest.PlacementPolicy() 128 val.SetPlacementPolicy(pp) 129 130 var msgPolicy v2netmap.PlacementPolicy 131 pp.WriteToV2(&msgPolicy) 132 133 var msg v2container.Container 134 val.WriteToV2(&msg) 135 136 require.Equal(t, &msgPolicy, msg.GetPlacementPolicy()) 137 138 var val2 container.Container 139 require.NoError(t, val2.ReadFromV2(msg)) 140 141 require.Equal(t, pp, val2.PlacementPolicy()) 142 } 143 144 func assertContainsAttribute(t *testing.T, m v2container.Container, key, val string) { 145 var msgAttr v2container.Attribute 146 147 msgAttr.SetKey(key) 148 msgAttr.SetValue(val) 149 require.Contains(t, m.GetAttributes(), msgAttr) 150 } 151 152 func TestContainer_Attribute(t *testing.T) { 153 const attrKey1, attrKey2 = v2container.SysAttributePrefix + "key1", v2container.SysAttributePrefix + "key2" 154 const attrVal1, attrVal2 = "val1", "val2" 155 156 val := containertest.Container() 157 158 val.SetAttribute(attrKey1, attrVal1) 159 val.SetAttribute(attrKey2, attrVal2) 160 161 var i int 162 val.IterateUserAttributes(func(key, val string) { 163 i++ 164 }) 165 require.Equal(t, 1, i) 166 167 var msg v2container.Container 168 val.WriteToV2(&msg) 169 170 require.GreaterOrEqual(t, len(msg.GetAttributes()), 2) 171 assertContainsAttribute(t, msg, attrKey1, attrVal1) 172 assertContainsAttribute(t, msg, attrKey2, attrVal2) 173 174 var val2 container.Container 175 require.NoError(t, val2.ReadFromV2(msg)) 176 177 require.Equal(t, attrVal1, val2.Attribute(attrKey1)) 178 require.Equal(t, attrVal2, val2.Attribute(attrKey2)) 179 180 m := map[string]string{} 181 182 val2.IterateAttributes(func(key, val string) { 183 m[key] = val 184 }) 185 186 require.GreaterOrEqual(t, len(m), 2) 187 require.Equal(t, attrVal1, m[attrKey1]) 188 require.Equal(t, attrVal2, m[attrKey2]) 189 190 val2.SetAttribute(attrKey1, attrVal1+"_") 191 require.Equal(t, attrVal1+"_", val2.Attribute(attrKey1)) 192 } 193 194 func TestSetName(t *testing.T) { 195 var val container.Container 196 197 require.Panics(t, func() { 198 container.SetName(&val, "") 199 }) 200 201 val = containertest.Container() 202 203 const name = "some name" 204 205 container.SetName(&val, name) 206 207 var msg v2container.Container 208 val.WriteToV2(&msg) 209 210 assertContainsAttribute(t, msg, "Name", name) 211 212 var val2 container.Container 213 require.NoError(t, val2.ReadFromV2(msg)) 214 215 require.Equal(t, name, container.Name(val2)) 216 } 217 218 func TestSetCreationTime(t *testing.T) { 219 var val container.Container 220 221 require.Zero(t, container.CreatedAt(val).Unix()) 222 223 val = containertest.Container() 224 225 creat := time.Now() 226 227 container.SetCreationTime(&val, creat) 228 229 var msg v2container.Container 230 val.WriteToV2(&msg) 231 232 assertContainsAttribute(t, msg, "Timestamp", strconv.FormatInt(creat.Unix(), 10)) 233 234 var val2 container.Container 235 require.NoError(t, val2.ReadFromV2(msg)) 236 237 require.Equal(t, creat.Unix(), container.CreatedAt(val2).Unix()) 238 } 239 240 func TestDisableHomomorphicHashing(t *testing.T) { 241 var val container.Container 242 243 require.False(t, container.IsHomomorphicHashingDisabled(val)) 244 245 val = containertest.Container() 246 247 container.DisableHomomorphicHashing(&val) 248 249 var msg v2container.Container 250 val.WriteToV2(&msg) 251 252 assertContainsAttribute(t, msg, v2container.SysAttributePrefix+"DISABLE_HOMOMORPHIC_HASHING", "true") 253 254 var val2 container.Container 255 require.NoError(t, val2.ReadFromV2(msg)) 256 257 require.True(t, container.IsHomomorphicHashingDisabled(val2)) 258 } 259 260 func TestWriteDomain(t *testing.T) { 261 var val container.Container 262 263 require.Zero(t, container.ReadDomain(val).Name()) 264 265 val = containertest.Container() 266 267 const name = "domain name" 268 269 var d container.Domain 270 d.SetName(name) 271 272 container.WriteDomain(&val, d) 273 274 var msg v2container.Container 275 val.WriteToV2(&msg) 276 277 assertContainsAttribute(t, msg, v2container.SysAttributeName, name) 278 assertContainsAttribute(t, msg, v2container.SysAttributeZone, "container") 279 280 const zone = "domain zone" 281 282 d.SetZone(zone) 283 284 container.WriteDomain(&val, d) 285 286 val.WriteToV2(&msg) 287 288 assertContainsAttribute(t, msg, v2container.SysAttributeZone, zone) 289 290 var val2 container.Container 291 require.NoError(t, val2.ReadFromV2(msg)) 292 293 require.Equal(t, d, container.ReadDomain(val2)) 294 } 295 296 func TestCalculateID(t *testing.T) { 297 val := containertest.Container() 298 299 require.False(t, container.AssertID(cidtest.ID(), val)) 300 301 var id cid.ID 302 container.CalculateID(&id, val) 303 304 var msg refs.ContainerID 305 id.WriteToV2(&msg) 306 307 h := sha256.Sum256(val.Marshal()) 308 require.Equal(t, h[:], msg.GetValue()) 309 310 var id2 cid.ID 311 require.NoError(t, id2.ReadFromV2(msg)) 312 313 require.True(t, container.AssertID(id2, val)) 314 } 315 316 func TestCalculateSignature(t *testing.T) { 317 key, err := keys.NewPrivateKey() 318 require.NoError(t, err) 319 320 val := containertest.Container() 321 322 var sig frostfscrypto.Signature 323 324 require.NoError(t, container.CalculateSignature(&sig, val, key.PrivateKey)) 325 326 var msg refs.Signature 327 sig.WriteToV2(&msg) 328 329 var sig2 frostfscrypto.Signature 330 require.NoError(t, sig2.ReadFromV2(msg)) 331 332 require.True(t, container.VerifySignature(sig2, val)) 333 }