// Copyright 2023 Versity Software // This file is licensed under the Apache License, Version 2.0 // (the "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package integration import ( "context" "fmt" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/aws-sdk-go-v2/service/s3/types" ) func DeleteObjects_empty_input(s *S3Conf) error { testName := "DeleteObjects_empty_input" return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error { contents, err := putObjects(s3client, []string{"foo", "bar", "baz"}, bucket) if err != nil { return err } ctx, cancel := context.WithTimeout(context.Background(), shortTimeout) out, err := s3client.DeleteObjects(ctx, &s3.DeleteObjectsInput{ Bucket: &bucket, Delete: &types.Delete{ Objects: []types.ObjectIdentifier{}, }, }) cancel() if err != nil { return err } if len(out.Deleted) != 0 { return fmt.Errorf("expected deleted object count 0, instead got %v", len(out.Deleted)) } if len(out.Errors) != 0 { return fmt.Errorf("expected 0 errors, instead got %v", len(out.Errors)) } ctx, cancel = context.WithTimeout(context.Background(), shortTimeout) res, err := s3client.ListObjects(ctx, &s3.ListObjectsInput{ Bucket: &bucket, }) cancel() if err != nil { return err } if !compareObjects(contents, res.Contents) { return fmt.Errorf("expected the output to be %v, instead got %v", contents, res.Contents) } return nil }) } func DeleteObjects_non_existing_objects(s *S3Conf) error { testName := "DeleteObjects_empty_input" return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error { delObjects := []types.ObjectIdentifier{{Key: getPtr("obj1")}, {Key: getPtr("obj2")}} ctx, cancel := context.WithTimeout(context.Background(), shortTimeout) out, err := s3client.DeleteObjects(ctx, &s3.DeleteObjectsInput{ Bucket: &bucket, Delete: &types.Delete{ Objects: delObjects, }, }) cancel() if err != nil { return err } if len(out.Deleted) != 2 { return fmt.Errorf("expected deleted object count 2, instead got %v", len(out.Deleted)) } if len(out.Errors) != 0 { return fmt.Errorf("expected 0 errors, instead got %v, %v", len(out.Errors), out.Errors) } return nil }) } func DeleteObjects_success(s *S3Conf) error { testName := "DeleteObjects_success" return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error { objects, objToDel := []string{"obj1", "obj2", "obj3"}, []string{"foo", "bar", "baz"} contents, err := putObjects(s3client, append(objToDel, objects...), bucket) if err != nil { return err } delObjects := []types.ObjectIdentifier{} delResult := []types.DeletedObject{} for _, key := range objToDel { k := key delObjects = append(delObjects, types.ObjectIdentifier{Key: &k}) delResult = append(delResult, types.DeletedObject{Key: &k}) } ctx, cancel := context.WithTimeout(context.Background(), shortTimeout) out, err := s3client.DeleteObjects(ctx, &s3.DeleteObjectsInput{ Bucket: &bucket, Delete: &types.Delete{ Objects: delObjects, }, }) cancel() if err != nil { return err } if len(out.Deleted) != 3 { return fmt.Errorf("expected deleted object count 3, instead got %v", len(out.Deleted)) } if len(out.Errors) != 0 { return fmt.Errorf("expected 2 errors, instead got %v", len(out.Errors)) } if !compareDelObjects(delResult, out.Deleted) { return fmt.Errorf("unexpected deleted output") } ctx, cancel = context.WithTimeout(context.Background(), shortTimeout) res, err := s3client.ListObjects(ctx, &s3.ListObjectsInput{ Bucket: &bucket, }) cancel() if err != nil { return err } if !compareObjects(contents[3:], res.Contents) { return fmt.Errorf("expected the output to be %v, instead got %v", contents[3:], res.Contents) } return nil }) }