Przeglądaj źródła

Add tests for faketls conn

tags/v2.0.0-rc1
9seconds 5 lat temu
rodzic
commit
38ff62fddc
1 zmienionych plików z 153 dodań i 0 usunięć
  1. 153
    0
      mtglib/internal/faketls/conn_test.go

+ 153
- 0
mtglib/internal/faketls/conn_test.go Wyświetl plik

@@ -0,0 +1,153 @@
1
+package faketls_test
2
+
3
+import (
4
+	"bytes"
5
+	"errors"
6
+	"io"
7
+	"math/rand"
8
+	"testing"
9
+
10
+	"github.com/9seconds/mtg/v2/mtglib/internal/faketls"
11
+	"github.com/9seconds/mtg/v2/mtglib/internal/faketls/record"
12
+	"github.com/9seconds/mtg/v2/testlib"
13
+	"github.com/stretchr/testify/mock"
14
+	"github.com/stretchr/testify/suite"
15
+)
16
+
17
+type ConnMock struct {
18
+	testlib.NetConnMock
19
+
20
+	readBuffer  bytes.Buffer
21
+	writeBuffer bytes.Buffer
22
+}
23
+
24
+func (m *ConnMock) Read(p []byte) (int, error) {
25
+	m.Called(p)
26
+
27
+	return m.readBuffer.Read(p)
28
+}
29
+
30
+func (m *ConnMock) Write(p []byte) (int, error) {
31
+	m.Called(p)
32
+
33
+	return m.writeBuffer.Write(p)
34
+}
35
+
36
+type ConnTestSuite struct {
37
+	suite.Suite
38
+
39
+	connMock *ConnMock
40
+	c        *faketls.Conn
41
+}
42
+
43
+func (suite *ConnTestSuite) SetupTest() {
44
+	suite.connMock = &ConnMock{}
45
+	suite.c = &faketls.Conn{
46
+		Conn: suite.connMock,
47
+	}
48
+}
49
+
50
+func (suite *ConnTestSuite) TearDownTest() {
51
+	suite.connMock.AssertExpectations(suite.T())
52
+}
53
+
54
+func (suite *ConnTestSuite) TestRead() {
55
+	suite.connMock.On("Read", mock.Anything).Return(0, nil)
56
+
57
+	rec := record.AcquireRecord()
58
+	defer record.ReleaseRecord(rec)
59
+
60
+	rec.Type = record.TypeChangeCipherSpec
61
+	rec.Version = record.Version12
62
+
63
+	rec.Payload.WriteByte(0x01)
64
+	rec.Dump(&suite.connMock.readBuffer) // nolint: errcheck
65
+	rec.Reset()
66
+
67
+	rec.Type = record.TypeApplicationData
68
+	rec.Version = record.Version12
69
+
70
+	rec.Payload.Write([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
71
+	rec.Dump(&suite.connMock.readBuffer) // nolint: errcheck
72
+
73
+	resultBuffer := &bytes.Buffer{}
74
+	buf := make([]byte, 2)
75
+
76
+	for {
77
+		n, err := suite.c.Read(buf)
78
+		if errors.Is(err, io.EOF) {
79
+			break
80
+		}
81
+
82
+		resultBuffer.Write(buf[:n])
83
+	}
84
+
85
+	suite.Equal([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, resultBuffer.Bytes())
86
+}
87
+
88
+func (suite *ConnTestSuite) TestReadUnexpected() {
89
+	suite.connMock.On("Read", mock.Anything).Return(0, nil)
90
+
91
+	rec := record.AcquireRecord()
92
+	defer record.ReleaseRecord(rec)
93
+
94
+	rec.Type = record.TypeChangeCipherSpec
95
+	rec.Version = record.Version12
96
+
97
+	rec.Payload.WriteByte(0x01)
98
+	rec.Dump(&suite.connMock.readBuffer) // nolint: errcheck
99
+	rec.Reset()
100
+
101
+	rec.Type = record.TypeHandshake
102
+	rec.Version = record.Version12
103
+
104
+	rec.Payload.Write([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
105
+	rec.Dump(&suite.connMock.readBuffer) // nolint: errcheck
106
+
107
+	buf := make([]byte, 2)
108
+
109
+	for {
110
+		_, err := suite.c.Read(buf)
111
+
112
+		switch {
113
+		case err == nil:
114
+		case errors.Is(err, io.EOF):
115
+			suite.FailNow("unexpected to finish")
116
+		default:
117
+			return
118
+		}
119
+	}
120
+}
121
+
122
+func (suite *ConnTestSuite) TestWrite() {
123
+	suite.connMock.On("Write", mock.Anything).Return(0, nil)
124
+
125
+	dataToRec := make([]byte, record.TLSMaxRecordSize*2)
126
+	rand.Read(dataToRec)
127
+
128
+	n, err := suite.c.Write(dataToRec)
129
+	suite.NoError(err)
130
+	suite.Equal(len(dataToRec), n)
131
+
132
+	rec := record.AcquireRecord()
133
+	defer record.ReleaseRecord(rec)
134
+
135
+	buf := &bytes.Buffer{}
136
+
137
+	for {
138
+		if err := rec.Read(&suite.connMock.writeBuffer); err != nil {
139
+			break
140
+		}
141
+
142
+		suite.Equal(record.TypeApplicationData, rec.Type)
143
+		suite.Equal(record.Version12, rec.Version)
144
+		rec.Payload.WriteTo(buf) // nolint: errcheck
145
+	}
146
+
147
+	suite.Equal(dataToRec, buf.Bytes())
148
+}
149
+
150
+func TestConn(t *testing.T) {
151
+	t.Parallel()
152
+	suite.Run(t, &ConnTestSuite{})
153
+}

Ładowanie…
Anuluj
Zapisz