mirror of
https://github.com/facebookincubator/mvfst.git
synced 2025-08-06 22:22:38 +03:00
New QuicSocket API to unregister stream WriteCallback
Summary: Currnetly there isn't a way for apps to unregister a pending WriteCallbacks for a stream. resetStream() does that if the transport isn't in Closed state. This diff adds such support even if transport is already in Closed state. This solves the problem where app has a class that's both stream ReadCallback and stream WriteCallback and readError would kill the callback object itself. The new API gives such class a chance to remove itself from the transport. Reviewed By: mjoras Differential Revision: D20545067 fbshipit-source-id: 81d9f025310769aadef062711a49adc47a0639d0
This commit is contained in:
committed by
Facebook GitHub Bot
parent
02fc64bf68
commit
fc41c9964f
@@ -2517,5 +2517,39 @@ TEST_F(QuicTransportImplTest, FailedPing) {
|
||||
EXPECT_EQ(conn->pendingEvents.cancelPingTimeout, false);
|
||||
}
|
||||
|
||||
TEST_F(QuicTransportImplTest, StreamWriteCallbackUnregister) {
|
||||
auto stream = transport->createBidirectionalStream().value();
|
||||
// Unset before set
|
||||
EXPECT_FALSE(transport->unregisterStreamWriteCallback(stream));
|
||||
|
||||
// Set
|
||||
auto wcb = std::make_unique<MockWriteCallback>();
|
||||
EXPECT_CALL(*wcb, onStreamWriteReady(stream, _)).Times(1);
|
||||
auto result = transport->notifyPendingWriteOnStream(stream, wcb.get());
|
||||
EXPECT_TRUE(result);
|
||||
evb->loopOnce();
|
||||
|
||||
// Set then unset
|
||||
EXPECT_CALL(*wcb, onStreamWriteReady(stream, _)).Times(0);
|
||||
result = transport->notifyPendingWriteOnStream(stream, wcb.get());
|
||||
EXPECT_TRUE(result);
|
||||
EXPECT_TRUE(transport->unregisterStreamWriteCallback(stream));
|
||||
evb->loopOnce();
|
||||
|
||||
// Set, close, unset
|
||||
result = transport->notifyPendingWriteOnStream(stream, wcb.get());
|
||||
EXPECT_TRUE(result);
|
||||
MockReadCallback rcb;
|
||||
transport->setReadCallback(stream, &rcb);
|
||||
// ReadCallback kills WriteCallback
|
||||
EXPECT_CALL(rcb, readError(stream, _))
|
||||
.WillOnce(Invoke([&](StreamId stream, auto) {
|
||||
EXPECT_TRUE(transport->unregisterStreamWriteCallback(stream));
|
||||
wcb.reset();
|
||||
}));
|
||||
transport->close(folly::none);
|
||||
evb->loopOnce();
|
||||
}
|
||||
|
||||
} // namespace test
|
||||
} // namespace quic
|
||||
|
Reference in New Issue
Block a user