package config
import (
"bytes"
"testing"
. "gopkg.in/check.v1"
)
type DecoderSuite struct{}
var _ = Suite(&DecoderSuite{})
func (s *DecoderSuite) TestDecode(c *C) {
for idx, fixture := range fixtures {
r := bytes.NewReader([]byte(fixture.Raw))
d := NewDecoder(r)
cfg := &Config{}
err := d.Decode(cfg)
c.Assert(err, IsNil, Commentf("decoder error for fixture: %d", idx))
buf := bytes.NewBuffer(nil)
e := NewEncoder(buf)
_ = e.Encode(cfg)
c.Assert(cfg, DeepEquals, fixture.Config, Commentf("bad result for fixture: %d, %s", idx, buf.String()))
}
}
func (s *DecoderSuite) TestDecodeFailsWithIdentBeforeSection(c *C) {
t := `
key=value
[section]
key=value
`
decodeFails(c, t)
}
func (s *DecoderSuite) TestDecodeFailsWithEmptySectionName(c *C) {
t := `
[]
key=value
`
decodeFails(c, t)
}
func (s *DecoderSuite) TestDecodeFailsWithEmptySubsectionName(c *C) {
t := `
[remote ""]
key=value
`
decodeFails(c, t)
}
func (s *DecoderSuite) TestDecodeFailsWithBadSubsectionName(c *C) {
t := `
[remote origin"]
key=value
`
decodeFails(c, t)
t = `
[remote "origin]
key=value
`
decodeFails(c, t)
}
func (s *DecoderSuite) TestDecodeFailsWithTrailingGarbage(c *C) {
t := `
[remote]garbage
key=value
`
decodeFails(c, t)
t = `
[remote "origin"]garbage
key=value
`
decodeFails(c, t)
}
func (s *DecoderSuite) TestDecodeFailsWithGarbage(c *C) {
decodeFails(c, "---")
decodeFails(c, "????")
decodeFails(c, "[sect\nkey=value")
decodeFails(c, "sect]\nkey=value")
decodeFails(c, `[section]key="value`)
decodeFails(c, `[section]key=value"`)
}
func decodeFails(c *C, text string) {
r := bytes.NewReader([]byte(text))
d := NewDecoder(r)
cfg := &Config{}
err := d.Decode(cfg)
c.Assert(err, NotNil)
}
func FuzzDecoder(f *testing.F) {
f.Fuzz(func(t *testing.T, input []byte) {
d := NewDecoder(bytes.NewReader(input))
cfg := &Config{}
d.Decode(cfg)
})
}