package packp import ( "bytes" "gopkg.in/src-d/go-git.v4/plumbing" "gopkg.in/src-d/go-git.v4/plumbing/format/pktline" . "gopkg.in/check.v1" ) type ReportStatusSuite struct{} var _ = Suite(&ReportStatusSuite{}) func (s *ReportStatusSuite) TestOk(c *C) { rs := NewReportStatus() rs.UnpackStatus = "ok" c.Assert(rs.Ok(), Equals, true) rs.UnpackStatus = "OK" c.Assert(rs.Ok(), Equals, false) rs.UnpackStatus = "" c.Assert(rs.Ok(), Equals, false) cs := &CommandStatus{} cs.Status = "ok" c.Assert(cs.Ok(), Equals, true) cs.Status = "OK" c.Assert(cs.Ok(), Equals, false) cs.Status = "" c.Assert(cs.Ok(), Equals, false) } func (s *ReportStatusSuite) testEncodeDecodeOk(c *C, rs *ReportStatus, lines ...string) { s.testDecodeOk(c, rs, lines...) s.testEncodeOk(c, rs, lines...) } func (s *ReportStatusSuite) testDecodeOk(c *C, expected *ReportStatus, lines ...string) { r := toPktLines(c, lines) rs := NewReportStatus() c.Assert(rs.Decode(r), IsNil) c.Assert(rs, DeepEquals, expected) } func (s *ReportStatusSuite) testDecodeError(c *C, errorMatch string, lines ...string) { r := toPktLines(c, lines) rs := NewReportStatus() c.Assert(rs.Decode(r), ErrorMatches, errorMatch) } func (s *ReportStatusSuite) testEncodeOk(c *C, input *ReportStatus, lines ...string) { expected := pktlines(c, lines...) var buf bytes.Buffer c.Assert(input.Encode(&buf), IsNil) obtained := buf.Bytes() comment := Commentf("\nobtained = %s\nexpected = %s\n", string(obtained), string(expected)) c.Assert(obtained, DeepEquals, expected, comment) } func (s *ReportStatusSuite) TestEncodeDecodeOkOneReference(c *C) { rs := NewReportStatus() rs.UnpackStatus = "ok" rs.CommandStatuses = []*CommandStatus{{ ReferenceName: plumbing.ReferenceName("refs/heads/master"), Status: "ok", }} s.testEncodeDecodeOk(c, rs, "unpack ok", "ok refs/heads/master", pktline.FlushString, ) } func (s *ReportStatusSuite) TestEncodeDecodeOkOneReferenceFailed(c *C) { rs := NewReportStatus() rs.UnpackStatus = "my error" rs.CommandStatuses = []*CommandStatus{{ ReferenceName: plumbing.ReferenceName("refs/heads/master"), Status: "command error", }} s.testEncodeDecodeOk(c, rs, "unpack my error", "ng refs/heads/master command error", pktline.FlushString, ) } func (s *ReportStatusSuite) TestEncodeDecodeOkMoreReferences(c *C) { rs := NewReportStatus() rs.UnpackStatus = "ok" rs.CommandStatuses = []*CommandStatus{{ ReferenceName: plumbing.ReferenceName("refs/heads/master"), Status: "ok", }, { ReferenceName: plumbing.ReferenceName("refs/heads/a"), Status: "ok", }, { ReferenceName: plumbing.ReferenceName("refs/heads/b"), Status: "ok", }} s.testEncodeDecodeOk(c, rs, "unpack ok", "ok refs/heads/master", "ok refs/heads/a", "ok refs/heads/b", pktline.FlushString, ) } func (s *ReportStatusSuite) TestEncodeDecodeOkMoreReferencesFailed(c *C) { rs := NewReportStatus() rs.UnpackStatus = "my error" rs.CommandStatuses = []*CommandStatus{{ ReferenceName: plumbing.ReferenceName("refs/heads/master"), Status: "ok", }, { ReferenceName: plumbing.ReferenceName("refs/heads/a"), Status: "command error", }, { ReferenceName: plumbing.ReferenceName("refs/heads/b"), Status: "ok", }} s.testEncodeDecodeOk(c, rs, "unpack my error", "ok refs/heads/master", "ng refs/heads/a command error", "ok refs/heads/b", pktline.FlushString, ) } func (s *ReportStatusSuite) TestEncodeDecodeOkNoReferences(c *C) { expected := NewReportStatus() expected.UnpackStatus = "ok" s.testEncodeDecodeOk(c, expected, "unpack ok", pktline.FlushString, ) } func (s *ReportStatusSuite) TestEncodeDecodeOkNoReferencesFailed(c *C) { rs := NewReportStatus() rs.UnpackStatus = "my error" s.testEncodeDecodeOk(c, rs, "unpack my error", pktline.FlushString, ) } func (s *ReportStatusSuite) TestDecodeErrorOneReferenceNoFlush(c *C) { expected := NewReportStatus() expected.UnpackStatus = "ok" expected.CommandStatuses = []*CommandStatus{{ ReferenceName: plumbing.ReferenceName("refs/heads/master"), Status: "ok", }} s.testDecodeError(c, "missing flush", "unpack ok", "ok refs/heads/master", ) } func (s *ReportStatusSuite) TestDecodeErrorEmpty(c *C) { expected := NewReportStatus() expected.UnpackStatus = "ok" expected.CommandStatuses = []*CommandStatus{{ ReferenceName: plumbing.ReferenceName("refs/heads/master"), Status: "ok", }} s.testDecodeError(c, "unexpected EOF") } func (s *ReportStatusSuite) TestDecodeErrorMalformed(c *C) { expected := NewReportStatus() expected.UnpackStatus = "ok" expected.CommandStatuses = []*CommandStatus{{ ReferenceName: plumbing.ReferenceName("refs/heads/master"), Status: "ok", }} s.testDecodeError(c, "malformed unpack status: unpackok", "unpackok", pktline.FlushString, ) } func (s *ReportStatusSuite) TestDecodeErrorMalformed2(c *C) { expected := NewReportStatus() expected.UnpackStatus = "ok" expected.CommandStatuses = []*CommandStatus{{ ReferenceName: plumbing.ReferenceName("refs/heads/master"), Status: "ok", }} s.testDecodeError(c, "malformed unpack status: UNPACK OK", "UNPACK OK", pktline.FlushString, ) } func (s *ReportStatusSuite) TestDecodeErrorMalformedCommandStatus(c *C) { expected := NewReportStatus() expected.UnpackStatus = "ok" expected.CommandStatuses = []*CommandStatus{{ ReferenceName: plumbing.ReferenceName("refs/heads/master"), Status: "ok", }} s.testDecodeError(c, "malformed command status: ko refs/heads/master", "unpack ok", "ko refs/heads/master", pktline.FlushString, ) } func (s *ReportStatusSuite) TestDecodeErrorMalformedCommandStatus2(c *C) { expected := NewReportStatus() expected.UnpackStatus = "ok" expected.CommandStatuses = []*CommandStatus{{ ReferenceName: plumbing.ReferenceName("refs/heads/master"), Status: "ok", }} s.testDecodeError(c, "malformed command status: ng refs/heads/master", "unpack ok", "ng refs/heads/master", pktline.FlushString, ) } func (s *ReportStatusSuite) TestDecodeErrorPrematureFlush(c *C) { expected := NewReportStatus() expected.UnpackStatus = "ok" expected.CommandStatuses = []*CommandStatus{{ ReferenceName: plumbing.ReferenceName("refs/heads/master"), Status: "ok", }} s.testDecodeError(c, "premature flush", pktline.FlushString, ) }