Skip to content
This repository was archived by the owner on Sep 11, 2020. It is now read-only.

Commit 31f920a

Browse files
committed
Improved objfile error handling and test coverage
1 parent e685582 commit 31f920a

File tree

6 files changed

+70
-3
lines changed

6 files changed

+70
-3
lines changed

core/object.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88

99
var (
1010
ObjectNotFoundErr = errors.New("object not found")
11+
// ErrInvalidType is returned when an invalid object type is provided.
12+
ErrInvalidType = errors.New("invalid object type")
1113
)
1214

1315
// TODO: Consider adding a Hash function to the ObjectReader and ObjectWriter
@@ -101,7 +103,7 @@ func ParseObjectType(value string) (typ ObjectType, err error) {
101103
case "ref-delta":
102104
typ = REFDeltaObject
103105
default:
104-
err = errors.New("unable to parse object type")
106+
err = ErrInvalidType
105107
}
106108
return
107109
}

formats/objfile/common.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ var (
1313
ErrClosed = errors.New("objfile: already closed")
1414
// ErrHeader is returned when the objfile has an invalid header.
1515
ErrHeader = errors.New("objfile: invalid header")
16+
// ErrNegativeSize is returned when a negative object size is declared.
17+
ErrNegativeSize = errors.New("objfile: negative object size")
1618
)
1719

1820
type header struct {
@@ -38,7 +40,11 @@ func (h *header) Read(r io.Reader) error {
3840

3941
h.size, err = strconv.ParseInt(string(size), 10, 64)
4042
if err != nil {
41-
return err
43+
return ErrHeader
44+
}
45+
46+
if h.size < 0 {
47+
return ErrNegativeSize
4248
}
4349

4450
return nil

formats/objfile/common_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package objfile
22

33
import (
4+
"bytes"
45
"encoding/base64"
56
"testing"
67

@@ -67,3 +68,33 @@ var objfileFixtures = []objfileFixture{
6768
}
6869

6970
func Test(t *testing.T) { TestingT(t) }
71+
72+
type SuiteCommon struct{}
73+
74+
var _ = Suite(&SuiteCommon{})
75+
76+
func (s *SuiteCommon) TestHeaderReadEmpty(c *C) {
77+
var h header
78+
c.Assert(h.Read(new(bytes.Buffer)), Equals, ErrHeader)
79+
}
80+
81+
func (s *SuiteCommon) TestHeaderReadGarbage(c *C) {
82+
var h header
83+
c.Assert(h.Read(bytes.NewBuffer([]byte{1, 2, 3, 4, 5})), Equals, ErrHeader)
84+
c.Assert(h.Read(bytes.NewBuffer([]byte{1, 2, 3, 4, 5, '0'})), Equals, ErrHeader)
85+
}
86+
87+
func (s *SuiteCommon) TestHeaderReadInvalidType(c *C) {
88+
var h header
89+
c.Assert(h.Read(bytes.NewBuffer([]byte{1, 2, ' ', 4, 5, 0})), Equals, core.ErrInvalidType)
90+
}
91+
92+
func (s *SuiteCommon) TestHeaderReadInvalidSize(c *C) {
93+
var h header
94+
c.Assert(h.Read(bytes.NewBuffer([]byte{'b', 'l', 'o', 'b', ' ', 'a', 0})), Equals, ErrHeader)
95+
}
96+
97+
func (s *SuiteCommon) TestHeaderReadNegativeSize(c *C) {
98+
var h header
99+
c.Assert(h.Read(bytes.NewBuffer([]byte{'b', 'l', 'o', 'b', ' ', '-', '1', 0})), Equals, ErrNegativeSize)
100+
}

formats/objfile/reader_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,12 @@ func testReader(c *C, source io.Reader, hash core.Hash, typ core.ObjectType, con
3535
rc, err := ioutil.ReadAll(r)
3636
c.Assert(err, IsNil)
3737
c.Assert(rc, DeepEquals, content, Commentf("%scontent=%s, expected=%s", base64.StdEncoding.EncodeToString(rc), base64.StdEncoding.EncodeToString(content)))
38+
c.Assert(r.Size(), Equals, int64(len(content)))
3839
c.Assert(r.Hash(), Equals, hash) // Test Hash() before close
3940
c.Assert(r.Close(), IsNil)
4041
c.Assert(r.Hash(), Equals, hash) // Test Hash() after close
42+
_, err = r.Read(make([]byte, 0, 1))
43+
c.Assert(err, Equals, ErrClosed)
4144
}
4245

4346
func (s *SuiteReader) TestReadEmptyObjfile(c *C) {

formats/objfile/writer.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,18 @@ type Writer struct {
3939
// size and type information. Any errors encountered in that process will be
4040
// returned in err.
4141
//
42+
// If an invalid t is provided, core.ErrInvalidType is returned. If a negative
43+
// size is provided, ErrNegativeSize is returned.
44+
//
4245
// The returned Writer implements io.WriteCloser. Close should be called when
4346
// finished with the Writer. Close will not close the underlying io.Writer.
4447
func NewWriter(w io.Writer, t core.ObjectType, size int64) (*Writer, error) {
48+
if !t.Valid() {
49+
return nil, core.ErrInvalidType
50+
}
51+
if size < 0 {
52+
return nil, ErrNegativeSize
53+
}
4554
writer := &Writer{
4655
header: header{t: t, size: size},
4756
}
@@ -58,7 +67,7 @@ func (w *Writer) init(output io.Writer) (err error) {
5867

5968
err = w.header.Write(w.compressor)
6069
if err != nil {
61-
defer w.compressor.Close()
70+
w.compressor.Close()
6271
return
6372
}
6473

formats/objfile/writer_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,12 @@ func testWriter(c *C, dest io.Writer, hash core.Hash, typ core.ObjectType, conte
3838
written, err := io.Copy(w, bytes.NewReader(content))
3939
c.Assert(err, IsNil)
4040
c.Assert(written, Equals, length)
41+
c.Assert(w.Size(), Equals, int64(len(content)))
4142
c.Assert(w.Hash(), Equals, hash) // Test Hash() before close
4243
c.Assert(w.Close(), IsNil)
4344
c.Assert(w.Hash(), Equals, hash) // Test Hash() after close
45+
_, err = w.Write([]byte{1})
46+
c.Assert(err, Equals, ErrClosed)
4447
}
4548

4649
func (s *SuiteWriter) TestWriteOverflow(c *C) {
@@ -51,3 +54,16 @@ func (s *SuiteWriter) TestWriteOverflow(c *C) {
5154
_, err = w.Write([]byte("56789"))
5255
c.Assert(err, Equals, ErrOverflow)
5356
}
57+
58+
func (s *SuiteWriter) TestNewWriterInvalidType(c *C) {
59+
var t core.ObjectType
60+
_, err := NewWriter(new(bytes.Buffer), t, 8)
61+
c.Assert(err, Equals, core.ErrInvalidType)
62+
}
63+
64+
func (s *SuiteWriter) TestNewWriterInvalidSize(c *C) {
65+
_, err := NewWriter(new(bytes.Buffer), core.BlobObject, -1)
66+
c.Assert(err, Equals, ErrNegativeSize)
67+
_, err = NewWriter(new(bytes.Buffer), core.BlobObject, -1651860)
68+
c.Assert(err, Equals, ErrNegativeSize)
69+
}

0 commit comments

Comments
 (0)