1package s3crypto 2 3import ( 4 "bytes" 5 "io/ioutil" 6 "net/http" 7 "os" 8 "testing" 9 10 "github.com/aws/aws-sdk-go/aws" 11 "github.com/aws/aws-sdk-go/aws/request" 12 "github.com/aws/aws-sdk-go/awstesting" 13 "github.com/aws/aws-sdk-go/internal/sdkio" 14) 15 16func TestBytesReadWriteSeeker_Read(t *testing.T) { 17 b := &bytesReadWriteSeeker{[]byte{1, 2, 3}, 0} 18 expected := []byte{1, 2, 3} 19 buf := make([]byte, 3) 20 n, err := b.Read(buf) 21 22 if err != nil { 23 t.Errorf("expected no error, but received %v", err) 24 } 25 26 if e, a := 3, n; e != a { 27 t.Errorf("expected %d, but received %d", e, a) 28 } 29 30 if !bytes.Equal(expected, buf) { 31 t.Error("expected equivalent byte slices, but received otherwise") 32 } 33} 34 35func TestBytesReadWriteSeeker_Write(t *testing.T) { 36 b := &bytesReadWriteSeeker{} 37 expected := []byte{1, 2, 3} 38 buf := make([]byte, 3) 39 n, err := b.Write([]byte{1, 2, 3}) 40 41 if err != nil { 42 t.Errorf("expected no error, but received %v", err) 43 } 44 45 if e, a := 3, n; e != a { 46 t.Errorf("expected %d, but received %d", e, a) 47 } 48 49 n, err = b.Read(buf) 50 if err != nil { 51 t.Errorf("expected no error, but received %v", err) 52 } 53 54 if e, a := 3, n; e != a { 55 t.Errorf("expected %d, but received %d", e, a) 56 } 57 58 if !bytes.Equal(expected, buf) { 59 t.Error("expected equivalent byte slices, but received otherwise") 60 } 61} 62 63func TestBytesReadWriteSeeker_Seek(t *testing.T) { 64 b := &bytesReadWriteSeeker{[]byte{1, 2, 3}, 0} 65 expected := []byte{2, 3} 66 m, err := b.Seek(1, sdkio.SeekStart) 67 68 if err != nil { 69 t.Errorf("expected no error, but received %v", err) 70 } 71 72 if e, a := 1, int(m); e != a { 73 t.Errorf("expected %d, but received %d", e, a) 74 } 75 76 buf := make([]byte, 3) 77 n, err := b.Read(buf) 78 79 if err != nil { 80 t.Errorf("expected no error, but received %v", err) 81 } 82 83 if e, a := 2, n; e != a { 84 t.Errorf("expected %d, but received %d", e, a) 85 } 86 87 if !bytes.Equal(expected, buf[:n]) { 88 t.Error("expected equivalent byte slices, but received otherwise") 89 } 90} 91 92func TestGetWriterStore_TempFile(t *testing.T) { 93 response := http.Response{StatusCode: 200} 94 s := awstesting.NewClient(aws.NewConfig().WithMaxRetries(10)) 95 s.Handlers.Validate.Clear() 96 s.Handlers.Send.Clear() // mock sending 97 s.Handlers.Send.PushBack(func(r *request.Request) { 98 r.HTTPResponse = &response 99 }) 100 type testData struct { 101 Data string 102 } 103 out := &testData{} 104 r := s.NewRequest(&request.Operation{Name: "Operation"}, nil, out) 105 f, err := getWriterStore(r, "", true) 106 if err != nil { 107 t.Fatalf("expected no error, but received %v", err) 108 } 109 tempFile, ok := f.(*os.File) 110 if !ok { 111 t.Fatal("io.ReadWriteSeeker expected to be *os.file") 112 } 113 err = r.Send() 114 if err != nil { 115 t.Errorf("expected no error, but received %v", err) 116 } 117 if _, err := os.Stat(tempFile.Name()); !os.IsNotExist(err) { 118 t.Errorf("expected temp file be deleted, but still exists %v", tempFile.Name()) 119 } 120} 121 122func TestGetWriterStore_TempFileWithRetry(t *testing.T) { 123 responses := []*http.Response{ 124 {StatusCode: 500, Header: http.Header{}, Body: ioutil.NopCloser(&bytes.Buffer{})}, 125 {StatusCode: 200, Header: http.Header{}, Body: ioutil.NopCloser(&bytes.Buffer{})}, 126 } 127 s := awstesting.NewClient(aws.NewConfig().WithMaxRetries(10)) 128 s.Handlers.Validate.Clear() 129 s.Handlers.Send.Clear() // mock sending 130 s.Handlers.Send.PushBack(func(r *request.Request) { 131 r.HTTPResponse = responses[0] 132 responses = responses[1:] 133 }) 134 type testData struct { 135 Data string 136 } 137 out := &testData{} 138 r := s.NewRequest(&request.Operation{Name: "Operation"}, nil, out) 139 f, err := getWriterStore(r, "", true) 140 if err != nil { 141 t.Fatalf("expected no error, but received %v", err) 142 } 143 tempFile, ok := f.(*os.File) 144 if !ok { 145 t.Fatal("io.ReadWriteSeeker expected to be *os.file") 146 } 147 err = r.Send() 148 if err != nil { 149 t.Errorf("expected no error, but received %v", err) 150 } 151 if _, err := os.Stat(tempFile.Name()); !os.IsNotExist(err) { 152 t.Errorf("expected temp file be deleted, but still exists %v", tempFile.Name()) 153 } 154 if v := len(responses); v != 0 { 155 t.Errorf("expect all retries to be used, have %v remaining", v) 156 } 157} 158 159func TestGetWriterStore_Memory(t *testing.T) { 160 response := http.Response{StatusCode: 200} 161 s := awstesting.NewClient(aws.NewConfig().WithMaxRetries(10)) 162 s.Handlers.Validate.Clear() 163 s.Handlers.Send.Clear() // mock sending 164 s.Handlers.Send.PushBack(func(r *request.Request) { 165 r.HTTPResponse = &response 166 }) 167 type testData struct { 168 Data string 169 } 170 out := &testData{} 171 r := s.NewRequest(&request.Operation{Name: "Operation"}, nil, out) 172 f, err := getWriterStore(r, "", false) 173 if err != nil { 174 t.Fatalf("expected no error, but received %v", err) 175 } 176 if _, ok := f.(*bytesReadWriteSeeker); !ok { 177 t.Fatal("io.ReadWriteSeeker expected to be *bytesReadWriteSeeker") 178 } 179 if err != nil { 180 t.Errorf("expected no error, but received %v", err) 181 } 182 err = r.Send() 183 if err != nil { 184 t.Errorf("expected no error, but received %v", err) 185 } 186} 187