@@ -65,6 +65,95 @@ func TestReader(t *testing.T) {
6565 }
6666}
6767
68+ type testCloser struct {
69+ io.Reader
70+ closed int
71+ onClose error
72+ }
73+
74+ func (t * testCloser ) Close () error {
75+ t .closed ++
76+ return t .onClose
77+ }
78+
79+ func TestReadCloser (t * testing.T ) {
80+ buf := bytes .NewBufferString ("Testbuffer" )
81+ cl := & testCloser {Reader : buf }
82+ ar , err := readahead .NewReadCloserSize (cl , 4 , 10000 )
83+ if err != nil {
84+ t .Fatal ("error when creating:" , err )
85+ }
86+
87+ var dst = make ([]byte , 100 )
88+ n , err := ar .Read (dst )
89+ if err != nil {
90+ t .Fatal ("error when reading:" , err )
91+ }
92+ if n != 10 {
93+ t .Fatal ("unexpected length, expected 10, got " , n )
94+ }
95+
96+ n , err = ar .Read (dst )
97+ if err != io .EOF {
98+ t .Fatal ("expected io.EOF, got" , err )
99+ }
100+ if n != 0 {
101+ t .Fatal ("unexpected length, expected 0, got " , n )
102+ }
103+
104+ // Test read after error
105+ n , err = ar .Read (dst )
106+ if err != io .EOF {
107+ t .Fatal ("expected io.EOF, got" , err )
108+ }
109+ if n != 0 {
110+ t .Fatal ("unexpected length, expected 0, got " , n )
111+ }
112+
113+ err = ar .Close ()
114+ if err != nil {
115+ t .Fatal ("error when closing:" , err )
116+ }
117+ if cl .closed != 1 {
118+ t .Fatal ("want close count 1, got:" , cl .closed )
119+ }
120+ // Test Close without reading everything
121+ buf = bytes .NewBuffer (make ([]byte , 50000 ))
122+ cl = & testCloser {Reader : buf }
123+ ar = readahead .NewReadCloser (cl )
124+ err = ar .Close ()
125+ if err != nil {
126+ t .Fatal ("error when closing:" , err )
127+ }
128+ if cl .closed != 1 {
129+ t .Fatal ("want close count 1, got:" , cl .closed )
130+ }
131+ // Test error forwarding
132+ cl = & testCloser {Reader : buf , onClose : errors .New ("an error" )}
133+ ar = readahead .NewReadCloser (cl )
134+ err = ar .Close ()
135+ if err != cl .onClose {
136+ t .Fatal ("want error when closing, got" , err )
137+ }
138+ if cl .closed != 1 {
139+ t .Fatal ("want close count 1, got:" , cl .closed )
140+ }
141+ // Test multiple closes
142+ cl = & testCloser {Reader : buf }
143+ ar = readahead .NewReadCloser (cl )
144+ err = ar .Close ()
145+ if err != nil {
146+ t .Fatal ("error when closing:" , err )
147+ }
148+ err = ar .Close ()
149+ if err != nil {
150+ t .Fatal ("error when closing:" , err )
151+ }
152+ if cl .closed != 1 {
153+ t .Fatal ("want close count 1, got:" , cl .closed )
154+ }
155+ }
156+
68157func TestWriteTo (t * testing.T ) {
69158 buf := bytes .NewBufferString ("Testbuffer" )
70159 ar , err := readahead .NewReaderSize (buf , 4 , 10000 )
0 commit comments