Skip to content

Commit

Permalink
Merge pull request #22 from felixhao/reduce-writev-call
Browse files Browse the repository at this point in the history
fixed: change judgement from bufs len to cursor
  • Loading branch information
felixhao authored Jul 9, 2018
2 parents 0734fb5 + a5c0812 commit 3bf0ef7
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 14 deletions.
2 changes: 1 addition & 1 deletion lib/bufio/io.go
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ func (w *Writer) Write(p []byte) (err error) {
return nil
}

if len(w.bufs) == maxBuffered {
if w.cursor+1 == maxBuffered {
w.Flush()
}
w.bufs[w.cursor] = p
Expand Down
80 changes: 67 additions & 13 deletions lib/bufio/io_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@ package bufio
import (
"bytes"
"io"
"net"
libnet "overlord/lib/net"
"testing"
"time"

"github.com/stretchr/testify/assert"
)
Expand Down Expand Up @@ -78,19 +81,70 @@ func TestReaderResetBuffer(t *testing.T) {
assert.Equal(t, io.EOF, err)
}

// func TestWriterWriteOk(t *testing.T) {
// data := "Bilibili 干杯 - ( ゜- ゜)つロ"
// buf := bytes.NewBuffer([]byte{})
// w := NewWriter(buf)
// err := w.Write([]byte(data))
// assert.NoError(t, err)
type mockAddr string

// err = w.Write([]byte(data))
// assert.NoError(t, err)
func (m mockAddr) Network() string {
return "tcp"
}
func (m mockAddr) String() string {
return string(m)
}

type mockConn struct {
rbuf *bytes.Buffer
wbuf *bytes.Buffer
addr mockAddr
}

func (m *mockConn) Read(b []byte) (n int, err error) {
return m.rbuf.Read(b)
}
func (m *mockConn) Write(b []byte) (n int, err error) {
return m.wbuf.Write(b)
}

// writeBuffers impl the net.buffersWriter to support writev
func (m *mockConn) writeBuffers(buf *net.Buffers) (int64, error) {
return buf.WriteTo(m.wbuf)
}

// err = w.WriteString(data)
// assert.NoError(t, err)
func (m *mockConn) Close() error { return nil }
func (m *mockConn) LocalAddr() net.Addr { return m.addr }
func (m *mockConn) RemoteAddr() net.Addr { return m.addr }

func (m *mockConn) SetDeadline(t time.Time) error { return nil }
func (m *mockConn) SetReadDeadline(t time.Time) error { return nil }
func (m *mockConn) SetWriteDeadline(t time.Time) error { return nil }

// _createConn is useful tools for handler test
func _createConn(data []byte) *libnet.Conn {
return _createRepeatConn(data, 1)
}

// err = w.Flush()
// assert.NoError(t, err)
// }
func _createRepeatConn(data []byte, r int) *libnet.Conn {
mconn := &mockConn{
addr: "127.0.0.1:12345",
rbuf: bytes.NewBuffer(bytes.Repeat(data, r)),
wbuf: new(bytes.Buffer),
}
conn := libnet.NewConn(mconn, time.Second, time.Second)
return conn
}

func TestWriterWriteOk(t *testing.T) {
data := "Bilibili 干杯 - ( ゜- ゜)つロ"

conn := _createConn(nil)
w := NewWriter(conn)
err := w.Write([]byte(data))
assert.NoError(t, err)

err = w.Write([]byte(data))
assert.NoError(t, err)

err = w.WriteString(data)
assert.NoError(t, err)

err = w.Flush()
assert.NoError(t, err)
}

0 comments on commit 3bf0ef7

Please sign in to comment.