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  }