// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package tls

import (
	"bytes"
	"testing"
	"testing/iotest"
)

func matchRecord(r1, r2 *record) bool {
	if (r1 == nil) != (r2 == nil) {
		return false
	}
	if r1 == nil {
		return true
	}
	return r1.contentType == r2.contentType &&
		r1.major == r2.major &&
		r1.minor == r2.minor &&
		bytes.Compare(r1.payload, r2.payload) == 0
}

type recordReaderTest struct {
	in  []byte
	out []*record
}

var recordReaderTests = []recordReaderTest{
	recordReaderTest{nil, nil},
	recordReaderTest{fromHex("01"), nil},
	recordReaderTest{fromHex("0102"), nil},
	recordReaderTest{fromHex("010203"), nil},
	recordReaderTest{fromHex("01020300"), nil},
	recordReaderTest{fromHex("0102030000"), []*record{&record{1, 2, 3, nil}}},
	recordReaderTest{fromHex("01020300000102030000"), []*record{&record{1, 2, 3, nil}, &record{1, 2, 3, nil}}},
	recordReaderTest{fromHex("0102030001fe0102030002feff"), []*record{&record{1, 2, 3, []byte{0xfe}}, &record{1, 2, 3, []byte{0xfe, 0xff}}}},
	recordReaderTest{fromHex("010203000001020300"), []*record{&record{1, 2, 3, nil}}},
}

func TestRecordReader(t *testing.T) {
	for i, test := range recordReaderTests {
		buf := bytes.NewBuffer(test.in)
		c := make(chan *record)
		go recordReader(c, buf)
		matchRecordReaderOutput(t, i, test, c)

		buf = bytes.NewBuffer(test.in)
		buf2 := iotest.OneByteReader(buf)
		c = make(chan *record)
		go recordReader(c, buf2)
		matchRecordReaderOutput(t, i*2, test, c)
	}
}

func matchRecordReaderOutput(t *testing.T, i int, test recordReaderTest, c <-chan *record) {
	for j, r1 := range test.out {
		r2 := <-c
		if r2 == nil {
			t.Errorf("#%d truncated after %d values", i, j)
			break
		}
		if !matchRecord(r1, r2) {
			t.Errorf("#%d (%d) got:%#v want:%#v", i, j, r2, r1)
		}
	}
	<-c
	if !closed(c) {
		t.Errorf("#%d: channel didn't close", i)
	}
}
