diff --git a/object/slicer/slicer.go b/object/slicer/slicer.go index c27e6e03..952b2cdc 100644 --- a/object/slicer/slicer.go +++ b/object/slicer/slicer.go @@ -569,15 +569,15 @@ func (x *PayloadWriter) _writeChild(ctx context.Context, meta dynamicObjectMetad if x.withSplit && last { var linkObj object.Link linkObj.SetObjects(x.writtenChildren) - obj.WriteLink(linkObj) + obj.SetType(object.TypeLink) obj.ResetPreviousID() // we reuse already written object, we should reset these fields, to eval them one more time in writeInMemObject. obj.ResetID() obj.SetSignature(nil) - payload := obj.Payload() - payloadAsBuffers := [][]byte{obj.Payload()} + payload := linkObj.Marshal() + payloadAsBuffers := [][]byte{payload} if uint64(len(payload)) > x.payloadSizeLimit { return fmt.Errorf("link's payload exceeds max available size: %d > %d", uint64(len(payload)), x.payloadSizeLimit) diff --git a/object/slicer/slicer_test.go b/object/slicer/slicer_test.go index 36ebf8c6..ad78138d 100644 --- a/object/slicer/slicer_test.go +++ b/object/slicer/slicer_test.go @@ -34,39 +34,23 @@ import ( "github.com/stretchr/testify/require" ) -const defaultLimit = 1 << 20 - func TestSliceDataIntoObjects(t *testing.T) { - const size = 1 << 10 - - t.Run("known limit", func(t *testing.T) { - t.Run("under limit", func(t *testing.T) { - testSlicer(t, size, size) - testSlicer(t, size, size+1) - }) + const limit = 1 << 10 - t.Run("multiple size", func(t *testing.T) { - testSlicer(t, size, 3*size) - testSlicer(t, size, 3*size+1) - }) - }) - - t.Run("unknown limit", func(t *testing.T) { - t.Run("under limit", func(t *testing.T) { - testSlicer(t, defaultLimit-1, 0) - testSlicer(t, defaultLimit, 0) - }) - - t.Run("multiple size", func(t *testing.T) { - testSlicer(t, 3*defaultLimit, 0) - testSlicer(t, 3*defaultLimit+1, 0) + for _, tc := range []struct { + name string + ln uint64 + }{ + {name: "no payload", ln: 0}, + {name: "limit-1B", ln: limit - 1}, + {name: "exactly limit", ln: limit}, + {name: "limitX3", ln: limit * 3}, + {name: "limitX3+1B", ln: limit*3 + 1}, + } { + t.Run(tc.name, func(t *testing.T) { + testSlicer(t, tc.ln, limit) }) - }) - - t.Run("no payload", func(t *testing.T) { - testSlicer(t, 0, 0) - testSlicer(t, 0, 1024) - }) + } } func BenchmarkSliceDataIntoObjects(b *testing.B) { @@ -206,11 +190,7 @@ func randomInput(size, sizeLimit uint64) (input, slicer.Options) { in.signer = user.NewAutoIDSigner(*key) in.container = cidtest.ID() in.currentEpoch = rand.Uint64() - if sizeLimit > 0 { - in.payloadLimit = sizeLimit - } else { - in.payloadLimit = defaultLimit - } + in.payloadLimit = sizeLimit in.payload = testutil.RandByteSlice(size) in.attributes = attrs in.owner = usertest.ID() @@ -488,10 +468,10 @@ func (x *writeSizeChecker) Close() error { var testLink object.Link require.NoError(x.tb, testLink.Unmarshal(payload), "link object's payload must be structured") - } else { - require.LessOrEqual(x.tb, x.processed, x.limit, "object payload must not overflow the limit") } + require.LessOrEqual(x.tb, x.processed, x.limit, "object payload must not overflow the limit") + require.Equal(x.tb, x.processed, x.hdr.PayloadSize()) // deprecated things @@ -529,7 +509,7 @@ type chainCollector struct { mPayloads map[oid.ID]payloadWithChecksum - children []object.MeasuredObject + link oid.ID } func newChainCollector(tb testing.TB) *chainCollector { @@ -576,6 +556,8 @@ func (x *chainCollector) handleOutgoingObject(headerOriginal object.Object, payl var header object.Object headerOriginal.CopyTo(&header) + require.Empty(x.tb, header.Payload(), "payload must be unset in header") + id := header.GetID() require.False(x.tb, id.IsZero(), "all objects must have an ID") @@ -648,14 +630,7 @@ func (x *chainCollector) handleOutgoingObject(headerOriginal object.Object, payl var testLink object.Link require.NoError(x.tb, header.ReadLink(&testLink)) - children := testLink.Objects() - if len(children) > 0 { - if len(x.children) > 0 { - require.Equal(x.tb, x.children, children, "children list must be the same") - } else { - x.children = children - } - } + x.link = id } } @@ -745,9 +720,17 @@ func (x *chainCollector) verify(in input, rootID oid.ID) { rootObj.SetPayload(restoredPayload.Bytes()) if uint64(len(in.payload)) <= in.payloadLimit { - require.Empty(x.tb, x.children) + require.Zero(x.tb, x.link) } else { - require.Equal(x.tb, x.children, restoredChain) + require.NotZero(x.tb, x.link) + p, ok := x.mPayloads[x.link] + require.True(x.tb, ok) + payload, err := io.ReadAll(p.r) + require.NoError(x.tb, err) + + var l object.Link + require.NoError(x.tb, l.Unmarshal(payload)) + require.Equal(x.tb, l.Objects(), restoredChain) } id := rootObj.GetID()