1package s3crypto
2
3import (
4	"bytes"
5	"encoding/hex"
6	"fmt"
7	"io"
8	"io/ioutil"
9	"strings"
10	"testing"
11)
12
13// From Go stdlib encoding/sha256 test cases
14func TestSHA256(t *testing.T) {
15	sha := newSHA256Writer(nil)
16	expected, _ := hex.DecodeString("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")
17	b := sha.GetValue()
18
19	if !bytes.Equal(expected, b) {
20		t.Errorf("expected equivalent sha values, but received otherwise")
21	}
22}
23
24func TestSHA256_Case2(t *testing.T) {
25	sha := newSHA256Writer(bytes.NewBuffer([]byte{}))
26	sha.Write([]byte("hello"))
27	expected, _ := hex.DecodeString("2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824")
28	b := sha.GetValue()
29
30	if !bytes.Equal(expected, b) {
31		t.Errorf("expected equivalent sha values, but received otherwise")
32	}
33}
34
35type mockReader struct {
36	err error
37}
38
39func (m mockReader) Read(p []byte) (int, error) {
40	return len(p), m.err
41}
42
43func TestContentLengthReader(t *testing.T) {
44	cases := []struct {
45		reader      io.Reader
46		expected    int64
47		expectedErr string
48	}{
49		{
50			reader:   bytes.NewReader([]byte("foo bar baz")),
51			expected: 11,
52		},
53		{
54			reader:   bytes.NewReader(nil),
55			expected: 0,
56		},
57		{
58			reader:      mockReader{err: fmt.Errorf("not an EOF error")},
59			expectedErr: "not an EOF error",
60		},
61	}
62
63	for _, tt := range cases {
64		reader := newContentLengthReader(tt.reader)
65		_, err := ioutil.ReadAll(reader)
66		if err != nil {
67			if len(tt.expectedErr) == 0 {
68				t.Errorf("expected no error, got %v", err)
69			} else if !strings.Contains(err.Error(), tt.expectedErr) {
70				t.Errorf("expected error %v, got %v", tt.expectedErr, err.Error())
71			}
72			continue
73		} else if len(tt.expectedErr) > 0 {
74			t.Error("expected error, got none")
75			continue
76		}
77		actual := reader.GetContentLength()
78		if tt.expected != actual {
79			t.Errorf("expected %v, got %v", tt.expected, actual)
80		}
81	}
82}
83