@@ -12,6 +12,7 @@ import (
12
12
"io"
13
13
"net"
14
14
"os"
15
+ "regexp"
15
16
"sync"
16
17
"testing"
17
18
"time"
@@ -1128,9 +1129,13 @@ func TestPool(t *testing.T) {
1128
1129
t .Run ("bgRead" , func (t * testing.T ) {
1129
1130
t .Parallel ()
1130
1131
1131
- var gotErrs [] error
1132
+ var errCh chan error
1132
1133
BGReadCallback = func (addr string , start , read time.Time , errs []error , connClosed bool ) {
1133
- gotErrs = errs
1134
+ defer close (errCh )
1135
+
1136
+ for _ , err := range errs {
1137
+ errCh <- err
1138
+ }
1134
1139
}
1135
1140
1136
1141
const sockPath = "./test.sock"
@@ -1140,6 +1145,8 @@ func TestPool(t *testing.T) {
1140
1145
setup := func (t * testing.T ) {
1141
1146
t .Helper ()
1142
1147
1148
+ errCh = make (chan error )
1149
+
1143
1150
var err error
1144
1151
socket , err = net .Listen ("unix" , sockPath )
1145
1152
noerr (t , err )
@@ -1148,30 +1155,26 @@ func TestPool(t *testing.T) {
1148
1155
t .Helper ()
1149
1156
1150
1157
os .Remove (sockPath )
1151
- gotErrs = nil
1152
1158
}
1153
1159
1154
1160
t .Run ("incomplete read of message header" , func (t * testing.T ) {
1155
1161
setup (t )
1156
1162
defer teardown (t )
1157
1163
1158
1164
wg := & sync.WaitGroup {}
1165
+ wg .Add (1 )
1159
1166
go func (t * testing.T ) {
1160
1167
t .Helper ()
1161
1168
1169
+ defer wg .Done ()
1170
+
1162
1171
conn , err := socket .Accept ()
1163
1172
noerr (t , err )
1164
- wg .Add (1 )
1165
- go func (conn net.Conn ) {
1166
- defer func () {
1167
- conn .Close ()
1168
- wg .Done ()
1169
- }()
1173
+ defer conn .Close ()
1170
1174
1171
- _ , err = conn .Write ([]byte {10 , 0 , 0 })
1172
- noerr (t , err )
1173
- time .Sleep (1500 * time .Millisecond )
1174
- }(conn )
1175
+ _ , err = conn .Write ([]byte {10 , 0 , 0 })
1176
+ noerr (t , err )
1177
+ time .Sleep (1500 * time .Millisecond )
1175
1178
}(t )
1176
1179
1177
1180
p := newPool (
@@ -1190,36 +1193,34 @@ func TestPool(t *testing.T) {
1190
1193
ctx , cancel := csot .MakeTimeoutContext (context .Background (), time .Second )
1191
1194
defer cancel ()
1192
1195
_ , err = conn .readWireMessage (ctx )
1193
- assert .ErrorContains (t , err ,
1194
- "incomplete read of message header: context deadline exceeded: read unix ->./test.sock: i/o timeout" )
1195
- err = p .checkIn (conn )
1196
- noerr (t , err )
1196
+ regex := regexp .MustCompile (
1197
+ `^connection\(.*\[-\d+\]\) incomplete read of message header: context deadline exceeded: read unix .*->\.\/test.sock: i\/o timeout$` ,
1198
+ )
1199
+ assert .True (t , regex .MatchString (err .Error ()), "mismatched err: %v" , err )
1200
+ assert .Nil (t , conn .awaitingResponse , "conn.awaitingResponse should be nil" )
1197
1201
wg .Wait ()
1198
1202
p .close (context .Background ())
1199
- assert . Len ( t , gotErrs , 0 )
1203
+ close ( errCh )
1200
1204
})
1201
1205
t .Run ("timeout on reading the message header" , func (t * testing.T ) {
1202
1206
setup (t )
1203
1207
defer teardown (t )
1204
1208
1205
1209
wg := & sync.WaitGroup {}
1210
+ wg .Add (1 )
1206
1211
go func (t * testing.T ) {
1207
1212
t .Helper ()
1208
1213
1214
+ defer wg .Done ()
1215
+
1209
1216
conn , err := socket .Accept ()
1210
1217
noerr (t , err )
1211
- wg .Add (1 )
1212
- go func (conn net.Conn ) {
1213
- defer func () {
1214
- conn .Close ()
1215
- wg .Done ()
1216
- }()
1217
-
1218
- time .Sleep (1500 * time .Millisecond )
1219
- _ , err = conn .Write ([]byte {10 , 0 , 0 , 0 , 0 , 0 , 0 , 0 })
1220
- noerr (t , err )
1221
- time .Sleep (1500 * time .Millisecond )
1222
- }(conn )
1218
+ defer conn .Close ()
1219
+
1220
+ time .Sleep (1500 * time .Millisecond )
1221
+ _ , err = conn .Write ([]byte {10 , 0 , 0 , 0 , 0 , 0 , 0 , 0 })
1222
+ noerr (t , err )
1223
+ time .Sleep (1500 * time .Millisecond )
1223
1224
}(t )
1224
1225
1225
1226
p := newPool (
@@ -1238,42 +1239,54 @@ func TestPool(t *testing.T) {
1238
1239
ctx , cancel := csot .MakeTimeoutContext (context .Background (), time .Second )
1239
1240
defer cancel ()
1240
1241
_ , err = conn .readWireMessage (ctx )
1241
- assert .ErrorContains (t , err ,
1242
- "incomplete read of message header: context deadline exceeded: read unix ->./test.sock: i/o timeout" )
1242
+ regex := regexp .MustCompile (
1243
+ `^connection\(.*\[-\d+\]\) incomplete read of message header: context deadline exceeded: read unix .*->\.\/test.sock: i\/o timeout$` ,
1244
+ )
1245
+ assert .True (t , regex .MatchString (err .Error ()), "mismatched err: %v" , err )
1243
1246
err = p .checkIn (conn )
1244
1247
noerr (t , err )
1245
1248
wg .Wait ()
1246
1249
p .close (context .Background ())
1247
- assert .Len (t , gotErrs , 1 )
1248
- for _ , err = range gotErrs {
1249
- assert .ErrorContains (t , err ,
1250
- "error reading message of 6: read unix ->./test.sock: i/o timeout" )
1250
+ errs := []* regexp.Regexp {
1251
+ regexp .MustCompile (
1252
+ `^error reading message of 6: read unix .*->\.\/test.sock: i\/o timeout$` ,
1253
+ ),
1254
+ }
1255
+ for i := 0 ; true ; i ++ {
1256
+ err , ok := <- errCh
1257
+ if ! ok {
1258
+ if i != len (errs ) {
1259
+ assert .Fail (t , "expected more errors" )
1260
+ }
1261
+ break
1262
+ } else if i < len (errs ) {
1263
+ assert .True (t , errs [i ].MatchString (err .Error ()), "mismatched err: %v" , err )
1264
+ } else {
1265
+ assert .Fail (t , "unexpected error" , "got unexpected error: %v" , err )
1266
+ }
1251
1267
}
1252
1268
})
1253
1269
t .Run ("timeout on reading the full message" , func (t * testing.T ) {
1254
1270
setup (t )
1255
1271
defer teardown (t )
1256
1272
1257
1273
wg := & sync.WaitGroup {}
1274
+ wg .Add (1 )
1258
1275
go func (t * testing.T ) {
1259
1276
t .Helper ()
1260
1277
1278
+ defer wg .Done ()
1279
+
1261
1280
conn , err := socket .Accept ()
1262
1281
noerr (t , err )
1263
- wg .Add (1 )
1264
- go func (conn net.Conn ) {
1265
- defer func () {
1266
- conn .Close ()
1267
- wg .Done ()
1268
- }()
1282
+ defer conn .Close ()
1269
1283
1270
- _ , err = conn .Write ([]byte {12 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 })
1271
- noerr (t , err )
1272
- time .Sleep (1500 * time .Millisecond )
1273
- _ , err = conn .Write ([]byte {2 , 3 , 4 })
1274
- noerr (t , err )
1275
- time .Sleep (1500 * time .Millisecond )
1276
- }(conn )
1284
+ _ , err = conn .Write ([]byte {12 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 })
1285
+ noerr (t , err )
1286
+ time .Sleep (1500 * time .Millisecond )
1287
+ _ , err = conn .Write ([]byte {2 , 3 , 4 })
1288
+ noerr (t , err )
1289
+ time .Sleep (1500 * time .Millisecond )
1277
1290
}(t )
1278
1291
1279
1292
p := newPool (
@@ -1291,19 +1304,32 @@ func TestPool(t *testing.T) {
1291
1304
1292
1305
conn , err := p .checkOut (context .Background ())
1293
1306
noerr (t , err )
1294
- ctx , cancel := csot .MakeTimeoutContext (context .Background (), time .Second )
1307
+ ctx , cancel := csot .MakeTimeoutContext (context .Background (), 1 * time .Second )
1295
1308
defer cancel ()
1296
1309
_ , err = conn .readWireMessage (ctx )
1297
- assert .ErrorContains (t , err ,
1298
- "incomplete read of full message: context deadline exceeded: read unix ->./test.sock: i/o timeout" )
1310
+ regex := regexp .MustCompile (
1311
+ `^connection\(.*\[-\d+\]\) incomplete read of full message: context deadline exceeded: read unix .*->\.\/test.sock: i\/o timeout$` ,
1312
+ )
1313
+ assert .True (t , regex .MatchString (err .Error ()), "mismatched err: %v" , err )
1299
1314
err = p .checkIn (conn )
1300
1315
noerr (t , err )
1301
1316
wg .Wait ()
1302
1317
p .close (context .Background ())
1303
- assert .Len (t , gotErrs , 1 )
1304
- for _ , err = range gotErrs {
1305
- assert .ErrorContains (t , err ,
1306
- "error reading message of 3: EOF" )
1318
+ errs := []string {
1319
+ "error reading message of 3: EOF" ,
1320
+ }
1321
+ for i := 0 ; true ; i ++ {
1322
+ err , ok := <- errCh
1323
+ if ! ok {
1324
+ if i != len (errs ) {
1325
+ assert .Fail (t , "expected more errors" )
1326
+ }
1327
+ break
1328
+ } else if i < len (errs ) {
1329
+ assert .EqualError (t , err , errs [i ], "mismatched err: %v" , err )
1330
+ } else {
1331
+ assert .Fail (t , "unexpected error" , "got unexpected error: %v" , err )
1332
+ }
1307
1333
}
1308
1334
})
1309
1335
})
0 commit comments