1
// Copyright 2014 Canonical Ltd.
2
// Licensed under the LGPLv3, see LICENCE file for details.
10
"github.com/juju/testing"
11
jc "github.com/juju/testing/checkers"
12
"github.com/juju/testing/filetesting"
13
gc "gopkg.in/check.v1"
15
"github.com/juju/utils"
18
var _ = gc.Suite(&sizeSuite{})
20
type sizeSuite struct {
21
testing.IsolationSuite
24
func (*sizeSuite) TestParseSize(c *gc.C) {
32
err: `expected a non-negative number, got ""`,
35
err: `expected a non-negative number, got "-1"`,
38
err: `invalid multiplier suffix "MZ", expected one of MGTPEZY`,
68
out: 1125899906842624,
71
out: 1152921504606846976,
73
for i, test := range tests {
74
c.Logf("test %d: %+v", i, test)
75
size, err := utils.ParseSize(test.in)
77
c.Assert(err, gc.NotNil)
78
c.Assert(err, gc.ErrorMatches, test.err)
80
c.Assert(err, gc.IsNil)
81
c.Assert(size, gc.Equals, test.out)
86
func (*sizeSuite) TestSizingReaderOkay(c *gc.C) {
87
expected := "some data"
88
stub := &testing.Stub{}
89
reader := filetesting.NewStubReader(stub, expected)
91
var st utils.SizeTracker
92
sizingReader := io.TeeReader(reader, &st)
93
data, err := ioutil.ReadAll(sizingReader)
94
c.Assert(err, jc.ErrorIsNil)
96
stub.CheckCallNames(c, "Read", "Read")
97
c.Check(string(data), gc.Equals, expected)
98
c.Check(st.Size(), gc.Equals, int64(len(expected)))
101
func (*sizeSuite) TestSizingReaderMixedEOF(c *gc.C) {
102
expected := "some data"
103
stub := &testing.Stub{}
104
reader := &filetesting.StubReader{
106
ReturnRead: &fakeStream{
111
var st utils.SizeTracker
112
sizingReader := io.TeeReader(reader, &st)
113
data, err := ioutil.ReadAll(sizingReader)
114
c.Assert(err, jc.ErrorIsNil)
116
stub.CheckCallNames(c, "Read") // The EOF was mixed with the data.
117
c.Check(string(data), gc.Equals, expected)
118
c.Check(st.Size(), gc.Equals, int64(len(expected)))
121
func (*sizeSuite) TestSizingWriter(c *gc.C) {
122
expected := "some data"
123
stub := &testing.Stub{}
124
writer, buffer := filetesting.NewStubWriter(stub)
126
var st utils.SizeTracker
127
sizingWriter := io.MultiWriter(writer, &st)
128
n, err := sizingWriter.Write([]byte(expected))
129
c.Assert(err, jc.ErrorIsNil)
131
stub.CheckCallNames(c, "Write")
132
c.Check(n, gc.Equals, len(expected))
133
c.Check(buffer.String(), gc.Equals, expected)
134
c.Check(st.Size(), gc.Equals, int64(len(expected)))
137
type fakeStream struct {
142
func (f *fakeStream) Read(data []byte) (int, error) {
143
n := copy(data, f.data[f.pos:])
145
if f.pos >= uint64(len(f.data)) {