aboutsummaryrefslogtreecommitdiffstats
path: root/oae2_test.go
blob: 96b83af6abc2ac261306db1b35c6f613bdb38527 (plain) (blame)
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)
		}
	})
}