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 }