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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
package oae2
import (
"bytes"
"io"
"strings"
"testing"
)
func TestRoundTrip(t *testing.T) {
t.Parallel()
const (
msg = "Hello World!"
key = "password123"
blockSize = 1
)
buf := new(bytes.Buffer)
w := NewWriter(buf, []byte(key), blockSize)
if _, err := io.WriteString(w, msg); err != nil {
t.Fatalf("Writer.Write failed: %s", err)
}
if err := w.Close(); err != nil {
t.Fatalf("Writer.Close failed: %s", err)
}
got, err := io.ReadAll(NewReader(buf, []byte(key), blockSize))
if err != nil {
t.Fatalf("Reader.Read failed: %s", err)
}
if string(got) != msg {
t.Errorf("Message failed to round-trip, got %q, want %q", got, msg)
}
}
func TestReadFromWriteTo(t *testing.T) {
t.Parallel()
const (
msg = "Hello World!"
key = "asdf"
blockSize = 2
)
buf := new(bytes.Buffer)
w := NewWriter(buf, []byte(key), blockSize)
if _, err := io.Copy(w, struct{ io.Reader }{strings.NewReader(msg)}); err != nil {
t.Fatalf("Writer.WriteTo failed: %s", err)
}
if err := w.Close(); err != nil {
t.Fatalf("Writer.Close failed: %s", err)
}
got := new(strings.Builder)
if _, err := io.Copy(got, NewReader(buf, []byte(key), blockSize)); err != nil {
t.Fatalf("Reader.Read failed: %s", err)
}
if got.String() != msg {
t.Errorf("Message failed to round-trip, got %q, want %q", got, msg)
}
}
func FuzzRoundTrip(f *testing.F) {
f.Add(1, []byte("Hello World!"))
f.Fuzz(func(t *testing.T, segmentSize int, msg []byte) {
const password = "asdf"
if segmentSize <= 0 {
return
}
buf := new(bytes.Buffer)
w := NewWriter(buf, []byte(password), segmentSize)
n, err := w.Write(msg)
if err != nil {
t.Fatalf("Writer.Write(%q) failed: %s", msg, err)
}
if n != len(msg) {
t.Errorf("Writer.Write(%q) = %d, want %d", msg, n, len(msg))
}
if err := w.Close(); err != nil {
t.Fatalf("Writer.Close failed: %s", err)
}
got, err := io.ReadAll(NewReader(buf, []byte(password), segmentSize))
if err != nil {
t.Fatalf("Reader.Read failed: %s", err)
}
if !bytes.Equal(got, msg) {
t.Errorf("Message failed to round-trip, got %q, want %q", got, msg)
}
})
}
func FuzzReadFromWriteTo(f *testing.F) {
f.Add(1, "Hello World!")
f.Fuzz(func(t *testing.T, segmentSize int, msg string) {
const password = "asdf"
if segmentSize <= 0 {
return
}
buf := new(bytes.Buffer)
w := NewWriter(buf, []byte(password), segmentSize)
n, err := w.ReadFrom(strings.NewReader(msg))
if err != nil {
t.Fatalf("Writer.ReadFrom(%q) failed: %s", msg, err)
}
if n != int64(len(msg)) {
t.Errorf("Writer.Write(%q) = %d, want %d", msg, n, len(msg))
}
if err := w.Close(); err != nil {
t.Fatalf("Writer.Close failed: %s", err)
}
got := new(strings.Builder)
n, err = NewReader(buf, []byte(password), segmentSize).WriteTo(got)
if err != nil {
t.Fatalf("Reader.WriteTo failed: %s", err)
}
if n != int64(len(msg)) {
t.Errorf("Reader.WriteTo returned %d bytes, want %d", n, len(msg))
}
if got.String() != msg {
t.Errorf("Message failed to round-trip, got %q, want %q", got, msg)
}
})
}
|