gopkg.in/hashicorp/nomad.v0@v0.11.8/lib/circbufwriter/writer_test.go (about)

     1  package circbufwriter
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"testing"
     8  
     9  	"github.com/hashicorp/nomad/testutil"
    10  	"github.com/stretchr/testify/require"
    11  )
    12  
    13  func TestWriter_NonBlockingWrite(t *testing.T) {
    14  	require := require.New(t)
    15  	var buf bytes.Buffer
    16  	w := New(&buf, 64)
    17  	n, err := w.Write([]byte("test"))
    18  	require.Equal(4, n)
    19  	require.NoError(err)
    20  
    21  	n, err = w.Write([]byte("test"))
    22  	require.Equal(4, n)
    23  	require.NoError(err)
    24  
    25  	testutil.WaitForResult(func() (bool, error) {
    26  		return "testtest" == buf.String(), fmt.Errorf("expected both writes")
    27  	}, func(err error) {
    28  		require.NoError(err)
    29  	})
    30  }
    31  
    32  type blockingWriter struct {
    33  	buf     bytes.Buffer
    34  	unblock <-chan struct{}
    35  }
    36  
    37  func (b *blockingWriter) Write(p []byte) (nn int, err error) {
    38  	<-b.unblock
    39  	return b.buf.Write(p)
    40  }
    41  
    42  func TestWriter_BlockingWrite(t *testing.T) {
    43  	require := require.New(t)
    44  	blockCh := make(chan struct{})
    45  	bw := &blockingWriter{unblock: blockCh}
    46  	w := New(bw, 64)
    47  
    48  	n, err := w.Write([]byte("test"))
    49  	require.Equal(4, n)
    50  	require.NoError(err)
    51  	require.Empty(bw.buf.Bytes())
    52  
    53  	n, err = w.Write([]byte("test"))
    54  	require.Equal(4, n)
    55  	require.NoError(err)
    56  	require.Empty(bw.buf.Bytes())
    57  	close(blockCh)
    58  
    59  	testutil.WaitForResult(func() (bool, error) {
    60  		return "testtest" == bw.buf.String(), fmt.Errorf("expected both writes")
    61  	}, func(err error) {
    62  		require.NoError(err)
    63  	})
    64  }
    65  
    66  func TestWriter_CloseClose(t *testing.T) {
    67  	require := require.New(t)
    68  	w := New(ioutil.Discard, 64)
    69  	require.NoError(w.Close())
    70  	require.NoError(w.Close())
    71  }