github.com/aavshr/aws-sdk-go@v1.41.3/service/s3/s3manager/batch_1_7_test.go (about) 1 //go:build go1.7 2 // +build go1.7 3 4 package s3manager 5 6 import ( 7 "context" 8 "fmt" 9 "net/http" 10 "net/http/httptest" 11 "testing" 12 13 "github.com/aavshr/aws-sdk-go/aws" 14 "github.com/aavshr/aws-sdk-go/aws/awserr" 15 "github.com/aavshr/aws-sdk-go/aws/request" 16 "github.com/aavshr/aws-sdk-go/service/s3" 17 ) 18 19 // #1790 bug 20 func TestBatchDeleteContext(t *testing.T) { 21 cases := []struct { 22 objects []BatchDeleteObject 23 batchSize int 24 expected int 25 earlyCancel bool 26 checkError func(error) error 27 }{ 28 0: { 29 objects: []BatchDeleteObject{ 30 { 31 Object: &s3.DeleteObjectInput{ 32 Key: aws.String("1"), 33 Bucket: aws.String("bucket1"), 34 }, 35 }, 36 { 37 Object: &s3.DeleteObjectInput{ 38 Key: aws.String("2"), 39 Bucket: aws.String("bucket2"), 40 }, 41 }, 42 { 43 Object: &s3.DeleteObjectInput{ 44 Key: aws.String("3"), 45 Bucket: aws.String("bucket3"), 46 }, 47 }, 48 { 49 Object: &s3.DeleteObjectInput{ 50 Key: aws.String("4"), 51 Bucket: aws.String("bucket4"), 52 }, 53 }, 54 }, 55 batchSize: 1, 56 expected: 0, 57 earlyCancel: true, 58 checkError: func(err error) error { 59 batchErr, ok := err.(*BatchError) 60 if !ok { 61 return fmt.Errorf("expect BatchError, got %T, %v", err, err) 62 } 63 64 errs := batchErr.Errors 65 if len(errs) != 4 { 66 return fmt.Errorf("expected 1 batch errors, but received %d", 67 len(errs)) 68 } 69 70 for _, tempErr := range errs { 71 aerr, ok := tempErr.OrigErr.(awserr.Error) 72 if !ok { 73 return fmt.Errorf("expect awserr.Error, got %T, %v", 74 tempErr.OrigErr, tempErr.OrigErr) 75 } 76 77 if e, a := request.CanceledErrorCode, aerr.Code(); e != a { 78 return fmt.Errorf("expect %q, error code, got %q", e, a) 79 } 80 } 81 return nil 82 }, 83 }, 84 1: { 85 objects: []BatchDeleteObject{ 86 { 87 Object: &s3.DeleteObjectInput{ 88 Key: aws.String("1"), 89 Bucket: aws.String("bucket1"), 90 }, 91 }, 92 { 93 Object: &s3.DeleteObjectInput{ 94 Key: aws.String("2"), 95 Bucket: aws.String("bucket2"), 96 }, 97 }, 98 { 99 Object: &s3.DeleteObjectInput{ 100 Key: aws.String("3"), 101 Bucket: aws.String("bucket3"), 102 }, 103 }, 104 { 105 Object: &s3.DeleteObjectInput{ 106 Key: aws.String("4"), 107 Bucket: aws.String("bucket4"), 108 }, 109 }, 110 }, 111 batchSize: 1, 112 expected: 4, 113 checkError: func(err error) error { 114 if err != nil { 115 return fmt.Errorf("Expect no error, got %v", err) 116 } 117 return nil 118 }, 119 }, 120 } 121 122 count := 0 123 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 124 w.WriteHeader(http.StatusNoContent) 125 count++ 126 })) 127 defer server.Close() 128 129 svc := &mockS3Client{S3: buildS3SvcClient(server.URL)} 130 for i, c := range cases { 131 ctx, cancel := context.WithCancel(context.Background()) 132 defer cancel() 133 if c.earlyCancel { 134 cancel() 135 } 136 137 batcher := BatchDelete{ 138 Client: svc, 139 BatchSize: c.batchSize, 140 } 141 142 err := batcher.Delete(ctx, &DeleteObjectsIterator{Objects: c.objects}) 143 if terr := c.checkError(err); terr != nil { 144 t.Fatalf("%d, %s", i, terr) 145 } 146 147 if count != c.expected { 148 t.Errorf("Case %d: expected %d, but received %d", i, c.expected, count) 149 } 150 151 count = 0 152 } 153 }