diff --git a/object/slicer/slicer.go b/object/slicer/slicer.go index bcaab96c..57be5b98 100644 --- a/object/slicer/slicer.go +++ b/object/slicer/slicer.go @@ -578,7 +578,9 @@ func (x *PayloadWriter) _writeChild(ctx context.Context, meta dynamicObjectMetad obj.ResetID() obj.SetSignature(nil) - _, err = writeInMemObject(ctx, x.signer, x.stream, obj, nil, meta, x.prmObjectPutInit) + payloadAsBuffers := [][]byte{obj.Payload()} + + _, err = writeInMemObject(ctx, x.signer, x.stream, obj, payloadAsBuffers, meta, x.prmObjectPutInit) if err != nil { return fmt.Errorf("write linking object: %w", err) } diff --git a/object/slicer/slicer_test.go b/object/slicer/slicer_test.go index e0009777..8ccaf2a5 100644 --- a/object/slicer/slicer_test.go +++ b/object/slicer/slicer_test.go @@ -478,15 +478,14 @@ func (x *slicedObjectChecker) ObjectPutInit(_ context.Context, hdr object.Object } type writeSizeChecker struct { - tb testing.TB - hdr object.Object - limit uint64 - processed uint64 - base io.Writer - payloadSeen bool + tb testing.TB + hdr object.Object + limit uint64 + processed uint64 + base *bytes.Buffer } -func newSizeChecker(tb testing.TB, hdr object.Object, base io.Writer, sizeLimit uint64) *writeSizeChecker { +func newSizeChecker(tb testing.TB, hdr object.Object, base *bytes.Buffer, sizeLimit uint64) *writeSizeChecker { return &writeSizeChecker{ tb: tb, hdr: hdr, @@ -496,28 +495,32 @@ func newSizeChecker(tb testing.TB, hdr object.Object, base io.Writer, sizeLimit } func (x *writeSizeChecker) Write(p []byte) (int, error) { - if !x.payloadSeen && len(p) > 0 { - x.payloadSeen = true - } + require.NotZero(x.tb, len(p), "non of the split object should be empty") - if x.payloadSeen { - if len(x.hdr.Children()) == 0 { - // only linking objects should be streamed with - // empty payload - require.NotZero(x.tb, len(p)) - } else { - // linking object should have empty payload - require.Zero(x.tb, x.hdr.PayloadSize()) - } + n, err := x.base.Write(p) + + _, firstSet := x.hdr.FirstID() + _, previousSet := x.hdr.PreviousID() + + if firstSet && !previousSet { + // link object case; not user's payload + } else { + x.processed += uint64(n) } - n, err := x.base.Write(p) - x.processed += uint64(n) return n, err } func (x *writeSizeChecker) Close() error { require.LessOrEqual(x.tb, x.processed, x.limit, "object payload must not overflow the limit") + + if x.hdr.Type() == object.TypeLink { + payload := x.base.Bytes() + + var testLink object.Link + require.NoError(x.tb, testLink.Unmarshal(payload), "link object's payload must be structed") + } + return nil }