@@ -10,6 +10,7 @@ import (
10
10
manet "github.com/multiformats/go-multiaddr/net"
11
11
12
12
"github.com/stretchr/testify/assert"
13
+ "github.com/stretchr/testify/require"
13
14
)
14
15
15
16
func TestSampledConn (t * testing.T ) {
@@ -63,7 +64,7 @@ func TestSampledConn(t *testing.T) {
63
64
assert .Equal (t , "hello" , string (buf ))
64
65
} else {
65
66
// Wrap the client connection in SampledConn
66
- sample , sampledConn , err := newFallbackSampledConn (clientConn .(ManetTCPConnInterface ))
67
+ sample , sampledConn , err := newWrappedSampledConn (clientConn .(ManetTCPConnInterface ))
67
68
assert .NoError (t , err )
68
69
assert .Equal (t , "hel" , string (sample [:]))
69
70
@@ -76,3 +77,102 @@ func TestSampledConn(t *testing.T) {
76
77
})
77
78
}
78
79
}
80
+
81
+ func spawnServerAndClientConn (t * testing.T ) (serverConn manet.Conn , clientConn manet.Conn ) {
82
+ serverConnChan := make (chan manet.Conn , 1 )
83
+
84
+ listener , err := manet .Listen (ma .StringCast ("/ip4/127.0.0.1/tcp/0" ))
85
+ assert .NoError (t , err )
86
+ defer listener .Close ()
87
+
88
+ serverAddr := listener .Multiaddr ()
89
+
90
+ // Server goroutine
91
+ go func () {
92
+ conn , err := listener .Accept ()
93
+ assert .NoError (t , err )
94
+ serverConnChan <- conn
95
+ }()
96
+
97
+ // Give the server a moment to start
98
+ time .Sleep (100 * time .Millisecond )
99
+
100
+ // Create a TCP client
101
+ clientConn , err = manet .Dial (serverAddr )
102
+ assert .NoError (t , err )
103
+
104
+ return <- serverConnChan , clientConn
105
+ }
106
+
107
+ func TestHandleNoBytes (t * testing.T ) {
108
+ serverConn , clientConn := spawnServerAndClientConn (t )
109
+ defer clientConn .Close ()
110
+
111
+ // Server goroutine
112
+ go func () {
113
+ serverConn .Close ()
114
+ }()
115
+ _ , _ , err := PeekBytes (clientConn .(interface {
116
+ manet.Conn
117
+ syscall.Conn
118
+ }))
119
+ assert .ErrorIs (t , err , io .ErrUnexpectedEOF )
120
+ }
121
+
122
+ func TestHandle1ByteAndClose (t * testing.T ) {
123
+ serverConn , clientConn := spawnServerAndClientConn (t )
124
+ defer clientConn .Close ()
125
+
126
+ // Server goroutine
127
+ go func () {
128
+ defer serverConn .Close ()
129
+ _ , err := serverConn .Write ([]byte ("h" ))
130
+ assert .NoError (t , err )
131
+ }()
132
+ _ , _ , err := PeekBytes (clientConn .(interface {
133
+ manet.Conn
134
+ syscall.Conn
135
+ }))
136
+ assert .ErrorIs (t , err , io .ErrUnexpectedEOF )
137
+ }
138
+
139
+ func TestSlowBytes (t * testing.T ) {
140
+ serverConn , clientConn := spawnServerAndClientConn (t )
141
+
142
+ interval := 100 * time .Millisecond
143
+
144
+ // Server goroutine
145
+ go func () {
146
+ defer serverConn .Close ()
147
+
148
+ time .Sleep (interval )
149
+ _ , err := serverConn .Write ([]byte ("h" ))
150
+ assert .NoError (t , err )
151
+ time .Sleep (interval )
152
+ _ , err = serverConn .Write ([]byte ("e" ))
153
+ assert .NoError (t , err )
154
+ time .Sleep (interval )
155
+ _ , err = serverConn .Write ([]byte ("l" ))
156
+ assert .NoError (t , err )
157
+ time .Sleep (interval )
158
+ _ , err = serverConn .Write ([]byte ("lo" ))
159
+ assert .NoError (t , err )
160
+ }()
161
+
162
+ defer clientConn .Close ()
163
+
164
+ err := clientConn .SetReadDeadline (time .Now ().Add (interval * 10 ))
165
+ require .NoError (t , err )
166
+
167
+ peeked , clientConn , err := PeekBytes (clientConn .(interface {
168
+ manet.Conn
169
+ syscall.Conn
170
+ }))
171
+ assert .NoError (t , err )
172
+ assert .Equal (t , "hel" , string (peeked [:]))
173
+
174
+ buf := make ([]byte , 5 )
175
+ _ , err = io .ReadFull (clientConn , buf )
176
+ assert .NoError (t , err )
177
+ assert .Equal (t , "hello" , string (buf ))
178
+ }
0 commit comments