package shard import ( "context" "errors" "testing" "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/object" "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/internal/testutil" cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test" objectSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object" "github.com/stretchr/testify/require" ) func TestShard_Head(t *testing.T) { t.Parallel() t.Run("without write cache", func(t *testing.T) { t.Parallel() testShardHead(t, false) }) t.Run("with write cache", func(t *testing.T) { t.Parallel() testShardHead(t, true) }) } func testShardHead(t *testing.T, hasWriteCache bool) { sh := newShard(t, hasWriteCache) defer func() { require.NoError(t, sh.Close(context.Background())) }() var putPrm PutPrm var headPrm HeadPrm t.Run("regular object", func(t *testing.T) { obj := testutil.GenerateObject() testutil.AddAttribute(obj, "foo", "bar") putPrm.SetObject(obj) _, err := sh.Put(context.Background(), putPrm) require.NoError(t, err) headPrm.SetAddress(object.AddressOf(obj)) res, err := sh.Head(context.Background(), headPrm) require.NoError(t, err) require.Equal(t, obj.CutPayload(), res.Object()) }) t.Run("virtual object", func(t *testing.T) { cnr := cidtest.ID() splitID := objectSDK.NewSplitID() parent := testutil.GenerateObjectWithCID(cnr) testutil.AddAttribute(parent, "foo", "bar") child := testutil.GenerateObjectWithCID(cnr) child.SetParent(parent) idParent, _ := parent.ID() child.SetParentID(idParent) child.SetSplitID(splitID) putPrm.SetObject(child) _, err := sh.Put(context.Background(), putPrm) require.NoError(t, err) headPrm.SetAddress(object.AddressOf(parent)) headPrm.SetRaw(true) var siErr *objectSDK.SplitInfoError _, err = sh.Head(context.Background(), headPrm) require.True(t, errors.As(err, &siErr)) headPrm.SetAddress(object.AddressOf(parent)) headPrm.SetRaw(false) head, err := sh.Head(context.Background(), headPrm) require.NoError(t, err) require.Equal(t, parent.CutPayload(), head.Object()) }) }