mirror of
https://github.com/facebookincubator/mvfst.git
synced 2025-08-08 09:42:06 +03:00
ConnectionCallback functions when local openable streams become available
Summary: Callbacks notifying that max stream limit has been increased and new streams can be created. This get triggered every time limit gets bumped, doesn't track if limit was previously exhausted or not. Reviewed By: mjoras Differential Revision: D22339814 fbshipit-source-id: 6bcd0b52adb61e1ac440d11559dc8544ad7aa1ac
This commit is contained in:
committed by
Facebook GitHub Bot
parent
9fe4407834
commit
311a408958
@@ -33,7 +33,8 @@ enum class TestFrameType : uint8_t {
|
||||
STREAM,
|
||||
CRYPTO,
|
||||
EXPIRED_DATA,
|
||||
REJECTED_DATA
|
||||
REJECTED_DATA,
|
||||
MAX_STREAMS
|
||||
};
|
||||
|
||||
// A made up encoding decoding of a stream.
|
||||
@@ -84,6 +85,16 @@ Buf encodeMinStreamDataFrame(const MinStreamDataFrame& frame) {
|
||||
return buf;
|
||||
}
|
||||
|
||||
// A made up encoding of a MaxStreamsFrame.
|
||||
Buf encodeMaxStreamsFrame(const MaxStreamsFrame& frame) {
|
||||
auto buf = IOBuf::create(25);
|
||||
folly::io::Appender appender(buf.get(), 25);
|
||||
appender.writeBE(static_cast<uint8_t>(TestFrameType::MAX_STREAMS));
|
||||
appender.writeBE<uint8_t>(frame.isForBidirectionalStream() ? 1 : 0);
|
||||
appender.writeBE<uint64_t>(frame.maxStreams);
|
||||
return buf;
|
||||
}
|
||||
|
||||
std::pair<Buf, uint64_t> decodeDataBuffer(folly::io::Cursor& cursor) {
|
||||
Buf outData;
|
||||
auto len = cursor.readBE<uint32_t>();
|
||||
@@ -122,6 +133,12 @@ MinStreamDataFrame decodeMinStreamDataFrame(folly::io::Cursor& cursor) {
|
||||
return frame;
|
||||
}
|
||||
|
||||
MaxStreamsFrame decodeMaxStreamsFrame(folly::io::Cursor& cursor) {
|
||||
bool isBidi = cursor.readBE<uint8_t>();
|
||||
auto maxStreams = cursor.readBE<uint64_t>();
|
||||
return MaxStreamsFrame(maxStreams, isBidi);
|
||||
}
|
||||
|
||||
class TestPingCallback : public QuicSocket::PingCallback {
|
||||
public:
|
||||
void pingAcknowledged() noexcept override {}
|
||||
@@ -194,6 +211,15 @@ class TestQuicTransport
|
||||
}
|
||||
onRecvMinStreamDataFrame(stream, minDataFrame, packetNum_);
|
||||
packetNum_++;
|
||||
} else if (type == TestFrameType::MAX_STREAMS) {
|
||||
auto maxStreamsFrame = decodeMaxStreamsFrame(cursor);
|
||||
if (maxStreamsFrame.isForBidirectionalStream()) {
|
||||
conn_->streamManager->setMaxLocalBidirectionalStreams(
|
||||
maxStreamsFrame.maxStreams);
|
||||
} else {
|
||||
conn_->streamManager->setMaxLocalUnidirectionalStreams(
|
||||
maxStreamsFrame.maxStreams);
|
||||
}
|
||||
} else {
|
||||
auto buffer = decodeStreamBuffer(cursor);
|
||||
QuicStreamState* stream = conn_->streamManager->getStream(buffer.first);
|
||||
@@ -304,6 +330,12 @@ class TestQuicTransport
|
||||
onNetworkData(addr, NetworkData(std::move(buf), Clock::now()));
|
||||
}
|
||||
|
||||
void addMaxStreamsFrame(MaxStreamsFrame frame) {
|
||||
auto buf = encodeMaxStreamsFrame(frame);
|
||||
SocketAddress addr("127.0.0.1", 1000);
|
||||
onNetworkData(addr, NetworkData(std::move(buf), Clock::now()));
|
||||
}
|
||||
|
||||
void addStreamReadError(StreamId id, QuicErrorCode ex) {
|
||||
QuicStreamState* stream = conn_->streamManager->getStream(id);
|
||||
stream->streamReadError = ex;
|
||||
@@ -1023,6 +1055,74 @@ TEST_F(QuicTransportImplTest, CreateStreamLimitsUnidirectionalFew) {
|
||||
transport.reset();
|
||||
}
|
||||
|
||||
TEST_F(QuicTransportImplTest, onBidiStreamsAvailableCallback) {
|
||||
transport->transportConn->streamManager->setMaxLocalBidirectionalStreams(
|
||||
0, /*force=*/true);
|
||||
|
||||
EXPECT_CALL(connCallback, onBidirectionalStreamsAvailable(_))
|
||||
.WillOnce(Invoke([](uint64_t numAvailableStreams) {
|
||||
EXPECT_EQ(numAvailableStreams, 1);
|
||||
}));
|
||||
transport->addMaxStreamsFrame(MaxStreamsFrame(1, /*isBidirectionalIn=*/true));
|
||||
EXPECT_EQ(transport->getNumOpenableBidirectionalStreams(), 1);
|
||||
|
||||
// same value max streams frame doesn't trigger callback
|
||||
transport->addMaxStreamsFrame(MaxStreamsFrame(1, /*isBidirectionalIn=*/true));
|
||||
}
|
||||
|
||||
TEST_F(QuicTransportImplTest, onBidiStreamsAvailableCallbackAfterExausted) {
|
||||
transport->transportConn->streamManager->setMaxLocalBidirectionalStreams(
|
||||
0, /*force=*/true);
|
||||
|
||||
EXPECT_CALL(connCallback, onBidirectionalStreamsAvailable(_)).Times(2);
|
||||
transport->addMaxStreamsFrame(MaxStreamsFrame(
|
||||
1,
|
||||
/*isBidirectionalIn=*/true));
|
||||
EXPECT_EQ(transport->getNumOpenableBidirectionalStreams(), 1);
|
||||
|
||||
auto result = transport->createBidirectionalStream();
|
||||
EXPECT_TRUE(result);
|
||||
EXPECT_EQ(transport->getNumOpenableBidirectionalStreams(), 0);
|
||||
|
||||
transport->addMaxStreamsFrame(MaxStreamsFrame(
|
||||
2,
|
||||
/*isBidirectionalIn=*/true));
|
||||
}
|
||||
|
||||
TEST_F(QuicTransportImplTest, oneUniStreamsAvailableCallback) {
|
||||
transport->transportConn->streamManager->setMaxLocalUnidirectionalStreams(
|
||||
0, /*force=*/true);
|
||||
|
||||
EXPECT_CALL(connCallback, onUnidirectionalStreamsAvailable(_))
|
||||
.WillOnce(Invoke([](uint64_t numAvailableStreams) {
|
||||
EXPECT_EQ(numAvailableStreams, 1);
|
||||
}));
|
||||
transport->addMaxStreamsFrame(
|
||||
MaxStreamsFrame(1, /*isBidirectionalIn=*/false));
|
||||
EXPECT_EQ(transport->getNumOpenableUnidirectionalStreams(), 1);
|
||||
|
||||
// same value max streams frame doesn't trigger callback
|
||||
transport->addMaxStreamsFrame(
|
||||
MaxStreamsFrame(1, /*isBidirectionalIn=*/false));
|
||||
}
|
||||
|
||||
TEST_F(QuicTransportImplTest, onUniStreamsAvailableCallbackAfterExausted) {
|
||||
transport->transportConn->streamManager->setMaxLocalUnidirectionalStreams(
|
||||
0, /*force=*/true);
|
||||
|
||||
EXPECT_CALL(connCallback, onUnidirectionalStreamsAvailable(_)).Times(2);
|
||||
transport->addMaxStreamsFrame(
|
||||
MaxStreamsFrame(1, /*isBidirectionalIn=*/false));
|
||||
EXPECT_EQ(transport->getNumOpenableUnidirectionalStreams(), 1);
|
||||
|
||||
auto result = transport->createUnidirectionalStream();
|
||||
EXPECT_TRUE(result);
|
||||
EXPECT_EQ(transport->getNumOpenableUnidirectionalStreams(), 0);
|
||||
|
||||
transport->addMaxStreamsFrame(
|
||||
MaxStreamsFrame(2, /*isBidirectionalIn=*/false));
|
||||
}
|
||||
|
||||
TEST_F(QuicTransportImplTest, ReadDataAlsoChecksLossAlarm) {
|
||||
transport->transportConn->oneRttWriteCipher = test::createNoOpAead();
|
||||
auto stream = transport->createBidirectionalStream().value();
|
||||
|
Reference in New Issue
Block a user