-
Notifications
You must be signed in to change notification settings - Fork 0
/
multiwriter_test.go
150 lines (139 loc) · 3.42 KB
/
multiwriter_test.go
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
package multiwriter
import (
"bytes"
"errors"
"io"
"testing"
)
type brokenWriter struct{}
type halfBrokenWriter struct{}
func (bw *brokenWriter) Write(p []byte) (n int, err error) {
return 0, errors.New("This is supposed to break")
}
func (bw *halfBrokenWriter) Write(p []byte) (n int, err error) {
return 2, nil
}
func TestNew(t *testing.T) {
out := new(bytes.Buffer)
mw := New(out)
multi, ok := mw.(*MultiWriter)
if !ok {
t.Fatal("Could not convert writer to Multi Writer")
}
if len(multi.writers) != 1 {
t.Fatal("Not the same number of writers")
}
}
func TestWriter(t *testing.T) {
out := new(bytes.Buffer)
out2 := new(bytes.Buffer)
mw := New(out, out2)
msg := []byte("This is a test")
n, err := mw.Write(msg)
if err != nil {
t.Fatal(err)
}
if len(msg) != n {
t.Fatal("Did not write the ammount of bytes needed")
}
if string(msg) != out.String() || string(msg) != out2.String() {
t.Fatal("Did not write the correct message.")
}
}
func TestWriter_Broken(t *testing.T) {
out := new(bytes.Buffer)
out2 := new(brokenWriter)
mw := New(out, out2)
msg := []byte("This is a test")
n, err := mw.Write(msg)
if err == nil {
t.Fatal("I expect an error from a broken writer")
}
if n != 0 {
t.Fatal("The broken writer should not have written any bytes")
}
if err.Error() != "This is supposed to break" {
t.Fatal("Not the expected error from writer")
}
}
func TestWriter_HalfBroken(t *testing.T) {
out := new(bytes.Buffer)
out2 := new(halfBrokenWriter)
mw := New(out, out2)
msg := []byte("This is a test")
n, err := mw.Write(msg)
if err == nil {
t.Fatal("I expect an error from a half broken writer")
}
if n != 2 {
t.Fatal("The broken writer should have written only two bits")
}
if err.Error() != io.ErrShortWrite.Error() {
t.Fatal("Not the expected error from writer")
}
}
func TestLen(t *testing.T) {
out := new(bytes.Buffer)
out2 := new(bytes.Buffer)
mw := New(out, out2)
multi, ok := mw.(*MultiWriter)
if !ok {
t.Fatal("Could not convert writer to Multi Writer")
}
if multi.Len() != 2 || len(multi.writers) != multi.Len() {
t.Fatal("Not the same number of writers")
}
}
func TestAppend(t *testing.T) {
out := new(bytes.Buffer)
out2 := new(bytes.Buffer)
out3 := new(bytes.Buffer)
msg := []byte("This is a test")
mw := New(out, out2)
multi, ok := mw.(*MultiWriter)
if !ok {
t.Fatal("Could not convert writer to Multi Writer")
}
multi.Append(out3)
if multi.Len() != 3 {
t.Fatal("Not the expected number of writers")
}
n, err := mw.Write(msg)
if err != nil {
t.Fatal(err)
}
if len(msg) != n {
t.Fatal("Did not write the ammount of bytes needed")
}
if string(msg) != out.String() || string(msg) != out2.String() || string(msg) != out3.String() {
t.Fatal("Did not write the correct message.")
}
}
func TestRemove(t *testing.T) {
out := new(bytes.Buffer)
out2 := new(bytes.Buffer)
out3 := new(bytes.Buffer)
msg := []byte("This is a test")
mw := New(out, out2, out3)
multi, ok := mw.(*MultiWriter)
if !ok {
t.Fatal("Could not convert writer to Multi Writer")
}
multi.Remove(out2)
if multi.Len() != 2 {
t.Fatal("Not the expected number of writers")
}
n, err := mw.Write(msg)
if err != nil {
t.Fatal(err)
}
if len(msg) != n {
t.Fatal("Did not write the ammount of bytes needed")
}
if string(msg) != out.String() || string(msg) != out3.String() {
t.Fatal("Did not write the correct message.")
}
if out2.String() != "" {
t.Fatal("We still wrote to a removed writer")
}
}