|
- // 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);
- }
- }
|