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

     1  package erasurecode_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	objectSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
     7  	"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/erasurecode"
     8  	oidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id/test"
     9  	"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
    10  	"github.com/stretchr/testify/require"
    11  )
    12  
    13  // The library can behave differently for big shard counts.
    14  // This test checks we support the maximum number of chunks we promise.
    15  func TestSplitMaxShardCount(t *testing.T) {
    16  	pk, err := keys.NewPrivateKey()
    17  	require.NoError(t, err)
    18  
    19  	original := newObject(t, 1024, pk)
    20  
    21  	t.Run("only data", func(t *testing.T) {
    22  		c, err := erasurecode.NewConstructor(erasurecode.MaxShardCount, 0)
    23  		require.NoError(t, err)
    24  
    25  		parts, err := c.Split(original, &pk.PrivateKey)
    26  		require.NoError(t, err)
    27  		require.Len(t, parts, erasurecode.MaxShardCount)
    28  
    29  		for _, part := range parts {
    30  			require.NoError(t, objectSDK.CheckHeaderVerificationFields(part))
    31  		}
    32  	})
    33  	t.Run("data + parity", func(t *testing.T) {
    34  		c, err := erasurecode.NewConstructor(1, erasurecode.MaxShardCount-1)
    35  		require.NoError(t, err)
    36  
    37  		parts, err := c.Split(original, &pk.PrivateKey)
    38  		require.NoError(t, err)
    39  		require.Len(t, parts, erasurecode.MaxShardCount)
    40  
    41  		for _, part := range parts {
    42  			require.NoError(t, objectSDK.CheckHeaderVerificationFields(part))
    43  		}
    44  	})
    45  	t.Run("ec parents are children of last Split part", func(t *testing.T) {
    46  		c, err := erasurecode.NewConstructor(1, erasurecode.MaxShardCount-1)
    47  		require.NoError(t, err)
    48  
    49  		splitted1 := newObject(t, 1024, pk)
    50  		splitted2 := newObject(t, 1024, pk)
    51  
    52  		splittedId1, _ := splitted1.ID()
    53  		splittedId2, _ := splitted2.ID()
    54  
    55  		splitID := objectSDK.NewSplitID()
    56  		parent := objectSDK.New()
    57  		parent.SetID(oidtest.ID())
    58  		parent.SetChildren(splittedId1, splittedId2)
    59  		parent.SetSplitID(splitID)
    60  
    61  		splitted1.SetSplitID(splitID)
    62  		splitted1.SetParent(parent)
    63  		splitted2.SetSplitID(splitID)
    64  		splitted2.SetParent(parent)
    65  
    66  		parts1, err := c.Split(splitted1, &pk.PrivateKey)
    67  		require.NoError(t, err)
    68  		require.Len(t, parts1, erasurecode.MaxShardCount)
    69  
    70  		for _, part := range parts1 {
    71  			require.NoError(t, objectSDK.CheckHeaderVerificationFields(part))
    72  
    73  			require.NotNil(t, part.ECHeader().ParentSplitID())
    74  			require.Equal(t, *splitID, *part.ECHeader().ParentSplitID())
    75  			require.NotNil(t, part.ECHeader().ParentSplitParentID())
    76  		}
    77  
    78  		parts2, err := c.Split(splitted2, &pk.PrivateKey)
    79  		require.NoError(t, err)
    80  		require.Len(t, parts1, erasurecode.MaxShardCount)
    81  
    82  		for _, part := range parts2 {
    83  			require.NoError(t, objectSDK.CheckHeaderVerificationFields(part))
    84  
    85  			require.NotNil(t, part.ECHeader().ParentSplitID())
    86  			require.Equal(t, *splitID, *part.ECHeader().ParentSplitID())
    87  			require.NotNil(t, part.ECHeader().ParentSplitParentID())
    88  		}
    89  
    90  	})
    91  	t.Run("ec parents are children of non-last Split part", func(t *testing.T) {
    92  		c, err := erasurecode.NewConstructor(1, erasurecode.MaxShardCount-1)
    93  		require.NoError(t, err)
    94  
    95  		splitted1 := newObject(t, 1024, pk)
    96  		splitted2 := newObject(t, 1024, pk)
    97  
    98  		splittedId1, _ := splitted1.ID()
    99  		splittedId2, _ := splitted2.ID()
   100  
   101  		splitID := objectSDK.NewSplitID()
   102  		parent := objectSDK.New()
   103  		// Such parent has got no ID.
   104  		parent.SetChildren(splittedId1, splittedId2)
   105  		parent.SetSplitID(splitID)
   106  
   107  		splitted1.SetSplitID(splitID)
   108  		splitted1.SetParent(parent)
   109  		splitted2.SetSplitID(splitID)
   110  		splitted2.SetParent(parent)
   111  
   112  		parts1, err := c.Split(splitted1, &pk.PrivateKey)
   113  		require.NoError(t, err)
   114  		require.Len(t, parts1, erasurecode.MaxShardCount)
   115  
   116  		for _, part := range parts1 {
   117  			require.NoError(t, objectSDK.CheckHeaderVerificationFields(part))
   118  
   119  			require.NotNil(t, part.ECHeader().ParentSplitID())
   120  			require.Equal(t, *splitID, *part.ECHeader().ParentSplitID())
   121  			require.Nil(t, part.ECHeader().ParentSplitParentID())
   122  		}
   123  
   124  		parts2, err := c.Split(splitted2, &pk.PrivateKey)
   125  		require.NoError(t, err)
   126  		require.Len(t, parts1, erasurecode.MaxShardCount)
   127  
   128  		for _, part := range parts2 {
   129  			require.NoError(t, objectSDK.CheckHeaderVerificationFields(part))
   130  
   131  			require.NotNil(t, part.ECHeader().ParentSplitID())
   132  			require.Equal(t, *splitID, *part.ECHeader().ParentSplitID())
   133  			require.Nil(t, part.ECHeader().ParentSplitParentID())
   134  		}
   135  
   136  	})
   137  
   138  }