Implement max-channels for SCTP datachannels.
This involves catching another callback from usrsctp. It also moves the definition of "connected" a little later in the sequence: From "ready to send data" to the reception of the SCTP_COMM_UP event. Bug: chromium:943976 Change-Id: Ib9e1b17d0cc356f19cdfa675159b29bf1efdcb55 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/137435 Commit-Queue: Harald Alvestrand <hta@webrtc.org> Reviewed-by: Henrik Boström <hbos@webrtc.org> Reviewed-by: Steve Anton <steveanton@webrtc.org> Cr-Commit-Position: refs/heads/master@{#28004}
This commit is contained in:

committed by
Commit Bot

parent
8abcf83b4f
commit
97716c0132
@ -21,6 +21,7 @@
|
||||
#include "test/gtest.h"
|
||||
|
||||
constexpr int kDefaultTimeout = 1000; // milliseconds
|
||||
constexpr int kTestMaxSctpStreams = 1234;
|
||||
|
||||
using cricket::FakeDtlsTransport;
|
||||
using ::testing::ElementsAre;
|
||||
@ -45,9 +46,19 @@ class FakeCricketSctpTransport : public cricket::SctpTransportInternal {
|
||||
bool ReadyToSendData() override { return true; }
|
||||
void set_debug_name_for_testing(const char* debug_name) override {}
|
||||
int max_message_size() const override { return 0; }
|
||||
absl::optional<int> max_outbound_streams() const override {
|
||||
return max_outbound_streams_;
|
||||
}
|
||||
absl::optional<int> max_inbound_streams() const override {
|
||||
return max_inbound_streams_;
|
||||
}
|
||||
// Methods exposed for testing
|
||||
void SendSignalReadyToSendData() { SignalReadyToSendData(); }
|
||||
|
||||
void SendSignalAssociationChangeCommunicationUp() {
|
||||
SignalAssociationChangeCommunicationUp();
|
||||
}
|
||||
|
||||
void SendSignalClosingProcedureStartedRemotely() {
|
||||
SignalClosingProcedureStartedRemotely(1);
|
||||
}
|
||||
@ -55,13 +66,24 @@ class FakeCricketSctpTransport : public cricket::SctpTransportInternal {
|
||||
void SendSignalClosingProcedureComplete() {
|
||||
SignalClosingProcedureComplete(1);
|
||||
}
|
||||
void set_max_outbound_streams(int streams) {
|
||||
max_outbound_streams_ = streams;
|
||||
}
|
||||
void set_max_inbound_streams(int streams) { max_inbound_streams_ = streams; }
|
||||
|
||||
private:
|
||||
absl::optional<int> max_outbound_streams_;
|
||||
absl::optional<int> max_inbound_streams_;
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
class TestSctpTransportObserver : public SctpTransportObserverInterface {
|
||||
public:
|
||||
TestSctpTransportObserver() : info_(SctpTransportState::kNew) {}
|
||||
|
||||
void OnStateChange(SctpTransportInformation info) override {
|
||||
info_ = info;
|
||||
states_.push_back(info.state());
|
||||
}
|
||||
|
||||
@ -75,8 +97,11 @@ class TestSctpTransportObserver : public SctpTransportObserverInterface {
|
||||
|
||||
const std::vector<SctpTransportState>& States() { return states_; }
|
||||
|
||||
const SctpTransportInformation LastReceivedInformation() { return info_; }
|
||||
|
||||
private:
|
||||
std::vector<SctpTransportState> states_;
|
||||
SctpTransportInformation info_;
|
||||
};
|
||||
|
||||
class SctpTransportTest : public ::testing::Test {
|
||||
@ -102,6 +127,11 @@ class SctpTransportTest : public ::testing::Test {
|
||||
|
||||
void CompleteSctpHandshake() {
|
||||
CricketSctpTransport()->SendSignalReadyToSendData();
|
||||
// The computed MaxChannels shall be the minimum of the outgoing
|
||||
// and incoming # of streams.
|
||||
CricketSctpTransport()->set_max_outbound_streams(kTestMaxSctpStreams);
|
||||
CricketSctpTransport()->set_max_inbound_streams(kTestMaxSctpStreams + 1);
|
||||
CricketSctpTransport()->SendSignalAssociationChangeCommunicationUp();
|
||||
}
|
||||
|
||||
FakeCricketSctpTransport* CricketSctpTransport() {
|
||||
@ -149,4 +179,20 @@ TEST_F(SctpTransportTest, CloseWhenClearing) {
|
||||
kDefaultTimeout);
|
||||
}
|
||||
|
||||
TEST_F(SctpTransportTest, MaxChannelsSignalled) {
|
||||
CreateTransport();
|
||||
transport()->RegisterObserver(observer());
|
||||
AddDtlsTransport();
|
||||
EXPECT_FALSE(transport()->Information().MaxChannels());
|
||||
EXPECT_FALSE(observer_.LastReceivedInformation().MaxChannels());
|
||||
CompleteSctpHandshake();
|
||||
ASSERT_EQ_WAIT(SctpTransportState::kConnected, observer_.State(),
|
||||
kDefaultTimeout);
|
||||
EXPECT_TRUE(transport()->Information().MaxChannels());
|
||||
EXPECT_EQ(kTestMaxSctpStreams, *(transport()->Information().MaxChannels()));
|
||||
EXPECT_TRUE(observer_.LastReceivedInformation().MaxChannels());
|
||||
EXPECT_EQ(kTestMaxSctpStreams,
|
||||
*(observer_.LastReceivedInformation().MaxChannels()));
|
||||
}
|
||||
|
||||
} // namespace webrtc
|
||||
|
Reference in New Issue
Block a user