| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- package gbytes_test
- import (
- "io"
- "time"
- . "github.com/onsi/gomega/gbytes"
- . "github.com/onsi/ginkgo"
- . "github.com/onsi/gomega"
- )
- var _ = Describe("Buffer", func() {
- var buffer *Buffer
- BeforeEach(func() {
- buffer = NewBuffer()
- })
- Describe("dumping the entire contents of the buffer", func() {
- It("should return everything that's been written", func() {
- buffer.Write([]byte("abc"))
- buffer.Write([]byte("def"))
- Ω(buffer.Contents()).Should(Equal([]byte("abcdef")))
- Ω(buffer).Should(Say("bcd"))
- Ω(buffer.Contents()).Should(Equal([]byte("abcdef")))
- })
- })
- Describe("creating a buffer with bytes", func() {
- It("should create the buffer with the cursor set to the beginning", func() {
- buffer := BufferWithBytes([]byte("abcdef"))
- Ω(buffer.Contents()).Should(Equal([]byte("abcdef")))
- Ω(buffer).Should(Say("abc"))
- Ω(buffer).ShouldNot(Say("abc"))
- Ω(buffer).Should(Say("def"))
- })
- })
- Describe("reading from a buffer", func() {
- It("should read the current contents of the buffer", func() {
- buffer := BufferWithBytes([]byte("abcde"))
- dest := make([]byte, 3)
- n, err := buffer.Read(dest)
- Ω(err).ShouldNot(HaveOccurred())
- Ω(n).Should(Equal(3))
- Ω(string(dest)).Should(Equal("abc"))
- dest = make([]byte, 3)
- n, err = buffer.Read(dest)
- Ω(err).ShouldNot(HaveOccurred())
- Ω(n).Should(Equal(2))
- Ω(string(dest[:n])).Should(Equal("de"))
- n, err = buffer.Read(dest)
- Ω(err).Should(Equal(io.EOF))
- Ω(n).Should(Equal(0))
- })
- Context("after the buffer has been closed", func() {
- It("returns an error", func() {
- buffer := BufferWithBytes([]byte("abcde"))
- buffer.Close()
- dest := make([]byte, 3)
- n, err := buffer.Read(dest)
- Ω(err).Should(HaveOccurred())
- Ω(n).Should(Equal(0))
- })
- })
- })
- Describe("detecting regular expressions", func() {
- It("should fire the appropriate channel when the passed in pattern matches, then close it", func(done Done) {
- go func() {
- time.Sleep(10 * time.Millisecond)
- buffer.Write([]byte("abcde"))
- }()
- A := buffer.Detect("%s", "a.c")
- B := buffer.Detect("def")
- var gotIt bool
- select {
- case gotIt = <-A:
- case <-B:
- Fail("should not have gotten here")
- }
- Ω(gotIt).Should(BeTrue())
- Eventually(A).Should(BeClosed())
- buffer.Write([]byte("f"))
- Eventually(B).Should(Receive())
- Eventually(B).Should(BeClosed())
- close(done)
- })
- It("should fast-forward the buffer upon detection", func(done Done) {
- buffer.Write([]byte("abcde"))
- <-buffer.Detect("abc")
- Ω(buffer).ShouldNot(Say("abc"))
- Ω(buffer).Should(Say("de"))
- close(done)
- })
- It("should only fast-forward the buffer when the channel is read, and only if doing so would not rewind it", func(done Done) {
- buffer.Write([]byte("abcde"))
- A := buffer.Detect("abc")
- time.Sleep(20 * time.Millisecond) //give the goroutine a chance to detect and write to the channel
- Ω(buffer).Should(Say("abcd"))
- <-A
- Ω(buffer).ShouldNot(Say("d"))
- Ω(buffer).Should(Say("e"))
- Eventually(A).Should(BeClosed())
- close(done)
- })
- It("should be possible to cancel a detection", func(done Done) {
- A := buffer.Detect("abc")
- B := buffer.Detect("def")
- buffer.CancelDetects()
- buffer.Write([]byte("abcdef"))
- Eventually(A).Should(BeClosed())
- Eventually(B).Should(BeClosed())
- Ω(buffer).Should(Say("bcde"))
- <-buffer.Detect("f")
- close(done)
- })
- })
- Describe("closing the buffer", func() {
- It("should error when further write attempts are made", func() {
- _, err := buffer.Write([]byte("abc"))
- Ω(err).ShouldNot(HaveOccurred())
- buffer.Close()
- _, err = buffer.Write([]byte("def"))
- Ω(err).Should(HaveOccurred())
- Ω(buffer.Contents()).Should(Equal([]byte("abc")))
- })
- It("should be closed", func() {
- Ω(buffer.Closed()).Should(BeFalse())
- buffer.Close()
- Ω(buffer.Closed()).Should(BeTrue())
- })
- })
- })
|