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