package packp import ( "bytes" "github.com/go-git/go-git/v5/plumbing" "github.com/go-git/go-git/v5/plumbing/format/pktline" . "gopkg.in/check.v1" ) type ReportStatusSuite struct{} var _ = Suite(&ReportStatusSuite{}) func (s *ReportStatusSuite) TestError(c *C) { rs := NewReportStatus() rs.UnpackStatus = "ok" c.Assert(rs.Error(), IsNil) rs.UnpackStatus = "OK" c.Assert(rs.Error(), ErrorMatches, "unpack error: OK") rs.UnpackStatus = "" c.Assert(rs.Error(), ErrorMatches, "unpack error: ") cs := &CommandStatus{ReferenceName: plumbing.ReferenceName("ref")} rs.UnpackStatus = "ok" rs.CommandStatuses = append(rs.CommandStatuses, cs) cs.Status = "ok" c.Assert(rs.Error(), IsNil) cs.Status = "OK" c.Assert(rs.Error(), ErrorMatches, "command error on ref: OK") cs.Status = "" c.Assert(rs.Error(), ErrorMatches, "command error on ref: ") } 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\n", "ok refs/heads/master\n", 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\n", "ng refs/heads/master command error\n", 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\n", "ok refs/heads/master\n", "ok refs/heads/a\n", "ok refs/heads/b\n", 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\n", "ok refs/heads/master\n", "ng refs/heads/a command error\n", "ok refs/heads/b\n", pktline.FlushString, ) } func (s *ReportStatusSuite) TestEncodeDecodeOkNoReferences(c *C) { expected := NewReportStatus() expected.UnpackStatus = "ok" s.testEncodeDecodeOk(c, expected, "unpack ok\n", pktline.FlushString, ) } func (s *ReportStatusSuite) TestEncodeDecodeOkNoReferencesFailed(c *C) { rs := NewReportStatus() rs.UnpackStatus = "my error" s.testEncodeDecodeOk(c, rs, "unpack my error\n", 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\n", "ok refs/heads/master\n", ) } 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\n", 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\n", 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\n", "ko refs/heads/master\n", 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\n", "ng refs/heads/master\n", 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, ) }