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