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 })