/*
NAME
  rtcp_test.go

DESCRIPTION
  rtcp_test.go contains testing utilities for functionality provided in rtcp_test.go.

AUTHORS
  Saxon A. Nelson-Milton <saxon@ausocean.org>

LICENSE
  This is Copyright (C) 2019 the Australian Ocean Lab (AusOcean)

  It is free software: you can redistribute it and/or modify them
  under the terms of the GNU General Public License as published by the
  Free Software Foundation, either version 3 of the License, or (at your
  option) any later version.

  It is distributed in the hope that it will be useful, but WITHOUT
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  for more details.

  You should have received a copy of the GNU General Public License
  in gpl.txt.  If not, see http://www.gnu.org/licenses.
*/

package rtcp

import (
	"bytes"
	"math"
	"testing"
)

// TestReceiverReportBytes checks that we can correctly obtain a []byte of an
// RTCP receiver report from the struct representation.
func TestReceiverReportBytes(t *testing.T) {
	expect := []byte{
		0x81, 0xc9, 0x00, 0x07,
		0xd6, 0xe0, 0x98, 0xda,
		0x6f, 0xad, 0x40, 0xc6,
		0x00, 0xff, 0xff, 0xff,
		0x00, 0x01, 0x83, 0x08,
		0x00, 0x00, 0x00, 0x20,
		0xb9, 0xe1, 0x25, 0x2a,
		0x00, 0x00, 0x2b, 0xf9,
	}

	report := ReceiverReport{
		Header: Header{
			Version:     2,
			Padding:     false,
			ReportCount: 1,
			Type:        typeReceiverReport,
		},
		SenderSSRC: 3605043418,
		Blocks: []ReportBlock{
			ReportBlock{
				SourceIdentifier:  1873625286,
				FractionLost:      0,
				PacketsLost:       math.MaxUint32,
				HighestSequence:   99080,
				Jitter:            32,
				SenderReportTs:    3118540074,
				SenderReportDelay: 11257,
			},
		},
		Extensions: nil,
	}

	got := report.Bytes(nil)
	if !bytes.Equal(got, expect) {
		t.Errorf("did not get expected result. \nGot: %v\nWant: %v\n", got, expect)
	}
}

// TestSourceDescriptionBytes checks that we can correctly obtain a []byte of an
// RTCP source description from the struct representation.
func TestSourceDescriptionBytes(t *testing.T) {
	expect := []byte{
		0x81, 0xca, 0x00, 0x04,
		0xd6, 0xe0, 0x98, 0xda,
		0x01, 0x08, 0x73, 0x61,
		0x78, 0x6f, 0x6e, 0x2d,
		0x70, 0x63, 0x00, 0x00,
	}

	description := Description{
		Header: Header{
			Version:     2,
			Padding:     false,
			ReportCount: 1,
			Type:        typeDescription,
		},
		Chunks: []Chunk{
			Chunk{
				SSRC: 3605043418,
				Items: []SDESItem{
					SDESItem{
						Type: typeCName,
						Text: []byte("saxon-pc"),
					},
				},
			},
		},
	}
	got := description.Bytes(nil)
	if !bytes.Equal(got, expect) {
		t.Errorf("Did not get expected result.\nGot: %v\n Want: %v\n", got, expect)
	}
}