1package ui_test 2 3import ( 4 . "github.com/cloudfoundry/bosh-cli/ui" 5 6 "github.com/cloudfoundry/bosh-cli/ui/fakes" 7 . "github.com/onsi/ginkgo" 8 . "github.com/onsi/gomega" 9) 10 11type CallTracker struct { 12 Seeks []interface{} 13 Closes int 14} 15 16type FakeSeekableReader struct { 17 callTracker *CallTracker 18} 19type FakeReaderCloser struct{} 20 21func (FakeSeekableReader) Read(p []byte) (n int, err error) { 22 panic("should not call") 23} 24 25func (FakeReaderCloser) Read(p []byte) (n int, err error) { 26 panic("should not call") 27} 28 29func (FakeReaderCloser) Close() error { 30 panic("should not call") 31} 32 33func (r FakeSeekableReader) Seek(offset int64, whence int) (int64, error) { 34 r.callTracker.Seeks = append(r.callTracker.Seeks, []interface{}{offset, whence}) 35 36 return 0, nil 37} 38 39func (r FakeSeekableReader) Close() error { 40 r.callTracker.Closes++ 41 42 return nil 43} 44 45var _ = Describe("ReadCloserProxy", func() { 46 Describe("Seek", func() { 47 Context("when reader is seekable", func() { 48 It("delegates to internal seeker", func() { 49 seekerReader := FakeSeekableReader{ 50 callTracker: &CallTracker{}, 51 } 52 fileReporter := NewFileReporter(&fakes.FakeUI{}) 53 readCloserProxy := fileReporter.TrackUpload(0, seekerReader) 54 55 readCloserProxy.Seek(12, 42) 56 Expect(seekerReader.callTracker.Seeks).To(ContainElement([]interface{}{int64(12), 42})) 57 }) 58 }) 59 60 Context("when reader is NOT seekable", func() { 61 It("does not complain and returns 0, nil", func() { 62 reader := FakeReaderCloser{} 63 fileReporter := NewFileReporter(&fakes.FakeUI{}) 64 readCloserProxy := fileReporter.TrackUpload(0, reader) 65 66 bytes, err := readCloserProxy.Seek(12, 42) 67 Expect(err).ToNot(HaveOccurred()) 68 Expect(bytes).To(Equal(int64(0))) 69 }) 70 }) 71 }) 72 73 Describe("Close", func() { 74 It("closes the reader, uses the ui for bar output, and prints a newline", func() { 75 fakeUI := &fakes.FakeUI{} 76 seekerReader := FakeSeekableReader{ 77 callTracker: &CallTracker{}, 78 } 79 fileReporter := NewFileReporter(fakeUI) 80 readCloserProxy := fileReporter.TrackUpload(0, seekerReader) 81 82 err := readCloserProxy.Close() 83 Expect(err).ToNot(HaveOccurred()) 84 Expect(seekerReader.callTracker.Closes).To(Equal(1)) 85 uiSaid := fakeUI.Said 86 87 Expect(uiSaid).To(HaveLen(3)) 88 Expect(uiSaid[0]).To(MatchRegexp("^\\r\\s+#$")) 89 Expect(uiSaid[1]).To(MatchRegexp("^\\r\\s+# 0s$")) 90 Expect(uiSaid[2]).To(MatchRegexp(`^\n$`)) 91 }) 92 }) 93}) 94