forked from wal-g/wal-g
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmock_s3_uploader.go
71 lines (59 loc) · 1.62 KB
/
mock_s3_uploader.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package testtools
import (
"bytes"
"io"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
"github.com/aws/aws-sdk-go/service/s3/s3manager/s3manageriface"
"github.com/wal-g/wal-g/pkg/storages/memory"
)
type mockMultiFailureError struct {
s3manager.MultiUploadFailure
err awserr.Error
}
func (err mockMultiFailureError) UploadID() string {
return "mock ID"
}
func (err mockMultiFailureError) Error() string {
return err.err.Error()
}
// Mock out uploader client for S3. Includes these methods:
// Upload(*UploadInput, ...func(*s3manager.Uploader))
type MockS3Uploader struct {
s3manageriface.UploaderAPI
multiErr bool
err bool
storage *memory.Storage
}
func NewMockS3Uploader(multiErr, err bool, storage *memory.Storage) *MockS3Uploader {
return &MockS3Uploader{multiErr: multiErr, err: err, storage: storage}
}
func (uploader *MockS3Uploader) Upload(input *s3manager.UploadInput,
f ...func(*s3manager.Uploader)) (*s3manager.UploadOutput, error) {
if uploader.err {
return nil, awserr.New("UploadFailed", "mock Upload error", nil)
}
if uploader.multiErr {
e := mockMultiFailureError{
err: awserr.New("UploadFailed", "multiupload failure error", nil),
}
return nil, e
}
output := &s3manager.UploadOutput{
Location: *input.Bucket,
VersionID: input.Key,
}
var err error
if uploader.storage == nil {
// Discard bytes to unblock pipe.
_, err = io.Copy(io.Discard, input.Body)
} else {
var buf bytes.Buffer
_, err = io.Copy(&buf, input.Body)
uploader.storage.Store(*input.Bucket+*input.Key, buf)
}
if err != nil {
return nil, err
}
return output, nil
}