@@ -1532,6 +1532,89 @@ func TestMultiInstLoggerRace(t *testing.T) {
1532
1532
assert .ErrorIs (t , g .Wait (), errorx .ErrUnsupportedProtocol )
1533
1533
}
1534
1534
1535
+ type testDisconnectedAsyncWriteServer struct {
1536
+ BuiltinEventEngine
1537
+ tester * testing.T
1538
+ addr string
1539
+ writev , clientStarted bool
1540
+ exit atomic.Bool
1541
+ }
1542
+
1543
+ func (t * testDisconnectedAsyncWriteServer ) OnTraffic (c Conn ) Action {
1544
+ _ , err := c .Next (0 )
1545
+ require .NoErrorf (t .tester , err , "c.Next error: %v" , err )
1546
+
1547
+ go func () {
1548
+ for range time .Tick (100 * time .Millisecond ) {
1549
+ if t .exit .Load () {
1550
+ break
1551
+ }
1552
+
1553
+ if t .writev {
1554
+ err = c .AsyncWritev ([][]byte {[]byte ("hello" ), []byte ("hello" )}, func (_ Conn , err error ) error {
1555
+ if err == nil {
1556
+ return nil
1557
+ }
1558
+
1559
+ require .ErrorIsf (t .tester , err , net .ErrClosed , "expected error: %v, but got: %v" , net .ErrClosed , err )
1560
+ t .exit .Store (true )
1561
+ return nil
1562
+ })
1563
+ } else {
1564
+ err = c .AsyncWrite ([]byte ("hello" ), func (_ Conn , err error ) error {
1565
+ if err == nil {
1566
+ return nil
1567
+ }
1568
+
1569
+ require .ErrorIsf (t .tester , err , net .ErrClosed , "expected error: %v, but got: %v" , net .ErrClosed , err )
1570
+ t .exit .Store (true )
1571
+ return nil
1572
+ })
1573
+ }
1574
+
1575
+ if err != nil {
1576
+ return
1577
+ }
1578
+ }
1579
+ }()
1580
+
1581
+ return None
1582
+ }
1583
+
1584
+ func (t * testDisconnectedAsyncWriteServer ) OnTick () (delay time.Duration , action Action ) {
1585
+ delay = 500 * time .Millisecond
1586
+
1587
+ if t .exit .Load () {
1588
+ action = Shutdown
1589
+ return
1590
+ }
1591
+
1592
+ if ! t .clientStarted {
1593
+ t .clientStarted = true
1594
+ go func () {
1595
+ c , err := net .Dial ("tcp" , t .addr )
1596
+ require .NoError (t .tester , err )
1597
+ _ , err = c .Write ([]byte ("hello" ))
1598
+ require .NoError (t .tester , err )
1599
+ require .NoError (t .tester , c .Close ())
1600
+ }()
1601
+ }
1602
+ return
1603
+ }
1604
+
1605
+ func TestDisconnectedAsyncWrite (t * testing.T ) {
1606
+ t .Run ("async-write" , func (t * testing.T ) {
1607
+ events := & testDisconnectedAsyncWriteServer {tester : t , addr : ":10000" }
1608
+ err := Run (events , "tcp://:10000" , WithTicker (true ))
1609
+ assert .NoError (t , err )
1610
+ })
1611
+ t .Run ("async-writev" , func (t * testing.T ) {
1612
+ events := & testDisconnectedAsyncWriteServer {tester : t , addr : ":10001" , writev : true }
1613
+ err := Run (events , "tcp://:10001" , WithTicker (true ))
1614
+ assert .NoError (t , err )
1615
+ })
1616
+ }
1617
+
1535
1618
var errIncompletePacket = errors .New ("incomplete packet" )
1536
1619
1537
1620
type simServer struct {
0 commit comments