github.com/BlockABC/godash@v0.0.0-20191112120524-f4aa3a32c566/wire/fixedIO_test.go (about) 1 // Copyright (c) 2013-2015 The btcsuite developers 2 // Copyright (c) 2016 The Dash developers 3 // Use of this source code is governed by an ISC 4 // license that can be found in the LICENSE file. 5 6 package wire_test 7 8 import ( 9 "bytes" 10 "io" 11 ) 12 13 // fixedWriter implements the io.Writer interface and intentially allows 14 // testing of error paths by forcing short writes. 15 type fixedWriter struct { 16 b []byte 17 pos int 18 } 19 20 // Write writes the contents of p to w. When the contents of p would cause 21 // the writer to exceed the maximum allowed size of the fixed writer, 22 // io.ErrShortWrite is returned and the writer is left unchanged. 23 // 24 // This satisfies the io.Writer interface. 25 func (w *fixedWriter) Write(p []byte) (n int, err error) { 26 lenp := len(p) 27 if w.pos+lenp > cap(w.b) { 28 return 0, io.ErrShortWrite 29 } 30 n = lenp 31 w.pos += copy(w.b[w.pos:], p) 32 return 33 } 34 35 // Bytes returns the bytes already written to the fixed writer. 36 func (w *fixedWriter) Bytes() []byte { 37 return w.b 38 } 39 40 // newFixedWriter returns a new io.Writer that will error once more bytes than 41 // the specified max have been written. 42 func newFixedWriter(max int) io.Writer { 43 b := make([]byte, max, max) 44 fw := fixedWriter{b, 0} 45 return &fw 46 } 47 48 // fixedReader implements the io.Reader interface and intentially allows 49 // testing of error paths by forcing short reads. 50 type fixedReader struct { 51 buf []byte 52 pos int 53 iobuf *bytes.Buffer 54 } 55 56 // Read reads the next len(p) bytes from the fixed reader. When the number of 57 // bytes read would exceed the maximum number of allowed bytes to be read from 58 // the fixed writer, an error is returned. 59 // 60 // This satisfies the io.Reader interface. 61 func (fr *fixedReader) Read(p []byte) (n int, err error) { 62 n, err = fr.iobuf.Read(p) 63 fr.pos += n 64 return 65 } 66 67 // newFixedReader returns a new io.Reader that will error once more bytes than 68 // the specified max have been read. 69 func newFixedReader(max int, buf []byte) io.Reader { 70 b := make([]byte, max, max) 71 if buf != nil { 72 copy(b[:], buf) 73 } 74 75 iobuf := bytes.NewBuffer(b) 76 fr := fixedReader{b, 0, iobuf} 77 return &fr 78 }