1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-11-25 15:43:13 +03:00

Observer stream events

Summary: Provide observers with visibility into stream events triggered by local and peer (e.g., new stream opened locally or by peer).

Reviewed By: mjoras

Differential Revision: D31886978

fbshipit-source-id: 7556fef0f336bd0f190b4474f1a7b0120aae6ef1
This commit is contained in:
Brandon Schlinker
2021-12-03 11:15:58 -08:00
committed by Facebook GitHub Bot
parent 7b40794598
commit d89e8d344e
12 changed files with 566 additions and 14 deletions

View File

@@ -8,6 +8,7 @@
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "quic/state/QuicStreamUtilities.h"
#include <quic/state/QuicStreamFunctions.h>
#include <quic/state/QuicStreamUtilities.h>
@@ -1103,6 +1104,18 @@ TEST_F(QuicStreamFunctionsTest, IsBidirectionalStream) {
EXPECT_FALSE(isBidirectionalStream(0xff));
}
TEST_F(QuicStreamFunctionsTest, GetStreamDirectionality) {
EXPECT_EQ(StreamDirectionality::Bidirectional, getStreamDirectionality(0x01));
EXPECT_EQ(StreamDirectionality::Bidirectional, getStreamDirectionality(0xf0));
EXPECT_EQ(StreamDirectionality::Bidirectional, getStreamDirectionality(0xf1));
EXPECT_EQ(
StreamDirectionality::Unidirectional, getStreamDirectionality(0x02));
EXPECT_EQ(
StreamDirectionality::Unidirectional, getStreamDirectionality(0x03));
EXPECT_EQ(
StreamDirectionality::Unidirectional, getStreamDirectionality(0xff));
}
TEST_F(QuicStreamFunctionsTest, IsSendingStream) {
QuicClientConnectionState clientState(
FizzClientQuicHandshakeContext::Builder().build());
@@ -1161,6 +1174,174 @@ TEST_F(QuicStreamFunctionsTest, IsReceivingStream) {
EXPECT_TRUE(isReceivingStream(nodeType, id));
}
TEST_F(QuicStreamFunctionsTest, GetStreamInitiatorBidirectional) {
const auto clientStream1Id =
conn.streamManager->createNextBidirectionalStream().value()->id;
EXPECT_EQ(conn.streamManager->streamCount(), 1);
const auto clientStream2Id =
conn.streamManager->createNextBidirectionalStream().value()->id;
EXPECT_EQ(conn.streamManager->streamCount(), 2);
EXPECT_EQ(clientStream1Id, 0x00);
EXPECT_EQ(clientStream2Id, 0x04);
const auto serverStream1Id =
CHECK_NOTNULL(conn.streamManager->getStream(clientStream1Id + 1))->id;
const auto serverStream2Id =
CHECK_NOTNULL(conn.streamManager->getStream(clientStream2Id + 1))->id;
EXPECT_EQ(
StreamDirectionality::Bidirectional,
getStreamDirectionality(clientStream1Id));
EXPECT_EQ(
StreamDirectionality::Bidirectional,
getStreamDirectionality(clientStream2Id));
EXPECT_EQ(
StreamDirectionality::Bidirectional,
getStreamDirectionality(serverStream1Id));
EXPECT_EQ(
StreamDirectionality::Bidirectional,
getStreamDirectionality(serverStream2Id));
EXPECT_EQ(
StreamInitiator::Local,
getStreamInitiator(conn.nodeType, clientStream1Id));
EXPECT_EQ(
StreamInitiator::Local,
getStreamInitiator(conn.nodeType, clientStream2Id));
EXPECT_EQ(
StreamInitiator::Remote,
getStreamInitiator(conn.nodeType, serverStream1Id));
EXPECT_EQ(
StreamInitiator::Remote,
getStreamInitiator(conn.nodeType, serverStream2Id));
}
TEST_F(QuicServerStreamFunctionsTest, GetStreamInitiatorBidirectional) {
const auto serverStream1Id =
conn.streamManager->createNextBidirectionalStream().value()->id;
EXPECT_EQ(conn.streamManager->streamCount(), 1);
const auto serverStream2Id =
conn.streamManager->createNextBidirectionalStream().value()->id;
EXPECT_EQ(conn.streamManager->streamCount(), 2);
EXPECT_EQ(serverStream1Id, 0x01);
EXPECT_EQ(serverStream2Id, 0x05);
const auto clientStream1Id =
CHECK_NOTNULL(conn.streamManager->getStream(serverStream1Id - 1))->id;
const auto clientStream2Id =
CHECK_NOTNULL(conn.streamManager->getStream(serverStream2Id - 1))->id;
EXPECT_EQ(
StreamDirectionality::Bidirectional,
getStreamDirectionality(serverStream1Id));
EXPECT_EQ(
StreamDirectionality::Bidirectional,
getStreamDirectionality(serverStream2Id));
EXPECT_EQ(
StreamDirectionality::Bidirectional,
getStreamDirectionality(clientStream1Id));
EXPECT_EQ(
StreamDirectionality::Bidirectional,
getStreamDirectionality(clientStream2Id));
EXPECT_EQ(
StreamInitiator::Local,
getStreamInitiator(conn.nodeType, serverStream1Id));
EXPECT_EQ(
StreamInitiator::Local,
getStreamInitiator(conn.nodeType, serverStream2Id));
EXPECT_EQ(
StreamInitiator::Remote,
getStreamInitiator(conn.nodeType, clientStream1Id));
EXPECT_EQ(
StreamInitiator::Remote,
getStreamInitiator(conn.nodeType, clientStream2Id));
}
TEST_F(QuicStreamFunctionsTest, GetStreamInitiatorUnidirectional) {
const auto clientStream1Id =
conn.streamManager->createNextUnidirectionalStream().value()->id;
EXPECT_EQ(conn.streamManager->streamCount(), 1);
const auto clientStream2Id =
conn.streamManager->createNextUnidirectionalStream().value()->id;
EXPECT_EQ(conn.streamManager->streamCount(), 2);
EXPECT_EQ(clientStream1Id, 0x02);
EXPECT_EQ(clientStream2Id, 0x06);
const auto serverStream1Id =
CHECK_NOTNULL(conn.streamManager->getStream(clientStream1Id + 1))->id;
const auto serverStream2Id =
CHECK_NOTNULL(conn.streamManager->getStream(clientStream2Id + 1))->id;
EXPECT_EQ(
StreamDirectionality::Unidirectional,
getStreamDirectionality(clientStream1Id));
EXPECT_EQ(
StreamDirectionality::Unidirectional,
getStreamDirectionality(clientStream2Id));
EXPECT_EQ(
StreamDirectionality::Unidirectional,
getStreamDirectionality(serverStream1Id));
EXPECT_EQ(
StreamDirectionality::Unidirectional,
getStreamDirectionality(serverStream2Id));
EXPECT_EQ(
StreamInitiator::Local,
getStreamInitiator(conn.nodeType, clientStream1Id));
EXPECT_EQ(
StreamInitiator::Local,
getStreamInitiator(conn.nodeType, clientStream2Id));
EXPECT_EQ(
StreamInitiator::Remote,
getStreamInitiator(conn.nodeType, serverStream1Id));
EXPECT_EQ(
StreamInitiator::Remote,
getStreamInitiator(conn.nodeType, serverStream2Id));
}
TEST_F(QuicServerStreamFunctionsTest, GetStreamInitiatorUnidirectional) {
const auto serverStream1Id =
conn.streamManager->createNextUnidirectionalStream().value()->id;
EXPECT_EQ(conn.streamManager->streamCount(), 1);
const auto serverStream2Id =
conn.streamManager->createNextUnidirectionalStream().value()->id;
EXPECT_EQ(conn.streamManager->streamCount(), 2);
EXPECT_EQ(serverStream1Id, 0x03);
EXPECT_EQ(serverStream2Id, 0x07);
const auto clientStream1Id =
CHECK_NOTNULL(conn.streamManager->getStream(serverStream1Id - 1))->id;
const auto clientStream2Id =
CHECK_NOTNULL(conn.streamManager->getStream(serverStream2Id - 1))->id;
EXPECT_EQ(
StreamDirectionality::Unidirectional,
getStreamDirectionality(serverStream1Id));
EXPECT_EQ(
StreamDirectionality::Unidirectional,
getStreamDirectionality(serverStream2Id));
EXPECT_EQ(
StreamDirectionality::Unidirectional,
getStreamDirectionality(clientStream1Id));
EXPECT_EQ(
StreamDirectionality::Unidirectional,
getStreamDirectionality(clientStream2Id));
EXPECT_EQ(
StreamInitiator::Local,
getStreamInitiator(conn.nodeType, serverStream1Id));
EXPECT_EQ(
StreamInitiator::Local,
getStreamInitiator(conn.nodeType, serverStream2Id));
EXPECT_EQ(
StreamInitiator::Remote,
getStreamInitiator(conn.nodeType, clientStream1Id));
EXPECT_EQ(
StreamInitiator::Remote,
getStreamInitiator(conn.nodeType, clientStream2Id));
}
TEST_F(QuicStreamFunctionsTest, HasReadableDataNoData) {
auto stream = conn.streamManager->createNextBidirectionalStream().value();
auto buf1 = IOBuf::copyBuffer("just");