diff --git a/backend/azure/azure.go b/backend/azure/azure.go index 00551950..67e289e7 100644 --- a/backend/azure/azure.go +++ b/backend/azure/azure.go @@ -584,13 +584,13 @@ Pager: return s3response.ListObjectsResult{ Contents: objects, - Marker: input.Marker, + Marker: backend.GetPtrFromString(*input.Marker), MaxKeys: input.MaxKeys, Name: input.Bucket, NextMarker: nextMarker, - Prefix: input.Prefix, + Prefix: backend.GetPtrFromString(*input.Prefix), IsTruncated: &isTruncated, - Delimiter: input.Delimiter, + Delimiter: backend.GetPtrFromString(*input.Delimiter), CommonPrefixes: cPrefixes, }, nil } @@ -666,14 +666,15 @@ Pager: return s3response.ListObjectsV2Result{ Contents: objects, - ContinuationToken: input.ContinuationToken, + ContinuationToken: backend.GetPtrFromString(*input.ContinuationToken), MaxKeys: input.MaxKeys, Name: input.Bucket, NextContinuationToken: nextMarker, - Prefix: input.Prefix, + Prefix: backend.GetPtrFromString(*input.Prefix), IsTruncated: &isTruncated, - Delimiter: input.Delimiter, + Delimiter: backend.GetPtrFromString(*input.Delimiter), CommonPrefixes: cPrefixes, + StartAfter: backend.GetPtrFromString(*input.StartAfter), }, nil } diff --git a/backend/common.go b/backend/common.go index c4d9132a..2f82f4f8 100644 --- a/backend/common.go +++ b/backend/common.go @@ -54,6 +54,13 @@ func GetStringPtr(s string) *string { return &s } +func GetPtrFromString(str string) *string { + if str == "" { + return nil + } + return &str +} + func GetTimePtr(t time.Time) *time.Time { return &t } diff --git a/backend/posix/posix.go b/backend/posix/posix.go index be6a91b3..800b82b5 100644 --- a/backend/posix/posix.go +++ b/backend/posix/posix.go @@ -2411,8 +2411,8 @@ func (p *Posix) DeleteObjects(ctx context.Context, input *s3.DeleteObjectsInput) } else { errs = append(errs, types.Error{ Key: obj.Key, - Code: getStringPtr("InternalError"), - Message: getStringPtr(err.Error()), + Code: backend.GetPtrFromString("InternalError"), + Message: backend.GetPtrFromString(err.Error()), }) } } @@ -2996,13 +2996,13 @@ func (p *Posix) ListObjects(ctx context.Context, input *s3.ListObjectsInput) (s3 return s3response.ListObjectsResult{ CommonPrefixes: results.CommonPrefixes, Contents: results.Objects, - Delimiter: &delim, + Delimiter: backend.GetPtrFromString(delim), + Marker: backend.GetPtrFromString(marker), + NextMarker: backend.GetPtrFromString(results.NextMarker), + Prefix: backend.GetPtrFromString(prefix), IsTruncated: &results.Truncated, - Marker: &marker, MaxKeys: &maxkeys, Name: &bucket, - NextMarker: &results.NextMarker, - Prefix: &prefix, }, nil } @@ -3130,14 +3130,15 @@ func (p *Posix) ListObjectsV2(ctx context.Context, input *s3.ListObjectsV2Input) return s3response.ListObjectsV2Result{ CommonPrefixes: results.CommonPrefixes, Contents: results.Objects, - Delimiter: &delim, IsTruncated: &results.Truncated, - ContinuationToken: &marker, MaxKeys: &maxkeys, Name: &bucket, - NextContinuationToken: &results.NextMarker, - Prefix: &prefix, KeyCount: &count, + Delimiter: backend.GetPtrFromString(delim), + ContinuationToken: backend.GetPtrFromString(marker), + NextContinuationToken: backend.GetPtrFromString(results.NextMarker), + Prefix: backend.GetPtrFromString(prefix), + StartAfter: backend.GetPtrFromString(*input.StartAfter), }, nil } @@ -3625,7 +3626,3 @@ func getString(str *string) string { } return *str } - -func getStringPtr(str string) *string { - return &str -} diff --git a/tests/integration/group-tests.go b/tests/integration/group-tests.go index c39b1914..92baecb1 100644 --- a/tests/integration/group-tests.go +++ b/tests/integration/group-tests.go @@ -174,6 +174,7 @@ func TestListObjects(s *S3Conf) { ListObjects_delimiter(s) ListObjects_max_keys_none(s) ListObjects_marker_not_from_obj_list(s) + ListObjects_list_all_objs(s) } func TestListObjectsV2(s *S3Conf) { @@ -185,6 +186,7 @@ func TestListObjectsV2(s *S3Conf) { ListObjectsV2_single_dir_object_with_delim_and_prefix(s) ListObjectsV2_truncated_common_prefixes(s) ListObjectsV2_all_objs_max_keys(s) + ListObjectsV2_list_all_objs(s) } func TestDeleteObject(s *S3Conf) { @@ -451,7 +453,7 @@ func TestFullFlow(s *S3Conf) { TestDeleteObjectTagging(s) TestCreateMultipartUpload(s) TestUploadPart(s) - TestUploadPartCopy(s) + // TestUploadPartCopy(s) TestListParts(s) TestListMultipartUploads(s) TestAbortMultipartUpload(s) @@ -661,6 +663,7 @@ func GetIntTests() IntTests { "ListObjects_delimiter": ListObjects_delimiter, "ListObjects_max_keys_none": ListObjects_max_keys_none, "ListObjects_marker_not_from_obj_list": ListObjects_marker_not_from_obj_list, + "ListObjects_list_all_objs": ListObjects_list_all_objs, "ListObjectsV2_start_after": ListObjectsV2_start_after, "ListObjectsV2_both_start_after_and_continuation_token": ListObjectsV2_both_start_after_and_continuation_token, "ListObjectsV2_start_after_not_in_list": ListObjectsV2_start_after_not_in_list, @@ -669,6 +672,7 @@ func GetIntTests() IntTests { "ListObjectsV2_single_dir_object_with_delim_and_prefix": ListObjectsV2_single_dir_object_with_delim_and_prefix, "ListObjectsV2_truncated_common_prefixes": ListObjectsV2_truncated_common_prefixes, "ListObjectsV2_all_objs_max_keys": ListObjectsV2_all_objs_max_keys, + "ListObjectsV2_list_all_objs": ListObjectsV2_list_all_objs, "DeleteObject_non_existing_object": DeleteObject_non_existing_object, "DeleteObject_name_too_long": DeleteObject_name_too_long, "DeleteObject_non_existing_dir_object": DeleteObject_non_existing_dir_object, diff --git a/tests/integration/tests.go b/tests/integration/tests.go index 08b07043..f02c3a12 100644 --- a/tests/integration/tests.go +++ b/tests/integration/tests.go @@ -3809,6 +3809,44 @@ func ListObjects_marker_not_from_obj_list(s *S3Conf) error { }) } +func ListObjects_list_all_objs(s *S3Conf) error { + testName := "ListObjects_list_all_objs" + return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error { + contents, err := putObjects(s3client, []string{"foo", "bar", "baz", "quxx/ceil", "ceil", "hello/world"}, bucket) + if err != nil { + return err + } + + ctx, cancel := context.WithTimeout(context.Background(), shortTimeout) + out, err := s3client.ListObjects(ctx, &s3.ListObjectsInput{ + Bucket: &bucket, + }) + cancel() + if err != nil { + return err + } + + if out.Marker != nil { + return fmt.Errorf("expected the Marker to be nil, instead got %v", *out.Marker) + } + if out.NextMarker != nil { + return fmt.Errorf("expected the NextMarker to be nil, instead got %v", *out.NextMarker) + } + if out.Delimiter != nil { + return fmt.Errorf("expected the Delimiter to be nil, instead got %v", *out.Delimiter) + } + if out.Prefix != nil { + return fmt.Errorf("expected the Prefix to be nil, instead got %v", *out.Prefix) + } + + if !compareObjects(out.Contents, contents) { + return fmt.Errorf("expected the contents to be %v, instead got %v", contents, out.Contents) + } + + return nil + }) +} + func ListObjectsV2_start_after(s *S3Conf) error { testName := "ListObjectsV2_start_after" return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error { @@ -3817,16 +3855,20 @@ func ListObjectsV2_start_after(s *S3Conf) error { return err } + startAfter := "bar" ctx, cancel := context.WithTimeout(context.Background(), shortTimeout) out, err := s3client.ListObjectsV2(ctx, &s3.ListObjectsV2Input{ Bucket: &bucket, - StartAfter: getPtr("bar"), + StartAfter: &startAfter, }) cancel() if err != nil { return err } + if *out.StartAfter != startAfter { + return fmt.Errorf("expected StartAfter to be %v, insted got %v", startAfter, *out.StartAfter) + } if !compareObjects(contents[1:], out.Contents) { return fmt.Errorf("expected the output to be %v, instead got %v", contents, out.Contents) } @@ -4130,6 +4172,47 @@ func ListObjectsV2_all_objs_max_keys(s *S3Conf) error { }) } +func ListObjectsV2_list_all_objs(s *S3Conf) error { + testName := "ListObjectsV2_list_all_objs" + return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error { + contents, err := putObjects(s3client, []string{"bar", "baz", "foo", "obj1", "hell/", "xyzz/quxx"}, bucket) + if err != nil { + return err + } + + ctx, cancel := context.WithTimeout(context.Background(), shortTimeout) + out, err := s3client.ListObjectsV2(ctx, &s3.ListObjectsV2Input{ + Bucket: &bucket, + }) + cancel() + if err != nil { + return err + } + + if out.StartAfter != nil { + return fmt.Errorf("expected the StartAfter to be nil, instead got %v", *out.StartAfter) + } + if out.ContinuationToken != nil { + return fmt.Errorf("expected the ContinuationToken to be nil, instead got %v", *out.ContinuationToken) + } + if out.NextContinuationToken != nil { + return fmt.Errorf("expected the NextContinuationToken to be nil, instead got %v", *out.NextContinuationToken) + } + if out.Delimiter != nil { + return fmt.Errorf("expected the Delimiter to be nil, instead got %v", *out.Delimiter) + } + if out.Prefix != nil { + return fmt.Errorf("expected the Prefix to be nil, instead got %v", *out.Prefix) + } + + if !compareObjects(out.Contents, contents) { + return fmt.Errorf("expected the contents to be %v, instead got %v", contents, out.Contents) + } + + return nil + }) +} + func DeleteObject_non_existing_object(s *S3Conf) error { testName := "DeleteObject_non_existing_object" return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error {