#include "common.hpp"
#include "MediaSoupErrors.hpp"
#include "RTC/SCTP/association/NegotiatedCapabilities.hpp"
#include "RTC/SCTP/association/StateCookie.hpp"
#include "RTC/SCTP/packet/Parameter.hpp"
#include "RTC/SCTP/packet/parameters/StateCookieParameter.hpp"
#include "RTC/SCTP/sctpCommon.hpp"
#include <catch2/catch_test_macros.hpp>
#include <cstring>
SCENARIO("State Cookie Parameter (7)", "[serializable][sctp][parameter]")
{
sctpCommon::ResetBuffers();
SECTION("StateCookieParameter::Parse() succeeds")
{
alignas(4) uint8_t buffer[] =
{
0x00, 0x07, 0x00, 0x07,
0xDD, 0xCC, 0xEE, 0x00,
0xAA, 0xBB, 0xCC, 0xDD,
0xAA, 0xBB, 0xCC
};
auto* parameter = RTC::SCTP::StateCookieParameter::Parse(buffer, sizeof(buffer));
CHECK_SCTP_PARAMETER(
parameter,
buffer,
sizeof(buffer),
8,
RTC::SCTP::Parameter::ParameterType::STATE_COOKIE,
false,
RTC::SCTP::Parameter::ActionForUnknownParameterType::STOP);
REQUIRE(parameter->HasCookie() == true);
REQUIRE(parameter->GetCookieLength() == 3);
REQUIRE(parameter->GetCookie()[0] == 0xDD);
REQUIRE(parameter->GetCookie()[1] == 0xCC);
REQUIRE(parameter->GetCookie()[2] == 0xEE);
REQUIRE(parameter->GetCookie()[3] == 0x00);
parameter->Serialize(sctpCommon::SerializeBuffer, sizeof(sctpCommon::SerializeBuffer));
std::memset(buffer, 0x00, sizeof(buffer));
CHECK_SCTP_PARAMETER(
parameter,
sctpCommon::SerializeBuffer,
sizeof(sctpCommon::SerializeBuffer),
8,
RTC::SCTP::Parameter::ParameterType::STATE_COOKIE,
false,
RTC::SCTP::Parameter::ActionForUnknownParameterType::STOP);
REQUIRE(parameter->HasCookie() == true);
REQUIRE(parameter->GetCookieLength() == 3);
REQUIRE(parameter->GetCookie()[0] == 0xDD);
REQUIRE(parameter->GetCookie()[1] == 0xCC);
REQUIRE(parameter->GetCookie()[2] == 0xEE);
REQUIRE(parameter->GetCookie()[3] == 0x00);
auto* clonedParameter =
parameter->Clone(sctpCommon::CloneBuffer, sizeof(sctpCommon::CloneBuffer));
std::memset(sctpCommon::SerializeBuffer, 0x00, sizeof(sctpCommon::SerializeBuffer));
delete parameter;
CHECK_SCTP_PARAMETER(
clonedParameter,
sctpCommon::CloneBuffer,
sizeof(sctpCommon::CloneBuffer),
8,
RTC::SCTP::Parameter::ParameterType::STATE_COOKIE,
false,
RTC::SCTP::Parameter::ActionForUnknownParameterType::STOP);
REQUIRE(clonedParameter->HasCookie() == true);
REQUIRE(clonedParameter->GetCookieLength() == 3);
REQUIRE(clonedParameter->GetCookie()[0] == 0xDD);
REQUIRE(clonedParameter->GetCookie()[1] == 0xCC);
REQUIRE(clonedParameter->GetCookie()[2] == 0xEE);
REQUIRE(clonedParameter->GetCookie()[3] == 0x00);
delete clonedParameter;
}
SECTION("StateCookieParameter::Factory() succeeds (1)")
{
auto* parameter = RTC::SCTP::StateCookieParameter::Factory(
sctpCommon::FactoryBuffer, sizeof(sctpCommon::FactoryBuffer));
CHECK_SCTP_PARAMETER(
parameter,
sctpCommon::FactoryBuffer,
sizeof(sctpCommon::FactoryBuffer),
4,
RTC::SCTP::Parameter::ParameterType::STATE_COOKIE,
false,
RTC::SCTP::Parameter::ActionForUnknownParameterType::STOP);
parameter->SetCookie(sctpCommon::DataBuffer + 1000, 3000);
REQUIRE(parameter->GetLength() == 3004);
REQUIRE(parameter->HasCookie() == true);
REQUIRE(parameter->GetCookieLength() == 3000);
parameter->SetCookie(nullptr, 0);
REQUIRE(parameter->GetLength() == 4);
REQUIRE(parameter->HasCookie() == false);
REQUIRE(parameter->GetCookieLength() == 0);
parameter->SetCookie(sctpCommon::DataBuffer + 10, 1);
REQUIRE(parameter->HasCookie() == true);
REQUIRE(parameter->GetCookieLength() == 1);
REQUIRE(parameter->GetCookie()[0] == 0x0A);
REQUIRE(parameter->GetCookie()[1] == 0x00);
REQUIRE(parameter->GetCookie()[2] == 0x00);
REQUIRE(parameter->GetCookie()[3] == 0x00);
auto* parsedParameter =
RTC::SCTP::StateCookieParameter::Parse(parameter->GetBuffer(), parameter->GetLength());
delete parameter;
CHECK_SCTP_PARAMETER(
parsedParameter,
sctpCommon::FactoryBuffer,
8,
8,
RTC::SCTP::Parameter::ParameterType::STATE_COOKIE,
false,
RTC::SCTP::Parameter::ActionForUnknownParameterType::STOP);
REQUIRE(parsedParameter->HasCookie() == true);
REQUIRE(parsedParameter->GetCookieLength() == 1);
REQUIRE(parsedParameter->GetCookie()[0] == 0x0A);
REQUIRE(parsedParameter->GetCookie()[1] == 0x00);
REQUIRE(parsedParameter->GetCookie()[2] == 0x00);
REQUIRE(parsedParameter->GetCookie()[3] == 0x00);
delete parsedParameter;
}
SECTION("StateCookieParameter::Factory() succeeds (2)")
{
auto* parameter = RTC::SCTP::StateCookieParameter::Factory(
sctpCommon::FactoryBuffer, sizeof(sctpCommon::FactoryBuffer));
CHECK_SCTP_PARAMETER(
parameter,
sctpCommon::FactoryBuffer,
sizeof(sctpCommon::FactoryBuffer),
4,
RTC::SCTP::Parameter::ParameterType::STATE_COOKIE,
false,
RTC::SCTP::Parameter::ActionForUnknownParameterType::STOP);
RTC::SCTP::NegotiatedCapabilities negotiatedCapabilities = { .maxOutboundStreams = 62000,
.maxInboundStreams = 55555,
.partialReliability = true,
.messageInterleaving = true,
.reConfig = true,
.zeroChecksum = false };
parameter->WriteStateCookieInPlace(
6660666,
9990999,
1110111,
2220222,
999909999,
1111222233334444,
negotiatedCapabilities);
REQUIRE(parameter->HasCookie() == true);
REQUIRE(parameter->GetCookieLength() == RTC::SCTP::StateCookie::StateCookieLength);
auto* parsedParameter =
RTC::SCTP::StateCookieParameter::Parse(parameter->GetBuffer(), parameter->GetLength());
delete parameter;
CHECK_SCTP_PARAMETER(
parsedParameter,
sctpCommon::FactoryBuffer,
4 + RTC::SCTP::StateCookie::StateCookieLength,
4 + RTC::SCTP::StateCookie::StateCookieLength,
RTC::SCTP::Parameter::ParameterType::STATE_COOKIE,
false,
RTC::SCTP::Parameter::ActionForUnknownParameterType::STOP);
REQUIRE(parsedParameter->HasCookie() == true);
REQUIRE(parsedParameter->GetCookieLength() == RTC::SCTP::StateCookie::StateCookieLength);
delete parsedParameter;
}
}