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  }