From 608e380e3680b15c345d038cfebf45e3c8446b9f Mon Sep 17 00:00:00 2001 From: jonaustin09 Date: Wed, 16 Oct 2024 12:05:41 -0400 Subject: [PATCH] fix: Fixes the double entry issue for single null versionId object version in ListObjectVersions --- backend/posix/posix.go | 5 +++ tests/integration/group-tests.go | 2 + tests/integration/tests.go | 65 ++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+) diff --git a/backend/posix/posix.go b/backend/posix/posix.go index 60bc408..4238942 100644 --- a/backend/posix/posix.go +++ b/backend/posix/posix.go @@ -952,6 +952,11 @@ func (p *Posix) fileToObjVersions(bucket string) backend.GetVersionsFunc { Truncated: true, NextVersionIdMarker: nullVersionId, }, nil + } else { + return &backend.ObjVersionFuncResult{ + ObjectVersions: objects, + DelMarkers: delMarkers, + }, nil } } diff --git a/tests/integration/group-tests.go b/tests/integration/group-tests.go index fadce83..abee486 100644 --- a/tests/integration/group-tests.go +++ b/tests/integration/group-tests.go @@ -578,6 +578,7 @@ func TestVersioning(s *S3Conf) { ListObjectVersions_multiple_object_versions_truncated(s) ListObjectVersions_with_delete_markers(s) ListObjectVersions_containing_null_versionId_obj(s) + ListObjectVersions_single_null_versionId_object(s) // Multipart upload Versioning_Multipart_Upload_success(s) Versioning_Multipart_Upload_overwrite_an_object(s) @@ -961,6 +962,7 @@ func GetIntTests() IntTests { "ListObjectVersions_multiple_object_versions_truncated": ListObjectVersions_multiple_object_versions_truncated, "ListObjectVersions_with_delete_markers": ListObjectVersions_with_delete_markers, "ListObjectVersions_containing_null_versionId_obj": ListObjectVersions_containing_null_versionId_obj, + "ListObjectVersions_single_null_versionId_object": ListObjectVersions_single_null_versionId_object, "Versioning_Multipart_Upload_success": Versioning_Multipart_Upload_success, "Versioning_Multipart_Upload_overwrite_an_object": Versioning_Multipart_Upload_overwrite_an_object, "Versioning_UploadPartCopy_non_existing_versionId": Versioning_UploadPartCopy_non_existing_versionId, diff --git a/tests/integration/tests.go b/tests/integration/tests.go index c52c2b5..86eeedf 100644 --- a/tests/integration/tests.go +++ b/tests/integration/tests.go @@ -12096,6 +12096,71 @@ func ListObjectVersions_containing_null_versionId_obj(s *S3Conf) error { }, withVersioning(types.BucketVersioningStatusEnabled)) } +func ListObjectVersions_single_null_versionId_object(s *S3Conf) error { + testName := "ListObjectVersions_single_null_versionId_object" + return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error { + obj, objLgth := "my-obj", int64(890) + out, err := putObjectWithData(objLgth, &s3.PutObjectInput{ + Bucket: &bucket, + Key: &obj, + }, s3client) + if err != nil { + return err + } + + err = putBucketVersioningStatus(s3client, bucket, types.BucketVersioningStatusEnabled) + if err != nil { + return err + } + + ctx, cancel := context.WithTimeout(context.Background(), shortTimeout) + res, err := s3client.DeleteObject(ctx, &s3.DeleteObjectInput{ + Bucket: &bucket, + Key: &obj, + }) + cancel() + if err != nil { + return err + } + + versions := []types.ObjectVersion{ + { + ETag: out.res.ETag, + Key: &obj, + StorageClass: types.ObjectVersionStorageClassStandard, + IsLatest: getBoolPtr(false), + Size: &objLgth, + VersionId: &nullVersionId, + }, + } + delMarkers := []types.DeleteMarkerEntry{ + { + IsLatest: getBoolPtr(true), + Key: &obj, + VersionId: res.VersionId, + }, + } + + ctx, cancel = context.WithTimeout(context.Background(), shortTimeout) + resp, err := s3client.ListObjectVersions(ctx, &s3.ListObjectVersionsInput{ + Bucket: &bucket, + }) + cancel() + if err != nil { + return err + } + + if !compareDelMarkers(resp.DeleteMarkers, delMarkers) { + return fmt.Errorf("expected the delete markers list to be %v, instaed got %v", delMarkers, resp.DeleteMarkers) + } + if !compareVersions(resp.Versions, versions) { + return fmt.Errorf("expected the object versions list to be %v, instead got %v", versions, resp.Versions) + } + + return nil + }) +} + func Versioning_Multipart_Upload_success(s *S3Conf) error { testName := "Versioning_Multipart_Upload_success" return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error {