github.com/karrick/gorill@v1.10.3/timedWriteCloser_test.go (about)

     1  package gorill
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"testing"
     7  	"time"
     8  )
     9  
    10  var timedWriterBuf []byte
    11  
    12  func init() {
    13  	timedWriterBuf = make([]byte, 1024)
    14  	for i := range timedWriterBuf {
    15  		timedWriterBuf[i] = '.'
    16  	}
    17  }
    18  
    19  func TestTimedWriteCloserBeforeTimeout(t *testing.T) {
    20  	timeout := time.Second
    21  	bb := new(bytes.Buffer)
    22  
    23  	tw := NewTimedWriteCloser(NopCloseWriter(SlowWriter(bb, timeout/10)), timeout)
    24  	defer tw.Close()
    25  
    26  	n, err := tw.Write(timedWriterBuf)
    27  	if want := len(timedWriterBuf); n != want {
    28  		t.Errorf("Actual: %#v; Expected: %#v", n, want)
    29  	}
    30  	if err != nil {
    31  		t.Errorf("Actual: %#v; Expected: %#v", err, nil)
    32  	}
    33  	if want := string(timedWriterBuf); want != bb.String() {
    34  		t.Errorf("Actual: %#v; Expected: %#v", bb.String(), want)
    35  	}
    36  }
    37  
    38  func TestTimedWriteCloserAfterTimeout(t *testing.T) {
    39  	timeout := time.Millisecond
    40  	bb := new(bytes.Buffer)
    41  
    42  	tw := NewTimedWriteCloser(NopCloseWriter(SlowWriter(bb, 10*timeout)), timeout)
    43  	defer tw.Close()
    44  
    45  	n, err := tw.Write(timedWriterBuf)
    46  	if want := 0; n != want {
    47  		t.Errorf("Actual: %#v; Expected: %#v", n, want)
    48  	}
    49  	if _, ok := err.(ErrTimeout); err == nil || !ok {
    50  		t.Errorf("Actual: %#v; Expected: %s", err, ErrTimeout(timeout))
    51  	}
    52  	// NOTE: cannot check for contents of buffer, because write independently completes.
    53  }
    54  
    55  func TestTimedWriteCloserWriteAfterCloseReturnsError(t *testing.T) {
    56  	tw := NewTimedWriteCloser(NopCloseWriter(new(bytes.Buffer)), time.Millisecond)
    57  
    58  	tw.Close()
    59  
    60  	n, err := tw.Write([]byte(alphabet))
    61  	if want := 0; n != want {
    62  		t.Errorf("Actual: %#v; Expected: %#v", n, want)
    63  	}
    64  	if _, ok := err.(ErrWriteAfterClose); err == nil || !ok {
    65  		t.Errorf("Actual: %s; Expected: %#v", err, ErrWriteAfterClose{})
    66  	}
    67  }
    68  
    69  func BenchmarkWriterTimedWriteCloser(b *testing.B) {
    70  	consumers := make([]io.WriteCloser, consumerCount)
    71  	for i := 0; i < len(consumers); i++ {
    72  		consumers[i] = NewTimedWriteCloser(NewNopCloseBuffer(), time.Minute)
    73  	}
    74  	benchmarkWriter(b, b.N, consumers)
    75  }