github.com/geofffranks/garden-linux@v0.0.0-20160715111146-26c893169cfa/process_tracker/writer/fan_in_test.go (about)

     1  package writer_test
     2  
     3  import (
     4  	"code.cloudfoundry.org/garden-linux/process_tracker/writer"
     5  
     6  	"strings"
     7  
     8  	. "github.com/onsi/ginkgo"
     9  	. "github.com/onsi/gomega"
    10  )
    11  
    12  var _ = Describe("FanIn", func() {
    13  
    14  	var fanIn writer.FanIn
    15  	var fWriter *fakeWriter
    16  	var testBytes []byte
    17  
    18  	BeforeEach(func() {
    19  		fanIn = writer.NewFanIn()
    20  		fWriter = &fakeWriter{
    21  			nWriteReturn: 10,
    22  		}
    23  		testBytes = []byte{12}
    24  	})
    25  
    26  	It("writes data to a sink and leaves the sink open", func() {
    27  		fanIn.AddSink(fWriter)
    28  		n, err := fanIn.Write(testBytes)
    29  		Expect(err).ToNot(HaveOccurred())
    30  		Expect(n).To(Equal(10))
    31  		Expect(fWriter.writeCalls()).To(Equal(1))
    32  		Expect(fWriter.writeArgument()).To(Equal(testBytes))
    33  		Expect(fWriter.closeCalls()).To(Equal(0))
    34  
    35  		By("and more data can be written to the sink")
    36  		testBytes2 := []byte{1, 2}
    37  		n, err = fanIn.Write(testBytes2)
    38  		Expect(err).ToNot(HaveOccurred())
    39  		Expect(n).To(Equal(10))
    40  		Expect(fWriter.writeArgument()).To(Equal(testBytes2))
    41  		Expect(fWriter.closeCalls()).To(Equal(0))
    42  	})
    43  
    44  	It("blocks writes until a sink is added", func() {
    45  		nChan := make(chan int)
    46  		errChan := make(chan error)
    47  
    48  		go func() {
    49  			n, err := fanIn.Write(testBytes)
    50  			nChan <- n
    51  			errChan <- err
    52  		}()
    53  
    54  		fanIn.AddSink(fWriter)
    55  		n := <-nChan
    56  		err := <-errChan
    57  
    58  		Expect(err).ToNot(HaveOccurred())
    59  		Expect(n).To(Equal(10))
    60  	})
    61  
    62  	It("reads data from a source and writes to a sink", func() {
    63  		fanIn.AddSink(fWriter)
    64  		fanIn.AddSource(strings.NewReader("abcdefghij"))
    65  
    66  		Eventually(fWriter.writeCalls).Should(Equal(1))
    67  		Expect(fWriter.writeArgument()).To(Equal([]byte("abcdefghij")))
    68  	})
    69  
    70  	It("closes the sink after writing from a source", func() {
    71  		fanIn.AddSink(fWriter)
    72  		fanIn.AddSource(strings.NewReader("abcdefghij"))
    73  		Eventually(fWriter.closeCalls).Should(Equal(1))
    74  	})
    75  
    76  	It("it doesn't close a sink when writing from source fails", func() {
    77  		fanIn.AddSink(fWriter)
    78  		fanIn.AddSource(strings.NewReader("a string longer than writer return length"))
    79  		Eventually(fWriter.closeCalls).Should(Equal(0))
    80  	})
    81  
    82  	It("closes a sink", func() {
    83  		fanIn.AddSink(fWriter)
    84  		err := fanIn.Close()
    85  		Expect(err).ToNot(HaveOccurred())
    86  		Expect(fWriter.closeCalls()).To(Equal(1))
    87  	})
    88  
    89  	It("blocks close until a sink is added", func() {
    90  		errChan := make(chan error)
    91  
    92  		go func() {
    93  			err := fanIn.Close()
    94  			errChan <- err
    95  		}()
    96  
    97  		fanIn.AddSink(fWriter)
    98  		err := <-errChan
    99  
   100  		Expect(err).ToNot(HaveOccurred())
   101  		Expect(fWriter.closeCalls()).To(Equal(1))
   102  	})
   103  
   104  	It("returns an error if close is called twice", func() {
   105  		fanIn.AddSink(fWriter)
   106  
   107  		err := fanIn.Close()
   108  		Expect(err).ToNot(HaveOccurred())
   109  
   110  		err = fanIn.Close()
   111  		Expect(err).To(MatchError("already closed"))
   112  
   113  		Expect(fWriter.closeCalls()).To(Equal(1))
   114  	})
   115  
   116  	It("returns an error if write is called after close", func() {
   117  		fanIn.AddSink(fWriter)
   118  
   119  		err := fanIn.Close()
   120  		Expect(err).ToNot(HaveOccurred())
   121  
   122  		_, err = fanIn.Write(testBytes)
   123  		Expect(err).To(MatchError("write after close"))
   124  
   125  		Expect(fWriter.writeCalls()).To(Equal(0))
   126  	})
   127  })