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