@@ -369,23 +369,37 @@ func testPacketConnConcurrentReadWriteUnicast(t *testing.T, p *ipv4.PacketConn,
369
369
t .Fatal (err )
370
370
}
371
371
372
+ var firstError sync.Once
373
+ fatalf := func (format string , args ... interface {}) {
374
+ // On the first error, close the PacketConn to unblock the remaining
375
+ // goroutines. Suppress any further errors, which may occur simply due to
376
+ // closing the PacketConn.
377
+ first := false
378
+ firstError .Do (func () {
379
+ first = true
380
+ p .Close ()
381
+ })
382
+ if first {
383
+ t .Helper ()
384
+ t .Errorf (format , args ... )
385
+ }
386
+ runtime .Goexit ()
387
+ }
388
+
372
389
var wg sync.WaitGroup
373
390
reader := func () {
374
391
defer wg .Done ()
375
392
b := make ([]byte , 128 )
376
393
n , cm , _ , err := p .ReadFrom (b )
377
394
if err != nil {
378
- t .Error (err )
379
- return
395
+ fatalf ("%v" , err )
380
396
}
381
397
if ! bytes .Equal (b [:n ], data ) {
382
- t .Errorf ("got %#v; want %#v" , b [:n ], data )
383
- return
398
+ fatalf ("got %#v; want %#v" , b [:n ], data )
384
399
}
385
400
s := cm .String ()
386
401
if strings .Contains (s , "," ) {
387
- t .Errorf ("should be space-separated values: %s" , s )
388
- return
402
+ fatalf ("should be space-separated values: %s" , s )
389
403
}
390
404
}
391
405
batchReader := func () {
@@ -398,37 +412,31 @@ func testPacketConnConcurrentReadWriteUnicast(t *testing.T, p *ipv4.PacketConn,
398
412
}
399
413
n , err := p .ReadBatch (ms , 0 )
400
414
if err != nil {
401
- t .Error (err )
402
- return
415
+ fatalf ("%v" , err )
403
416
}
404
417
if n != len (ms ) {
405
- t .Errorf ("got %d; want %d" , n , len (ms ))
406
- return
418
+ fatalf ("got %d; want %d" , n , len (ms ))
407
419
}
408
420
var cm ipv4.ControlMessage
409
421
if err := cm .Parse (ms [0 ].OOB [:ms [0 ].NN ]); err != nil {
410
- t .Error (err )
411
- return
422
+ fatalf ("%v" , err )
412
423
}
413
424
var b []byte
414
425
if _ , ok := dst .(* net.IPAddr ); ok {
415
426
var h ipv4.Header
416
427
if err := h .Parse (ms [0 ].Buffers [0 ][:ms [0 ].N ]); err != nil {
417
- t .Error (err )
418
- return
428
+ fatalf ("%v" , err )
419
429
}
420
430
b = ms [0 ].Buffers [0 ][h .Len :ms [0 ].N ]
421
431
} else {
422
432
b = ms [0 ].Buffers [0 ][:ms [0 ].N ]
423
433
}
424
434
if ! bytes .Equal (b , data ) {
425
- t .Errorf ("got %#v; want %#v" , b , data )
426
- return
435
+ fatalf ("got %#v; want %#v" , b , data )
427
436
}
428
437
s := cm .String ()
429
438
if strings .Contains (s , "," ) {
430
- t .Errorf ("should be space-separated values: %s" , s )
431
- return
439
+ fatalf ("should be space-separated values: %s" , s )
432
440
}
433
441
}
434
442
writer := func (toggle bool ) {
@@ -440,17 +448,14 @@ func testPacketConnConcurrentReadWriteUnicast(t *testing.T, p *ipv4.PacketConn,
440
448
cm .IfIndex = ifi .Index
441
449
}
442
450
if err := p .SetControlMessage (cf , toggle ); err != nil {
443
- t .Error (err )
444
- return
451
+ fatalf ("%v" , err )
445
452
}
446
453
n , err := p .WriteTo (data , & cm , dst )
447
454
if err != nil {
448
- t .Error (err )
449
- return
455
+ fatalf ("%v" , err )
450
456
}
451
457
if n != len (data ) {
452
- t .Errorf ("got %d; want %d" , n , len (data ))
453
- return
458
+ fatalf ("got %d; want %d" , n , len (data ))
454
459
}
455
460
}
456
461
batchWriter := func (toggle bool ) {
@@ -462,8 +467,7 @@ func testPacketConnConcurrentReadWriteUnicast(t *testing.T, p *ipv4.PacketConn,
462
467
cm .IfIndex = ifi .Index
463
468
}
464
469
if err := p .SetControlMessage (cf , toggle ); err != nil {
465
- t .Error (err )
466
- return
470
+ fatalf ("%v" , err )
467
471
}
468
472
ms := []ipv4.Message {
469
473
{
@@ -474,16 +478,13 @@ func testPacketConnConcurrentReadWriteUnicast(t *testing.T, p *ipv4.PacketConn,
474
478
}
475
479
n , err := p .WriteBatch (ms , 0 )
476
480
if err != nil {
477
- t .Error (err )
478
- return
481
+ fatalf ("%v" , err )
479
482
}
480
483
if n != len (ms ) {
481
- t .Errorf ("got %d; want %d" , n , len (ms ))
482
- return
484
+ fatalf ("got %d; want %d" , n , len (ms ))
483
485
}
484
486
if ms [0 ].N != len (data ) {
485
- t .Errorf ("got %d; want %d" , ms [0 ].N , len (data ))
486
- return
487
+ fatalf ("got %d; want %d" , ms [0 ].N , len (data ))
487
488
}
488
489
}
489
490
0 commit comments