@@ -1622,3 +1622,87 @@ func testSendFailedBidiStreaming(t *testing.T) {
16221622
16231623 wg .Wait ()
16241624}
1625+
1626+ func Test_handlerReturnCauseCascadedCancel (t * testing.T ) {
1627+ cliStA , srvStA := initTestStreams (t , context .Background (), "BidiStreaming" , "ClientA" , "ServerA" )
1628+ cliStB , srvStB := initTestStreams (t , srvStA .ctx , "BidiStreaming" , "ServerA-AsClient" , "ServerB" )
1629+
1630+ var wg sync.WaitGroup
1631+ wg .Add (3 )
1632+
1633+ go func () {
1634+ defer wg .Done ()
1635+ req := new (testRequest )
1636+ req .A = 1
1637+ req .B = "hello"
1638+ sErr := cliStA .SendMsg (cliStA .ctx , req )
1639+ test .Assert (t , sErr == nil , sErr )
1640+ }()
1641+
1642+ go func () {
1643+ defer wg .Done ()
1644+ req := new (testRequest )
1645+ rErr := srvStA .RecvMsg (srvStA .ctx , req )
1646+ test .Assert (t , rErr == nil , rErr )
1647+ test .Assert (t , req .A == 1 )
1648+ test .Assert (t , req .B == "hello" )
1649+
1650+ downReq := new (testRequest )
1651+ downReq .A = 2
1652+ downReq .B = "world"
1653+ sErr := cliStB .SendMsg (srvStA .ctx , downReq )
1654+ test .Assert (t , sErr == nil , sErr )
1655+
1656+ // mock handler returning
1657+ time .Sleep (50 * time .Millisecond )
1658+ err := srvStA .CloseSend (nil )
1659+ test .Assert (t , err == nil , err )
1660+
1661+ resp := new (testResponse )
1662+ resp .A = 3
1663+ sErr = srvStA .SendMsg (srvStA .ctx , resp )
1664+ test .Assert (t , sErr != nil , sErr )
1665+ test .Assert (t , errors .Is (sErr , errBizHandlerReturnCancel ), sErr )
1666+ sEx := sErr .(* Exception )
1667+ test .Assert (t , sEx .side == serverSide , sEx )
1668+ t .Logf ("server-side stream A Send err: %v" , sErr )
1669+
1670+ newReq := new (testRequest )
1671+ rErr = srvStA .RecvMsg (srvStA .ctx , newReq )
1672+ test .Assert (t , rErr != nil , rErr )
1673+ test .Assert (t , errors .Is (rErr , errBizHandlerReturnCancel ), rErr )
1674+ rEx := rErr .(* Exception )
1675+ test .Assert (t , rEx .side == serverSide , rEx )
1676+ t .Logf ("server-side stream A Recv err: %v" , rErr )
1677+ }()
1678+
1679+ go func () {
1680+ defer wg .Done ()
1681+ req := new (testRequest )
1682+ rErr := srvStB .RecvMsg (srvStB .ctx , req )
1683+ test .Assert (t , rErr == nil , rErr )
1684+ test .Assert (t , req .A == 2 )
1685+ test .Assert (t , req .B == "world" )
1686+
1687+ time .Sleep (100 * time .Millisecond )
1688+
1689+ downReq := new (testRequest )
1690+ downReq .A = 4
1691+ sErr := cliStB .SendMsg (srvStA .ctx , downReq )
1692+ test .Assert (t , sErr != nil , sErr )
1693+ test .Assert (t , errors .Is (sErr , errBizHandlerReturnCancel ), sErr )
1694+ sEx := sErr .(* Exception )
1695+ test .Assert (t , sEx .side == clientSide , sEx )
1696+ t .Logf ("client-side stream B Send err: %v" , sErr )
1697+
1698+ resp := new (testResponse )
1699+ rErr = cliStB .RecvMsg (srvStA .ctx , resp )
1700+ test .Assert (t , rErr != nil , rErr )
1701+ test .Assert (t , errors .Is (rErr , errBizHandlerReturnCancel ), rErr )
1702+ rEx := rErr .(* Exception )
1703+ test .Assert (t , rEx .side == clientSide , rEx )
1704+ t .Logf ("client-side stream B Recv err: %v" , rErr )
1705+ }()
1706+
1707+ wg .Wait ()
1708+ }
0 commit comments