
Parsing simulcast according to: https://tools.ietf.org/html/draft-ietf-mmusic-sdp-simulcast-13#section-5.1 Created SdpSerializer for making serialized components more testable. Simulcast functionality is still not accessible to users. Bug: webrtc:10055 Change-Id: Ia6e4cef756cb954521dd19e22911f8eb6498880e Reviewed-on: https://webrtc-review.googlesource.com/c/112160 Commit-Queue: Amit Hilbuch <amithi@webrtc.org> Reviewed-by: Seth Hampson <shampson@webrtc.org> Reviewed-by: Steve Anton <steveanton@webrtc.org> Cr-Commit-Position: refs/heads/master@{#25883}
236 lines
9.6 KiB
C++
236 lines
9.6 KiB
C++
/*
|
|
* Copyright 2018 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "pc/sdpserializer.h"
|
|
#include "rtc_base/gunit.h"
|
|
|
|
using ::testing::ValuesIn;
|
|
using cricket::SimulcastDescription;
|
|
using cricket::SimulcastLayer;
|
|
using cricket::SimulcastLayerList;
|
|
|
|
namespace webrtc {
|
|
|
|
class SdpSerializerTest : public ::testing::TestWithParam<const char*> {
|
|
public:
|
|
// Runs a test for deserializing Simulcast.
|
|
// |str| - The serialized Simulcast to parse.
|
|
// |expected| - The expected output Simulcast to compare to.
|
|
void TestSimulcastDeserialization(
|
|
const std::string& str,
|
|
const SimulcastDescription& expected) const {
|
|
SdpSerializer deserializer;
|
|
auto result = deserializer.DeserializeSimulcastDescription(str);
|
|
EXPECT_TRUE(result.ok());
|
|
ExpectEqual(expected, result.value());
|
|
}
|
|
|
|
// Runs a test for serializing Simulcast.
|
|
// |simulcast| - The Simulcast to serialize.
|
|
// |expected| - The expected output string to compare to.
|
|
void TestSimulcastSerialization(const SimulcastDescription& simulcast,
|
|
const std::string& expected) const {
|
|
SdpSerializer serializer;
|
|
auto result = serializer.SerializeSimulcastDescription(simulcast);
|
|
EXPECT_EQ(expected, result);
|
|
}
|
|
|
|
// Checks that the two vectors of SimulcastLayer objects are equal.
|
|
void ExpectEqual(const std::vector<SimulcastLayer>& expected,
|
|
const std::vector<SimulcastLayer>& actual) const {
|
|
EXPECT_EQ(expected.size(), actual.size());
|
|
for (size_t i = 0; i < expected.size(); i++) {
|
|
EXPECT_EQ(expected[i].rid, actual[i].rid);
|
|
EXPECT_EQ(expected[i].is_paused, actual[i].is_paused);
|
|
}
|
|
}
|
|
|
|
// Checks that the two SimulcastLayerLists are equal.
|
|
void ExpectEqual(const SimulcastLayerList& expected,
|
|
const SimulcastLayerList& actual) const {
|
|
EXPECT_EQ(expected.size(), actual.size());
|
|
for (size_t i = 0; i < expected.size(); i++) {
|
|
ExpectEqual(expected[i], actual[i]);
|
|
}
|
|
}
|
|
|
|
// Checks that the two SimulcastDescriptions are equal.
|
|
void ExpectEqual(const SimulcastDescription& expected,
|
|
const SimulcastDescription& actual) const {
|
|
ExpectEqual(expected.send_layers(), actual.send_layers());
|
|
ExpectEqual(expected.receive_layers(), actual.receive_layers());
|
|
}
|
|
};
|
|
|
|
// Test Cases
|
|
|
|
// Test simple deserialization with no alternative streams.
|
|
TEST_F(SdpSerializerTest, DeserializeSimulcast_SimpleCaseNoAlternatives) {
|
|
std::string simulcast_str = "send 1;2 recv 3;4";
|
|
SimulcastDescription expected;
|
|
expected.send_layers().AddLayer(SimulcastLayer("1", false));
|
|
expected.send_layers().AddLayer(SimulcastLayer("2", false));
|
|
expected.receive_layers().AddLayer(SimulcastLayer("3", false));
|
|
expected.receive_layers().AddLayer(SimulcastLayer("4", false));
|
|
TestSimulcastDeserialization(simulcast_str, expected);
|
|
}
|
|
|
|
// Test simulcast deserialization with alternative streams.
|
|
TEST_F(SdpSerializerTest, DeserializeSimulcast_SimpleCaseWithAlternatives) {
|
|
std::string simulcast_str = "send 1,5;2,6 recv 3,7;4,8";
|
|
SimulcastDescription expected;
|
|
expected.send_layers().AddLayerWithAlternatives(
|
|
{SimulcastLayer("1", false), SimulcastLayer("5", false)});
|
|
expected.send_layers().AddLayerWithAlternatives(
|
|
{SimulcastLayer("2", false), SimulcastLayer("6", false)});
|
|
expected.receive_layers().AddLayerWithAlternatives(
|
|
{SimulcastLayer("3", false), SimulcastLayer("7", false)});
|
|
expected.receive_layers().AddLayerWithAlternatives(
|
|
{SimulcastLayer("4", false), SimulcastLayer("8", false)});
|
|
TestSimulcastDeserialization(simulcast_str, expected);
|
|
}
|
|
|
|
// Test simulcast deserialization when only some streams have alternatives.
|
|
TEST_F(SdpSerializerTest, DeserializeSimulcast_WithSomeAlternatives) {
|
|
std::string simulcast_str = "send 1;2,6 recv 3,7;4";
|
|
SimulcastDescription expected;
|
|
expected.send_layers().AddLayer(SimulcastLayer("1", false));
|
|
expected.send_layers().AddLayerWithAlternatives(
|
|
{SimulcastLayer("2", false), SimulcastLayer("6", false)});
|
|
expected.receive_layers().AddLayerWithAlternatives(
|
|
{SimulcastLayer("3", false), SimulcastLayer("7", false)});
|
|
expected.receive_layers().AddLayer(SimulcastLayer("4", false));
|
|
TestSimulcastDeserialization(simulcast_str, expected);
|
|
}
|
|
|
|
// Test simulcast deserialization when only send streams are specified.
|
|
TEST_F(SdpSerializerTest, DeserializeSimulcast_OnlySendStreams) {
|
|
std::string simulcast_str = "send 1;2,6;3,7;4";
|
|
SimulcastDescription expected;
|
|
expected.send_layers().AddLayer(SimulcastLayer("1", false));
|
|
expected.send_layers().AddLayerWithAlternatives(
|
|
{SimulcastLayer("2", false), SimulcastLayer("6", false)});
|
|
expected.send_layers().AddLayerWithAlternatives(
|
|
{SimulcastLayer("3", false), SimulcastLayer("7", false)});
|
|
expected.send_layers().AddLayer(SimulcastLayer("4", false));
|
|
TestSimulcastDeserialization(simulcast_str, expected);
|
|
}
|
|
|
|
// Test simulcast deserialization when only receive streams are specified.
|
|
TEST_F(SdpSerializerTest, DeserializeSimulcast_OnlyReceiveStreams) {
|
|
std::string simulcast_str = "recv 1;2,6;3,7;4";
|
|
SimulcastDescription expected;
|
|
expected.receive_layers().AddLayer(SimulcastLayer("1", false));
|
|
expected.receive_layers().AddLayerWithAlternatives(
|
|
{SimulcastLayer("2", false), SimulcastLayer("6", false)});
|
|
expected.receive_layers().AddLayerWithAlternatives(
|
|
{SimulcastLayer("3", false), SimulcastLayer("7", false)});
|
|
expected.receive_layers().AddLayer(SimulcastLayer("4", false));
|
|
TestSimulcastDeserialization(simulcast_str, expected);
|
|
}
|
|
|
|
// Test simulcast deserialization with receive streams before send streams.
|
|
TEST_F(SdpSerializerTest, DeserializeSimulcast_SendReceiveReversed) {
|
|
std::string simulcast_str = "recv 1;2,6 send 3,7;4";
|
|
SimulcastDescription expected;
|
|
expected.receive_layers().AddLayer(SimulcastLayer("1", false));
|
|
expected.receive_layers().AddLayerWithAlternatives(
|
|
{SimulcastLayer("2", false), SimulcastLayer("6", false)});
|
|
expected.send_layers().AddLayerWithAlternatives(
|
|
{SimulcastLayer("3", false), SimulcastLayer("7", false)});
|
|
expected.send_layers().AddLayer(SimulcastLayer("4", false));
|
|
TestSimulcastDeserialization(simulcast_str, expected);
|
|
}
|
|
|
|
// Test simulcast deserialization with some streams set to paused state.
|
|
TEST_F(SdpSerializerTest, DeserializeSimulcast_PausedStreams) {
|
|
std::string simulcast_str = "recv 1;~2,6 send 3,7;~4";
|
|
SimulcastDescription expected;
|
|
expected.receive_layers().AddLayer(SimulcastLayer("1", false));
|
|
expected.receive_layers().AddLayerWithAlternatives(
|
|
{SimulcastLayer("2", true), SimulcastLayer("6", false)});
|
|
expected.send_layers().AddLayerWithAlternatives(
|
|
{SimulcastLayer("3", false), SimulcastLayer("7", false)});
|
|
expected.send_layers().AddLayer(SimulcastLayer("4", true));
|
|
TestSimulcastDeserialization(simulcast_str, expected);
|
|
}
|
|
|
|
// Parameterized negative test case for deserialization with invalid inputs.
|
|
TEST_P(SdpSerializerTest, SimulcastDeserializationFailed) {
|
|
SdpSerializer deserializer;
|
|
auto result = deserializer.DeserializeSimulcastDescription(GetParam());
|
|
EXPECT_FALSE(result.ok());
|
|
}
|
|
|
|
// The malformed Simulcast inputs to use in the negative test case.
|
|
const char* kSimulcastMalformedStrings[] = {
|
|
"send ",
|
|
"recv ",
|
|
"recv 1 send",
|
|
"receive 1",
|
|
"recv 1;~2,6 recv 3,7;~4",
|
|
"send 1;~2,6 send 3,7;~4",
|
|
"send ~;~2,6",
|
|
"send 1; ;~2,6",
|
|
"send 1,;~2,6",
|
|
"recv 1 send 2 3",
|
|
"",
|
|
};
|
|
|
|
INSTANTIATE_TEST_CASE_P(SimulcastDeserializationErrors,
|
|
SdpSerializerTest,
|
|
ValuesIn(kSimulcastMalformedStrings));
|
|
|
|
// Test a simple serialization scenario.
|
|
TEST_F(SdpSerializerTest, SerializeSimulcast_SimpleCase) {
|
|
SimulcastDescription simulcast;
|
|
simulcast.send_layers().AddLayer(SimulcastLayer("1", false));
|
|
simulcast.receive_layers().AddLayer(SimulcastLayer("2", false));
|
|
TestSimulcastSerialization(simulcast, "send 1 recv 2");
|
|
}
|
|
|
|
// Test serialization with only send streams.
|
|
TEST_F(SdpSerializerTest, SerializeSimulcast_OnlySend) {
|
|
SimulcastDescription simulcast;
|
|
simulcast.send_layers().AddLayer(SimulcastLayer("1", false));
|
|
simulcast.send_layers().AddLayer(SimulcastLayer("2", false));
|
|
TestSimulcastSerialization(simulcast, "send 1;2");
|
|
}
|
|
|
|
// Test serialization with only receive streams
|
|
TEST_F(SdpSerializerTest, SerializeSimulcast_OnlyReceive) {
|
|
SimulcastDescription simulcast;
|
|
simulcast.receive_layers().AddLayer(SimulcastLayer("1", false));
|
|
simulcast.receive_layers().AddLayer(SimulcastLayer("2", false));
|
|
TestSimulcastSerialization(simulcast, "recv 1;2");
|
|
}
|
|
|
|
// Test a complex serialization with multiple streams, alternatives and states.
|
|
TEST_F(SdpSerializerTest, SerializeSimulcast_ComplexSerialization) {
|
|
SimulcastDescription simulcast;
|
|
simulcast.send_layers().AddLayerWithAlternatives(
|
|
{SimulcastLayer("2", false), SimulcastLayer("1", true)});
|
|
simulcast.send_layers().AddLayerWithAlternatives(
|
|
{SimulcastLayer("4", false), SimulcastLayer("3", false)});
|
|
|
|
simulcast.receive_layers().AddLayerWithAlternatives(
|
|
{SimulcastLayer("6", false), SimulcastLayer("7", false)});
|
|
simulcast.receive_layers().AddLayer(SimulcastLayer("8", true));
|
|
simulcast.receive_layers().AddLayerWithAlternatives(
|
|
{SimulcastLayer("9", false), SimulcastLayer("10", true),
|
|
SimulcastLayer("11", false)});
|
|
TestSimulcastSerialization(simulcast, "send 2,~1;4,3 recv 6,7;~8;9,~10,11");
|
|
}
|
|
|
|
} // namespace webrtc
|