mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
1946 lines
82 KiB
C++
1946 lines
82 KiB
C++
//
|
|
// Copyright (c) 2013-2023 The SRS Authors
|
|
//
|
|
// SPDX-License-Identifier: MIT or MulanPSL-2.0
|
|
//
|
|
#include <srs_utest_gb28181.hpp>
|
|
|
|
#include <sstream>
|
|
using namespace std;
|
|
|
|
#include <srs_protocol_http_stack.hpp>
|
|
#include <srs_protocol_http_conn.hpp>
|
|
#include <srs_utest_protocol.hpp>
|
|
#include <srs_protocol_json.hpp>
|
|
#include <srs_kernel_utility.hpp>
|
|
#include <srs_kernel_file.hpp>
|
|
#include <srs_utest_kernel.hpp>
|
|
#include <srs_app_http_static.hpp>
|
|
#include <srs_protocol_utility.hpp>
|
|
#include <srs_core_autofree.hpp>
|
|
#include <srs_app_gb28181.hpp>
|
|
#include <srs_app_rtc_sdp.hpp>
|
|
#include <srs_kernel_rtc_rtp.hpp>
|
|
|
|
extern void srs_sip_parse_address(const std::string& address, std::string& user, std::string& host);
|
|
|
|
VOID TEST(ProtocolGbSipTest, SipParseAddress)
|
|
{
|
|
if (true) {
|
|
string user, host;
|
|
srs_sip_parse_address("", user, host);
|
|
EXPECT_STREQ("", user.c_str());
|
|
EXPECT_STREQ("", host.c_str());
|
|
}
|
|
|
|
if (true) {
|
|
string user, host;
|
|
srs_sip_parse_address("sip:", user, host);
|
|
EXPECT_STREQ("", user.c_str());
|
|
EXPECT_STREQ("", host.c_str());
|
|
}
|
|
|
|
if (true) {
|
|
string user, host;
|
|
srs_sip_parse_address("sip:bob", user, host);
|
|
EXPECT_STREQ("bob", user.c_str());
|
|
EXPECT_STREQ("", host.c_str());
|
|
}
|
|
|
|
if (true) {
|
|
string user, host;
|
|
srs_sip_parse_address("sip:bob@", user, host);
|
|
EXPECT_STREQ("bob", user.c_str());
|
|
EXPECT_STREQ("", host.c_str());
|
|
}
|
|
|
|
if (true) {
|
|
string user, host;
|
|
srs_sip_parse_address("sip:bob@host.com", user, host);
|
|
EXPECT_STREQ("bob", user.c_str());
|
|
EXPECT_STREQ("host.com", host.c_str());
|
|
}
|
|
|
|
if (true) {
|
|
string user, host;
|
|
srs_sip_parse_address("Bob <bob@host.com>", user, host);
|
|
EXPECT_STREQ("bob", user.c_str());
|
|
EXPECT_STREQ("host.com", host.c_str());
|
|
}
|
|
|
|
if (true) {
|
|
string user, host;
|
|
srs_sip_parse_address("Bob <sip:bob@host.com>", user, host);
|
|
EXPECT_STREQ("bob", user.c_str());
|
|
EXPECT_STREQ("host.com", host.c_str());
|
|
}
|
|
}
|
|
|
|
VOID TEST(ProtocolGbSipTest, SipViaBranchMagic)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
// See https://www.ietf.org/rfc/rfc3261.html#section-24.2
|
|
MockMSegmentsReader r;
|
|
r.in_bytes.push_back("REGISTER sip:registrar.biloxi.com SIP/2.0\r\n");
|
|
r.in_bytes.push_back("Via: SIP/2.0/UDP bobspc.biloxi.com:5060;branch=xxxx\r\n");
|
|
r.in_bytes.push_back("To: Bob <sip:bob@biloxi.com>\r\n");
|
|
r.in_bytes.push_back("From: Bob <sip:bob@biloxi.com>;tag=456248\r\n");
|
|
r.in_bytes.push_back("Call-ID: 843817637684230@998sdasdh09\r\n");
|
|
r.in_bytes.push_back("CSeq: 1826 REGISTER\r\n");
|
|
r.in_bytes.push_back("Content-Length: 0\r\n");
|
|
r.in_bytes.push_back("\r\n");
|
|
|
|
SrsHttpParser p;
|
|
HELPER_ASSERT_SUCCESS(p.initialize(HTTP_BOTH));
|
|
|
|
ISrsHttpMessage* msg = NULL;
|
|
SrsAutoFree(ISrsHttpMessage, msg);
|
|
HELPER_ASSERT_SUCCESS(p.parse_message(&r, &msg));
|
|
|
|
SrsSipMessage smsg;
|
|
HELPER_ASSERT_FAILED(smsg.parse(msg));
|
|
}
|
|
|
|
VOID TEST(ProtocolGbSipTest, SipRegisterRequest)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
// See https://www.ietf.org/rfc/rfc3261.html#section-24.1
|
|
MockMSegmentsReader source;
|
|
source.in_bytes.push_back("REGISTER sip:registrar.biloxi.com SIP/2.0\r\n");
|
|
source.in_bytes.push_back("Via: SIP/2.0/UDP bobspc.biloxi.com:5060;branch=z9hG4bKnashds7\r\n");
|
|
source.in_bytes.push_back("Max-Forwards: 70\r\n");
|
|
source.in_bytes.push_back("To: Bob <sip:bob@biloxi.com>\r\n");
|
|
source.in_bytes.push_back("From: Bob <sip:bob@biloxi.com>;tag=456248\r\n");
|
|
source.in_bytes.push_back("Call-ID: 843817637684230@998sdasdh09\r\n");
|
|
source.in_bytes.push_back("CSeq: 1826 REGISTER\r\n");
|
|
source.in_bytes.push_back("Contact: <sip:bob@192.0.2.4>\r\n");
|
|
source.in_bytes.push_back("Expires: 7200\r\n");
|
|
source.in_bytes.push_back("Content-Length: 0\r\n");
|
|
source.in_bytes.push_back("\r\n");
|
|
|
|
if (true) {
|
|
MockMSegmentsReader r = source;
|
|
|
|
SrsHttpParser p;
|
|
HELPER_ASSERT_SUCCESS(p.initialize(HTTP_REQUEST));
|
|
|
|
ISrsHttpMessage* msg = NULL;
|
|
SrsAutoFree(ISrsHttpMessage, msg);
|
|
HELPER_ASSERT_SUCCESS(p.parse_message(&r, &msg));
|
|
EXPECT_EQ(HTTP_REGISTER, msg->method());
|
|
EXPECT_STREQ("/sip:registrar.biloxi.com", msg->path().c_str());
|
|
EXPECT_STREQ("SIP/2.0/UDP bobspc.biloxi.com:5060;branch=z9hG4bKnashds7", msg->header()->get("Via").c_str());
|
|
EXPECT_STREQ("70", msg->header()->get("Max-Forwards").c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>", msg->header()->get("To").c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>;tag=456248", msg->header()->get("From").c_str());
|
|
EXPECT_STREQ("843817637684230@998sdasdh09", msg->header()->get("Call-ID").c_str());
|
|
EXPECT_STREQ("1826 REGISTER", msg->header()->get("CSeq").c_str());
|
|
EXPECT_STREQ("<sip:bob@192.0.2.4>", msg->header()->get("Contact").c_str());
|
|
EXPECT_STREQ("7200", msg->header()->get("Expires").c_str());
|
|
EXPECT_EQ(0, msg->content_length());
|
|
|
|
SrsSipMessage smsg;
|
|
HELPER_ASSERT_SUCCESS(smsg.parse(msg));
|
|
EXPECT_EQ(HTTP_REQUEST, smsg.type_);
|
|
EXPECT_EQ(HTTP_REGISTER, smsg.method_);
|
|
EXPECT_STREQ("sip:registrar.biloxi.com", smsg.request_uri_.c_str());
|
|
EXPECT_STREQ("SIP/2.0/UDP bobspc.biloxi.com:5060;branch=z9hG4bKnashds7", smsg.via_.c_str());
|
|
EXPECT_STREQ("UDP", smsg.via_transport_.c_str());
|
|
EXPECT_STREQ("bobspc.biloxi.com:5060", smsg.via_send_by_.c_str());
|
|
EXPECT_STREQ("bobspc.biloxi.com", smsg.via_send_by_address_.c_str());
|
|
EXPECT_EQ(5060, smsg.via_send_by_port_);
|
|
EXPECT_STREQ("branch=z9hG4bKnashds7", smsg.via_branch_.c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>", smsg.to_.c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>", smsg.to_address_.c_str());
|
|
EXPECT_STREQ("", smsg.to_tag_.c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>;tag=456248", smsg.from_.c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>", smsg.from_address_.c_str());
|
|
EXPECT_STREQ("tag=456248", smsg.from_tag_.c_str());
|
|
EXPECT_STREQ("843817637684230@998sdasdh09", smsg.call_id_.c_str());
|
|
EXPECT_STREQ("<sip:bob@192.0.2.4>", smsg.contact_.c_str());
|
|
EXPECT_STREQ("bob", smsg.contact_user_.c_str());
|
|
EXPECT_STREQ("192.0.2.4", smsg.contact_host_.c_str());
|
|
EXPECT_STREQ("192.0.2.4", smsg.contact_host_address_.c_str());
|
|
EXPECT_EQ(5060, smsg.contact_host_port_);
|
|
EXPECT_STREQ("1826 REGISTER", smsg.cseq_.c_str());
|
|
EXPECT_EQ((uint32_t)1826, smsg.cseq_number_);
|
|
EXPECT_EQ((uint32_t)7200, smsg.expires_);
|
|
EXPECT_EQ((uint32_t)70, smsg.max_forwards_);
|
|
}
|
|
|
|
// Parse in HTTP_REQUEST mode.
|
|
if (true) {
|
|
MockMSegmentsReader r = source;
|
|
|
|
SrsHttpParser p;
|
|
HELPER_ASSERT_SUCCESS(p.initialize(HTTP_REQUEST));
|
|
|
|
ISrsHttpMessage* msg = NULL;
|
|
SrsAutoFree(ISrsHttpMessage, msg);
|
|
HELPER_ASSERT_SUCCESS(p.parse_message(&r, &msg));
|
|
EXPECT_EQ(HTTP_REQUEST, (http_parser_type)msg->message_type());
|
|
EXPECT_EQ(HTTP_REGISTER, msg->method());
|
|
EXPECT_STREQ("/sip:registrar.biloxi.com", msg->path().c_str());
|
|
}
|
|
|
|
// Parse in HTTP_BOTH mode.
|
|
if (true) {
|
|
MockMSegmentsReader r = source;
|
|
|
|
SrsHttpParser p;
|
|
HELPER_ASSERT_SUCCESS(p.initialize(HTTP_BOTH));
|
|
|
|
ISrsHttpMessage* msg = NULL;
|
|
SrsAutoFree(ISrsHttpMessage, msg);
|
|
HELPER_ASSERT_SUCCESS(p.parse_message(&r, &msg));
|
|
EXPECT_EQ(HTTP_REQUEST, (http_parser_type)msg->message_type());
|
|
EXPECT_EQ(HTTP_REGISTER, msg->method());
|
|
EXPECT_STREQ("/sip:registrar.biloxi.com", msg->path().c_str());
|
|
}
|
|
}
|
|
|
|
VOID TEST(ProtocolGbSipTest, SipRegisterResponse)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
// See https://www.ietf.org/rfc/rfc3261.html#section-24.1
|
|
MockMSegmentsReader source;
|
|
source.in_bytes.push_back("SIP/2.0 200 OK\r\n");
|
|
source.in_bytes.push_back("Via: SIP/2.0/UDP bobspc.biloxi.com:5060;branch=z9hG4bKnashds7;received=192.0.2.4\r\n");
|
|
source.in_bytes.push_back("To: Bob <sip:bob@biloxi.com>;tag=2493k59kd\r\n");
|
|
source.in_bytes.push_back("From: Bob <sip:bob@biloxi.com>;tag=456248\r\n");
|
|
source.in_bytes.push_back("Call-ID: 843817637684230@998sdasdh09\r\n");
|
|
source.in_bytes.push_back("CSeq: 1826 REGISTER\r\n");
|
|
source.in_bytes.push_back("Contact: <sip:bob@192.0.2.4>\r\n");
|
|
source.in_bytes.push_back("Expires: 7200\r\n");
|
|
source.in_bytes.push_back("Content-Length: 0\r\n");
|
|
source.in_bytes.push_back("\r\n");
|
|
|
|
if (true) {
|
|
MockMSegmentsReader r = source;
|
|
|
|
SrsHttpParser p;
|
|
HELPER_ASSERT_SUCCESS(p.initialize(HTTP_RESPONSE));
|
|
|
|
ISrsHttpMessage* msg = NULL;
|
|
SrsAutoFree(ISrsHttpMessage, msg);
|
|
HELPER_ASSERT_SUCCESS(p.parse_message(&r, &msg));
|
|
EXPECT_EQ(HTTP_RESPONSE, (http_parser_type) msg->message_type());
|
|
EXPECT_EQ(200, msg->status_code());
|
|
EXPECT_STREQ("SIP/2.0/UDP bobspc.biloxi.com:5060;branch=z9hG4bKnashds7;received=192.0.2.4",
|
|
msg->header()->get("Via").c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>;tag=2493k59kd", msg->header()->get("To").c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>;tag=456248", msg->header()->get("From").c_str());
|
|
EXPECT_STREQ("843817637684230@998sdasdh09", msg->header()->get("Call-ID").c_str());
|
|
EXPECT_STREQ("1826 REGISTER", msg->header()->get("CSeq").c_str());
|
|
EXPECT_STREQ("<sip:bob@192.0.2.4>", msg->header()->get("Contact").c_str());
|
|
EXPECT_STREQ("7200", msg->header()->get("Expires").c_str());
|
|
EXPECT_EQ(0, msg->content_length());
|
|
|
|
SrsSipMessage smsg;
|
|
HELPER_ASSERT_SUCCESS(smsg.parse(msg));
|
|
EXPECT_EQ(HTTP_RESPONSE, smsg.type_);
|
|
EXPECT_EQ(HTTP_STATUS_OK, smsg.status_);
|
|
EXPECT_STREQ("SIP/2.0/UDP bobspc.biloxi.com:5060;branch=z9hG4bKnashds7;received=192.0.2.4", smsg.via_.c_str());
|
|
EXPECT_STREQ("UDP", smsg.via_transport_.c_str());
|
|
EXPECT_STREQ("bobspc.biloxi.com:5060", smsg.via_send_by_.c_str());
|
|
EXPECT_STREQ("bobspc.biloxi.com", smsg.via_send_by_address_.c_str());
|
|
EXPECT_EQ(5060, smsg.via_send_by_port_);
|
|
EXPECT_STREQ("branch=z9hG4bKnashds7", smsg.via_branch_.c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>;tag=2493k59kd", smsg.to_.c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>", smsg.to_address_.c_str());
|
|
EXPECT_STREQ("tag=2493k59kd", smsg.to_tag_.c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>;tag=456248", smsg.from_.c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>", smsg.from_address_.c_str());
|
|
EXPECT_STREQ("tag=456248", smsg.from_tag_.c_str());
|
|
EXPECT_STREQ("843817637684230@998sdasdh09", smsg.call_id_.c_str());
|
|
EXPECT_STREQ("<sip:bob@192.0.2.4>", smsg.contact_.c_str());
|
|
EXPECT_STREQ("bob", smsg.contact_user_.c_str());
|
|
EXPECT_STREQ("192.0.2.4", smsg.contact_host_.c_str());
|
|
EXPECT_STREQ("192.0.2.4", smsg.contact_host_address_.c_str());
|
|
EXPECT_EQ(5060, smsg.contact_host_port_);
|
|
EXPECT_STREQ("1826 REGISTER", smsg.cseq_.c_str());
|
|
EXPECT_EQ((uint32_t)1826, smsg.cseq_number_);
|
|
}
|
|
|
|
// Parse in HTTP_RESPONSE mode.
|
|
if (true) {
|
|
MockMSegmentsReader r = source;
|
|
|
|
SrsHttpParser p;
|
|
HELPER_ASSERT_SUCCESS(p.initialize(HTTP_RESPONSE));
|
|
|
|
ISrsHttpMessage* msg = NULL;
|
|
SrsAutoFree(ISrsHttpMessage, msg);
|
|
HELPER_ASSERT_SUCCESS(p.parse_message(&r, &msg));
|
|
EXPECT_EQ(HTTP_RESPONSE, (http_parser_type)msg->message_type());
|
|
EXPECT_EQ(200, msg->status_code());
|
|
}
|
|
|
|
// Parse in HTTP_BOTH mode.
|
|
if (true) {
|
|
MockMSegmentsReader r = source;
|
|
|
|
SrsHttpParser p;
|
|
HELPER_ASSERT_SUCCESS(p.initialize(HTTP_BOTH));
|
|
|
|
ISrsHttpMessage* msg = NULL;
|
|
SrsAutoFree(ISrsHttpMessage, msg);
|
|
HELPER_ASSERT_SUCCESS(p.parse_message(&r, &msg));
|
|
EXPECT_EQ(HTTP_RESPONSE, (http_parser_type)msg->message_type());
|
|
EXPECT_EQ(200, msg->status_code());
|
|
}
|
|
}
|
|
|
|
VOID TEST(ProtocolGbSipTest, SipSessionUacInviteRequest)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
// See https://www.ietf.org/rfc/rfc3261.html#section-24.2
|
|
MockMSegmentsReader r;
|
|
r.in_bytes.push_back("INVITE sip:bob@biloxi.com SIP/2.0\r\n");
|
|
r.in_bytes.push_back("Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8\r\n");
|
|
r.in_bytes.push_back("Max-Forwards: 70\r\n");
|
|
r.in_bytes.push_back("To: Bob <sip:bob@biloxi.com>\r\n");
|
|
r.in_bytes.push_back("From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n");
|
|
r.in_bytes.push_back("Call-ID: a84b4c76e66710\r\n");
|
|
r.in_bytes.push_back("CSeq: 314159 INVITE\r\n");
|
|
r.in_bytes.push_back("Contact: <sip:alice@pc33.atlanta.com>\r\n");
|
|
r.in_bytes.push_back("Content-Type: application/sdp\r\n");
|
|
r.in_bytes.push_back("Content-Length: 142\r\n");
|
|
r.in_bytes.push_back("\r\n");
|
|
r.in_bytes.push_back(string(142, 'x'));
|
|
|
|
SrsHttpParser p;
|
|
HELPER_ASSERT_SUCCESS(p.initialize(HTTP_BOTH));
|
|
|
|
ISrsHttpMessage* msg = NULL;
|
|
SrsAutoFree(ISrsHttpMessage, msg);
|
|
HELPER_ASSERT_SUCCESS(p.parse_message(&r, &msg));
|
|
EXPECT_EQ(HTTP_INVITE, msg->method());
|
|
EXPECT_STREQ("/sip:bob@biloxi.com", msg->path().c_str());
|
|
EXPECT_STREQ("SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8", msg->header()->get("Via").c_str());
|
|
EXPECT_STREQ("70", msg->header()->get("Max-Forwards").c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>", msg->header()->get("To").c_str());
|
|
EXPECT_STREQ("Alice <sip:alice@atlanta.com>;tag=1928301774", msg->header()->get("From").c_str());
|
|
EXPECT_STREQ("a84b4c76e66710", msg->header()->get("Call-ID").c_str());
|
|
EXPECT_STREQ("314159 INVITE", msg->header()->get("CSeq").c_str());
|
|
EXPECT_STREQ("<sip:alice@pc33.atlanta.com>", msg->header()->get("Contact").c_str());
|
|
EXPECT_EQ(142, msg->content_length());
|
|
|
|
SrsSipMessage smsg;
|
|
HELPER_ASSERT_SUCCESS(smsg.parse(msg));
|
|
EXPECT_EQ(HTTP_REQUEST, smsg.type_);
|
|
EXPECT_EQ(HTTP_INVITE, smsg.method_);
|
|
EXPECT_STREQ("sip:bob@biloxi.com", smsg.request_uri_.c_str());
|
|
EXPECT_STREQ("SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8", smsg.via_.c_str());
|
|
EXPECT_STREQ("UDP", smsg.via_transport_.c_str());
|
|
EXPECT_STREQ("pc33.atlanta.com", smsg.via_send_by_.c_str());
|
|
EXPECT_STREQ("pc33.atlanta.com", smsg.via_send_by_address_.c_str());
|
|
EXPECT_EQ(5060, smsg.via_send_by_port_);
|
|
EXPECT_STREQ("branch=z9hG4bKnashds8", smsg.via_branch_.c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>", smsg.to_.c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>", smsg.to_address_.c_str());
|
|
EXPECT_STREQ("", smsg.to_tag_.c_str());
|
|
EXPECT_STREQ("Alice <sip:alice@atlanta.com>;tag=1928301774", smsg.from_.c_str());
|
|
EXPECT_STREQ("Alice <sip:alice@atlanta.com>", smsg.from_address_.c_str());
|
|
EXPECT_STREQ("tag=1928301774", smsg.from_tag_.c_str());
|
|
EXPECT_STREQ("a84b4c76e66710", smsg.call_id_.c_str());
|
|
EXPECT_STREQ("<sip:alice@pc33.atlanta.com>", smsg.contact_.c_str());
|
|
EXPECT_STREQ("alice", smsg.contact_user_.c_str());
|
|
EXPECT_STREQ("pc33.atlanta.com", smsg.contact_host_.c_str());
|
|
EXPECT_STREQ("pc33.atlanta.com", smsg.contact_host_address_.c_str());
|
|
EXPECT_EQ(5060, smsg.contact_host_port_);
|
|
EXPECT_STREQ("314159 INVITE", smsg.cseq_.c_str());
|
|
EXPECT_EQ((uint32_t)314159, smsg.cseq_number_);
|
|
EXPECT_EQ((uint32_t)70, smsg.max_forwards_);
|
|
EXPECT_EQ((size_t)142, smsg.body_.length());
|
|
}
|
|
|
|
VOID TEST(ProtocolGbSipTest, SipSessionUasTryingResponse)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
// See https://www.ietf.org/rfc/rfc3261.html#section-24.2
|
|
MockMSegmentsReader r;
|
|
r.in_bytes.push_back("SIP/2.0 100 Trying\r\n");
|
|
r.in_bytes.push_back("Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8;received=192.0.2.1\r\n");
|
|
r.in_bytes.push_back("To: Bob <sip:bob@biloxi.com>\r\n");
|
|
r.in_bytes.push_back("From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n");
|
|
r.in_bytes.push_back("Call-ID: a84b4c76e66710\r\n");
|
|
r.in_bytes.push_back("CSeq: 314159 INVITE\r\n");
|
|
r.in_bytes.push_back("Content-Length: 0\r\n");
|
|
r.in_bytes.push_back("\r\n");
|
|
|
|
SrsHttpParser p;
|
|
HELPER_ASSERT_SUCCESS(p.initialize(HTTP_RESPONSE));
|
|
|
|
ISrsHttpMessage* msg = NULL;
|
|
SrsAutoFree(ISrsHttpMessage, msg);
|
|
HELPER_ASSERT_SUCCESS(p.parse_message(&r, &msg));
|
|
EXPECT_EQ(HTTP_RESPONSE, (http_parser_type) msg->message_type());
|
|
EXPECT_EQ(100, msg->status_code());
|
|
EXPECT_STREQ("SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8;received=192.0.2.1", msg->header()->get("Via").c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>", msg->header()->get("To").c_str());
|
|
EXPECT_STREQ("Alice <sip:alice@atlanta.com>;tag=1928301774", msg->header()->get("From").c_str());
|
|
EXPECT_STREQ("a84b4c76e66710", msg->header()->get("Call-ID").c_str());
|
|
EXPECT_STREQ("314159 INVITE", msg->header()->get("CSeq").c_str());
|
|
EXPECT_EQ(0, msg->content_length());
|
|
|
|
SrsSipMessage smsg;
|
|
HELPER_ASSERT_SUCCESS(smsg.parse(msg));
|
|
EXPECT_EQ(HTTP_RESPONSE, smsg.type_);
|
|
EXPECT_EQ(100, smsg.status_);
|
|
EXPECT_STREQ("SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8;received=192.0.2.1", smsg.via_.c_str());
|
|
EXPECT_STREQ("UDP", smsg.via_transport_.c_str());
|
|
EXPECT_STREQ("pc33.atlanta.com", smsg.via_send_by_.c_str());
|
|
EXPECT_STREQ("pc33.atlanta.com", smsg.via_send_by_address_.c_str());
|
|
EXPECT_EQ(5060, smsg.via_send_by_port_);
|
|
EXPECT_STREQ("branch=z9hG4bKnashds8", smsg.via_branch_.c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>", smsg.to_.c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>", smsg.to_address_.c_str());
|
|
EXPECT_STREQ("", smsg.to_tag_.c_str());
|
|
EXPECT_STREQ("Alice <sip:alice@atlanta.com>;tag=1928301774", smsg.from_.c_str());
|
|
EXPECT_STREQ("Alice <sip:alice@atlanta.com>", smsg.from_address_.c_str());
|
|
EXPECT_STREQ("tag=1928301774", smsg.from_tag_.c_str());
|
|
EXPECT_STREQ("a84b4c76e66710", smsg.call_id_.c_str());
|
|
EXPECT_STREQ("314159 INVITE", smsg.cseq_.c_str());
|
|
EXPECT_EQ((uint32_t)314159, smsg.cseq_number_);
|
|
}
|
|
|
|
VOID TEST(ProtocolGbSipTest, SipSessionUas200OkResponse)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
// See https://www.ietf.org/rfc/rfc3261.html#section-24.2
|
|
MockMSegmentsReader r;
|
|
r.in_bytes.push_back("SIP/2.0 200 OK\r\n");
|
|
r.in_bytes.push_back("Via: SIP/2.0/UDP server10.biloxi.com;branch=z9hG4bK4b43c2ff8.1;received=192.0.2.3\r\n");
|
|
r.in_bytes.push_back("Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2\r\n");
|
|
r.in_bytes.push_back("Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8;received=192.0.2.1\r\n");
|
|
r.in_bytes.push_back("To: Bob <sip:bob@biloxi.com>;tag=a6c85cf\r\n");
|
|
r.in_bytes.push_back("From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n");
|
|
r.in_bytes.push_back("Call-ID: a84b4c76e66710\r\n");
|
|
r.in_bytes.push_back("CSeq: 314159 INVITE\r\n");
|
|
r.in_bytes.push_back("Contact: <sip:bob@192.0.2.4>\r\n");
|
|
r.in_bytes.push_back("Content-Type: application/sdp\r\n");
|
|
r.in_bytes.push_back("Content-Length: 131\r\n");
|
|
r.in_bytes.push_back("\r\n");
|
|
r.in_bytes.push_back(string(131, 'x'));
|
|
|
|
SrsHttpParser p;
|
|
HELPER_ASSERT_SUCCESS(p.initialize(HTTP_RESPONSE));
|
|
|
|
ISrsHttpMessage* msg = NULL;
|
|
SrsAutoFree(ISrsHttpMessage, msg);
|
|
HELPER_ASSERT_SUCCESS(p.parse_message(&r, &msg));
|
|
EXPECT_EQ(HTTP_RESPONSE, (http_parser_type) msg->message_type());
|
|
EXPECT_EQ(200, msg->status_code());
|
|
EXPECT_STREQ("SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8;received=192.0.2.1", msg->header()->get("Via").c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>;tag=a6c85cf", msg->header()->get("To").c_str());
|
|
EXPECT_STREQ("Alice <sip:alice@atlanta.com>;tag=1928301774", msg->header()->get("From").c_str());
|
|
EXPECT_STREQ("<sip:bob@192.0.2.4>", msg->header()->get("Contact").c_str());
|
|
EXPECT_STREQ("a84b4c76e66710", msg->header()->get("Call-ID").c_str());
|
|
EXPECT_STREQ("314159 INVITE", msg->header()->get("CSeq").c_str());
|
|
EXPECT_EQ(131, msg->content_length());
|
|
|
|
SrsSipMessage smsg;
|
|
HELPER_ASSERT_SUCCESS(smsg.parse(msg));
|
|
EXPECT_EQ(HTTP_RESPONSE, smsg.type_);
|
|
EXPECT_EQ(200, smsg.status_);
|
|
EXPECT_STREQ("SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8;received=192.0.2.1", smsg.via_.c_str());
|
|
EXPECT_STREQ("UDP", smsg.via_transport_.c_str());
|
|
EXPECT_STREQ("pc33.atlanta.com", smsg.via_send_by_.c_str());
|
|
EXPECT_STREQ("pc33.atlanta.com", smsg.via_send_by_address_.c_str());
|
|
EXPECT_EQ(5060, smsg.via_send_by_port_);
|
|
EXPECT_STREQ("branch=z9hG4bKnashds8", smsg.via_branch_.c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>;tag=a6c85cf", smsg.to_.c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>", smsg.to_address_.c_str());
|
|
EXPECT_STREQ("tag=a6c85cf", smsg.to_tag_.c_str());
|
|
EXPECT_STREQ("Alice <sip:alice@atlanta.com>;tag=1928301774", smsg.from_.c_str());
|
|
EXPECT_STREQ("Alice <sip:alice@atlanta.com>", smsg.from_address_.c_str());
|
|
EXPECT_STREQ("tag=1928301774", smsg.from_tag_.c_str());
|
|
EXPECT_STREQ("<sip:bob@192.0.2.4>", smsg.contact_.c_str());
|
|
EXPECT_STREQ("bob", smsg.contact_user_.c_str());
|
|
EXPECT_STREQ("192.0.2.4", smsg.contact_host_.c_str());
|
|
EXPECT_STREQ("192.0.2.4", smsg.contact_host_address_.c_str());
|
|
EXPECT_EQ(5060, smsg.contact_host_port_);
|
|
EXPECT_STREQ("a84b4c76e66710", smsg.call_id_.c_str());
|
|
EXPECT_STREQ("314159 INVITE", smsg.cseq_.c_str());
|
|
EXPECT_EQ((uint32_t)314159, smsg.cseq_number_);
|
|
EXPECT_EQ((size_t)131, smsg.body_.length());
|
|
}
|
|
|
|
VOID TEST(ProtocolGbSipTest, SipSessionUacAckRequest)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
// See https://www.ietf.org/rfc/rfc3261.html#section-24.2
|
|
MockMSegmentsReader r;
|
|
r.in_bytes.push_back("ACK sip:bob@192.0.2.4 SIP/2.0\r\n");
|
|
r.in_bytes.push_back("Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds9\r\n");
|
|
r.in_bytes.push_back("Max-Forwards: 70\r\n");
|
|
r.in_bytes.push_back("To: Bob <sip:bob@biloxi.com>;tag=a6c85cf\r\n");
|
|
r.in_bytes.push_back("From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n");
|
|
r.in_bytes.push_back("Call-ID: a84b4c76e66710\r\n");
|
|
r.in_bytes.push_back("CSeq: 314159 ACK\r\n");
|
|
r.in_bytes.push_back("Content-Length: 0\r\n");
|
|
r.in_bytes.push_back("\r\n");
|
|
|
|
SrsHttpParser p;
|
|
HELPER_ASSERT_SUCCESS(p.initialize(HTTP_BOTH));
|
|
|
|
ISrsHttpMessage* msg = NULL;
|
|
SrsAutoFree(ISrsHttpMessage, msg);
|
|
HELPER_ASSERT_SUCCESS(p.parse_message(&r, &msg));
|
|
EXPECT_EQ(HTTP_ACK, msg->method());
|
|
EXPECT_STREQ("/sip:bob@192.0.2.4", msg->path().c_str());
|
|
EXPECT_STREQ("SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds9", msg->header()->get("Via").c_str());
|
|
EXPECT_STREQ("70", msg->header()->get("Max-Forwards").c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>;tag=a6c85cf", msg->header()->get("To").c_str());
|
|
EXPECT_STREQ("Alice <sip:alice@atlanta.com>;tag=1928301774", msg->header()->get("From").c_str());
|
|
EXPECT_STREQ("a84b4c76e66710", msg->header()->get("Call-ID").c_str());
|
|
EXPECT_STREQ("314159 ACK", msg->header()->get("CSeq").c_str());
|
|
EXPECT_EQ(0, msg->content_length());
|
|
|
|
SrsSipMessage smsg;
|
|
HELPER_ASSERT_SUCCESS(smsg.parse(msg));
|
|
EXPECT_EQ(HTTP_REQUEST, smsg.type_);
|
|
EXPECT_EQ(HTTP_ACK, smsg.method_);
|
|
EXPECT_STREQ("sip:bob@192.0.2.4", smsg.request_uri_.c_str());
|
|
EXPECT_STREQ("SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds9", smsg.via_.c_str());
|
|
EXPECT_STREQ("UDP", smsg.via_transport_.c_str());
|
|
EXPECT_STREQ("pc33.atlanta.com", smsg.via_send_by_.c_str());
|
|
EXPECT_STREQ("pc33.atlanta.com", smsg.via_send_by_address_.c_str());
|
|
EXPECT_EQ(5060, smsg.via_send_by_port_);
|
|
EXPECT_STREQ("branch=z9hG4bKnashds9", smsg.via_branch_.c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>;tag=a6c85cf", smsg.to_.c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>", smsg.to_address_.c_str());
|
|
EXPECT_STREQ("tag=a6c85cf", smsg.to_tag_.c_str());
|
|
EXPECT_STREQ("Alice <sip:alice@atlanta.com>;tag=1928301774", smsg.from_.c_str());
|
|
EXPECT_STREQ("Alice <sip:alice@atlanta.com>", smsg.from_address_.c_str());
|
|
EXPECT_STREQ("tag=1928301774", smsg.from_tag_.c_str());
|
|
EXPECT_STREQ("a84b4c76e66710", smsg.call_id_.c_str());
|
|
EXPECT_STREQ("314159 ACK", smsg.cseq_.c_str());
|
|
EXPECT_EQ((uint32_t)314159, smsg.cseq_number_);
|
|
EXPECT_EQ((uint32_t)70, smsg.max_forwards_);
|
|
}
|
|
|
|
VOID TEST(ProtocolGbSipTest, SipSessionUacByeRequest)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
// See https://www.ietf.org/rfc/rfc3261.html#section-24.2
|
|
MockMSegmentsReader r;
|
|
r.in_bytes.push_back("BYE sip:alice@pc33.atlanta.com SIP/2.0\r\n");
|
|
r.in_bytes.push_back("Via: SIP/2.0/UDP 192.0.2.4;branch=z9hG4bKnashds10\r\n");
|
|
r.in_bytes.push_back("Max-Forwards: 70\r\n");
|
|
r.in_bytes.push_back("From: Bob <sip:bob@biloxi.com>;tag=a6c85cf\r\n");
|
|
r.in_bytes.push_back("To: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n");
|
|
r.in_bytes.push_back("Call-ID: a84b4c76e66710\r\n");
|
|
r.in_bytes.push_back("CSeq: 231 BYE\r\n");
|
|
r.in_bytes.push_back("Content-Length: 0\r\n");
|
|
r.in_bytes.push_back("\r\n");
|
|
|
|
SrsHttpParser p;
|
|
HELPER_ASSERT_SUCCESS(p.initialize(HTTP_BOTH));
|
|
|
|
ISrsHttpMessage* msg = NULL;
|
|
SrsAutoFree(ISrsHttpMessage, msg);
|
|
HELPER_ASSERT_SUCCESS(p.parse_message(&r, &msg));
|
|
EXPECT_EQ(HTTP_BYE, msg->method());
|
|
EXPECT_STREQ("/sip:alice@pc33.atlanta.com", msg->path().c_str());
|
|
EXPECT_STREQ("SIP/2.0/UDP 192.0.2.4;branch=z9hG4bKnashds10", msg->header()->get("Via").c_str());
|
|
EXPECT_STREQ("70", msg->header()->get("Max-Forwards").c_str());
|
|
EXPECT_STREQ("Alice <sip:alice@atlanta.com>;tag=1928301774", msg->header()->get("To").c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>;tag=a6c85cf", msg->header()->get("From").c_str());
|
|
EXPECT_STREQ("a84b4c76e66710", msg->header()->get("Call-ID").c_str());
|
|
EXPECT_STREQ("231 BYE", msg->header()->get("CSeq").c_str());
|
|
EXPECT_EQ(0, msg->content_length());
|
|
|
|
SrsSipMessage smsg;
|
|
HELPER_ASSERT_SUCCESS(smsg.parse(msg));
|
|
EXPECT_EQ(HTTP_REQUEST, smsg.type_);
|
|
EXPECT_EQ(HTTP_BYE, smsg.method_);
|
|
EXPECT_STREQ("sip:alice@pc33.atlanta.com", smsg.request_uri_.c_str());
|
|
EXPECT_STREQ("SIP/2.0/UDP 192.0.2.4;branch=z9hG4bKnashds10", smsg.via_.c_str());
|
|
EXPECT_STREQ("UDP", smsg.via_transport_.c_str());
|
|
EXPECT_STREQ("192.0.2.4", smsg.via_send_by_.c_str());
|
|
EXPECT_STREQ("192.0.2.4", smsg.via_send_by_address_.c_str());
|
|
EXPECT_EQ(5060, smsg.via_send_by_port_);
|
|
EXPECT_STREQ("branch=z9hG4bKnashds10", smsg.via_branch_.c_str());
|
|
EXPECT_STREQ("Alice <sip:alice@atlanta.com>;tag=1928301774", smsg.to_.c_str());
|
|
EXPECT_STREQ("Alice <sip:alice@atlanta.com>", smsg.to_address_.c_str());
|
|
EXPECT_STREQ("tag=1928301774", smsg.to_tag_.c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>;tag=a6c85cf", smsg.from_.c_str());
|
|
EXPECT_STREQ("Bob <sip:bob@biloxi.com>", smsg.from_address_.c_str());
|
|
EXPECT_STREQ("tag=a6c85cf", smsg.from_tag_.c_str());
|
|
EXPECT_STREQ("a84b4c76e66710", smsg.call_id_.c_str());
|
|
EXPECT_STREQ("231 BYE", smsg.cseq_.c_str());
|
|
EXPECT_EQ((uint32_t)231, smsg.cseq_number_);
|
|
EXPECT_EQ((uint32_t)70, smsg.max_forwards_);
|
|
}
|
|
|
|
VOID TEST(ProtocolGbSipTest, SipRegisterExpires)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
if (true) {
|
|
MockMSegmentsReader r;
|
|
r.in_bytes.push_back("REGISTER sip:registrar.biloxi.com SIP/2.0\r\n");
|
|
r.in_bytes.push_back("Via: SIP/2.0/UDP bobspc.biloxi.com:5060;branch=z9hG4bKnashds7\r\n");
|
|
r.in_bytes.push_back("To: Bob <sip:bob@biloxi.com>\r\n");
|
|
r.in_bytes.push_back("From: Bob <sip:bob@biloxi.com>;tag=456248\r\n");
|
|
r.in_bytes.push_back("Call-ID: 843817637684230@998sdasdh09\r\n");
|
|
r.in_bytes.push_back("CSeq: 1826 REGISTER\r\n");
|
|
r.in_bytes.push_back("Expires: 7200\r\n");
|
|
r.in_bytes.push_back("Content-Length: 0\r\n");
|
|
r.in_bytes.push_back("\r\n");
|
|
|
|
SrsHttpParser p;
|
|
HELPER_ASSERT_SUCCESS(p.initialize(HTTP_REQUEST));
|
|
|
|
ISrsHttpMessage* msg = NULL;
|
|
SrsAutoFree(ISrsHttpMessage, msg);
|
|
HELPER_ASSERT_SUCCESS(p.parse_message(&r, &msg));
|
|
|
|
SrsSipMessage smsg;
|
|
HELPER_ASSERT_SUCCESS(smsg.parse(msg));
|
|
EXPECT_EQ(HTTP_REQUEST, smsg.type_);
|
|
EXPECT_EQ(HTTP_REGISTER, smsg.method_);
|
|
EXPECT_EQ((uint32_t)7200, smsg.expires_);
|
|
}
|
|
|
|
if (true) {
|
|
MockMSegmentsReader r;
|
|
r.in_bytes.push_back("REGISTER sip:registrar.biloxi.com SIP/2.0\r\n");
|
|
r.in_bytes.push_back("Via: SIP/2.0/UDP bobspc.biloxi.com:5060;branch=z9hG4bKnashds7\r\n");
|
|
r.in_bytes.push_back("To: Bob <sip:bob@biloxi.com>\r\n");
|
|
r.in_bytes.push_back("From: Bob <sip:bob@biloxi.com>;tag=456248\r\n");
|
|
r.in_bytes.push_back("Call-ID: 843817637684230@998sdasdh09\r\n");
|
|
r.in_bytes.push_back("CSeq: 1826 REGISTER\r\n");
|
|
r.in_bytes.push_back("Expires: 0\r\n");
|
|
r.in_bytes.push_back("Content-Length: 0\r\n");
|
|
r.in_bytes.push_back("\r\n");
|
|
|
|
SrsHttpParser p;
|
|
HELPER_ASSERT_SUCCESS(p.initialize(HTTP_REQUEST));
|
|
|
|
ISrsHttpMessage* msg = NULL;
|
|
SrsAutoFree(ISrsHttpMessage, msg);
|
|
HELPER_ASSERT_SUCCESS(p.parse_message(&r, &msg));
|
|
|
|
SrsSipMessage smsg;
|
|
HELPER_ASSERT_SUCCESS(smsg.parse(msg));
|
|
EXPECT_EQ(HTTP_REQUEST, smsg.type_);
|
|
EXPECT_EQ(HTTP_REGISTER, smsg.method_);
|
|
EXPECT_EQ((uint32_t)0, smsg.expires_);
|
|
}
|
|
}
|
|
|
|
VOID TEST(ProtocolGbSipTest, SipSmallMessagesInOneBuffer)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
// See https://www.ietf.org/rfc/rfc3261.html#section-24.2
|
|
MockMSegmentsReader r;
|
|
r.in_bytes.push_back(
|
|
"SIP/2.0 100 Trying\r\n"
|
|
"Via: SIP/2.0/TCP 192.168.3.85:5060;rport=5060;branch=z9hG4bK95108j;received=127.0.0.1\r\n"
|
|
"From: <sip:34020000002000000001@3402000000>;tag=SRS6600q9p4\r\n"
|
|
"To: <sip:34020000001772715371@3402000000>\r\n"
|
|
"Call-ID: x220zl3805088272\r\n"
|
|
"CSeq: 831 INVITE\r\n"
|
|
"Content-Length: 0\r\n"
|
|
"\r\n"
|
|
"SIP/2.0 200 OK\r\n"
|
|
"Via: SIP/2.0/TCP 192.168.3.85:5060;rport=5060;branch=z9hG4bK95108j;received=127.0.0.1\r\n"
|
|
"From: <sip:34020000002000000001@3402000000>;tag=SRS6600q9p4\r\n"
|
|
"To: <sip:34020000001772715371@3402000000>\r\n"
|
|
"Call-ID: x220zl3805088272\r\n"
|
|
"CSeq: 831 INVITE\r\n"
|
|
"Content-Length: 0\r\n"
|
|
"\r\n"
|
|
);
|
|
|
|
SrsHttpParser p;
|
|
HELPER_ASSERT_SUCCESS(p.initialize(HTTP_BOTH));
|
|
|
|
if (true) {
|
|
ISrsHttpMessage* msg = NULL;
|
|
SrsAutoFree(ISrsHttpMessage, msg);
|
|
HELPER_ASSERT_SUCCESS(p.parse_message(&r, &msg));
|
|
|
|
SrsSipMessage smsg;
|
|
HELPER_ASSERT_SUCCESS(smsg.parse(msg));
|
|
EXPECT_EQ(HTTP_RESPONSE, smsg.type_);
|
|
EXPECT_EQ(100, smsg.status_);
|
|
}
|
|
|
|
if (true) {
|
|
ISrsHttpMessage* msg = NULL;
|
|
SrsAutoFree(ISrsHttpMessage, msg);
|
|
HELPER_ASSERT_SUCCESS(p.parse_message(&r, &msg));
|
|
|
|
SrsSipMessage smsg;
|
|
HELPER_ASSERT_SUCCESS(smsg.parse(msg));
|
|
EXPECT_EQ(HTTP_RESPONSE, smsg.type_);
|
|
EXPECT_EQ(200, smsg.status_);
|
|
}
|
|
}
|
|
|
|
VOID TEST(ProtocolGbSipTest, SipSmallMessagesWithBody)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
// See https://www.ietf.org/rfc/rfc3261.html#section-24.2
|
|
MockMSegmentsReader r;
|
|
r.in_bytes.push_back(
|
|
"SIP/2.0 100 Trying\r\n"
|
|
"Via: SIP/2.0/TCP 192.168.3.85:5060;rport=5060;branch=z9hG4bK95108j;received=127.0.0.1\r\n"
|
|
"From: <sip:34020000002000000001@3402000000>;tag=SRS6600q9p4\r\n"
|
|
"To: <sip:34020000001772715371@3402000000>\r\n"
|
|
"Call-ID: x220zl3805088272\r\n"
|
|
"CSeq: 831 INVITE\r\n"
|
|
"Content-Length: 10\r\n"
|
|
"\r\n"
|
|
"HelloWorld"
|
|
"SIP/2.0 200 OK\r\n"
|
|
"Via: SIP/2.0/TCP 192.168.3.85:5060;rport=5060;branch=z9hG4bK95108j;received=127.0.0.1\r\n"
|
|
"From: <sip:34020000002000000001@3402000000>;tag=SRS6600q9p4\r\n"
|
|
"To: <sip:34020000001772715371@3402000000>\r\n"
|
|
"Call-ID: x220zl3805088272\r\n"
|
|
"CSeq: 831 INVITE\r\n"
|
|
"Content-Length: 11\r\n"
|
|
"\r\n"
|
|
"HelloServer"
|
|
);
|
|
|
|
SrsHttpParser p;
|
|
HELPER_ASSERT_SUCCESS(p.initialize(HTTP_BOTH));
|
|
|
|
if (true) {
|
|
ISrsHttpMessage* msg = NULL;
|
|
SrsAutoFree(ISrsHttpMessage, msg);
|
|
HELPER_ASSERT_SUCCESS(p.parse_message(&r, &msg));
|
|
|
|
SrsSipMessage smsg;
|
|
HELPER_ASSERT_SUCCESS(smsg.parse(msg));
|
|
EXPECT_EQ(HTTP_RESPONSE, smsg.type_);
|
|
EXPECT_EQ(100, smsg.status_);
|
|
EXPECT_STREQ("HelloWorld", smsg.body_.c_str());
|
|
}
|
|
|
|
if (true) {
|
|
ISrsHttpMessage* msg = NULL;
|
|
SrsAutoFree(ISrsHttpMessage, msg);
|
|
HELPER_ASSERT_SUCCESS(p.parse_message(&r, &msg));
|
|
|
|
SrsSipMessage smsg;
|
|
HELPER_ASSERT_SUCCESS(smsg.parse(msg));
|
|
EXPECT_EQ(HTTP_RESPONSE, smsg.type_);
|
|
EXPECT_EQ(200, smsg.status_);
|
|
EXPECT_STREQ("HelloServer", smsg.body_.c_str());
|
|
}
|
|
}
|
|
|
|
VOID TEST(ProtocolGbSipTest, SipStandardOfferDecode)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
string str = \
|
|
"v=0\r\n" \
|
|
"o=64010600002020000001 0 0 IN IP4 172.20.16.3\r\n" \
|
|
"s=Play\r\n" \
|
|
"c=IN IP4 172.20.16.3\r\n" \
|
|
"t=0 0\r\n" \
|
|
"m=video 6000 RTP/AVP 96 98 97\r\n" \
|
|
"a=recvonly\r\n" \
|
|
"a=rtpmap:96 PS/90000\r\n" \
|
|
"a=rtpmap:98 H264/90000\r\n" \
|
|
"a=rtpmap:97 MPEG4/90000\r\n";
|
|
SrsSdp o;
|
|
HELPER_ASSERT_SUCCESS(o.parse(str));
|
|
EXPECT_STREQ("0", o.version_.c_str());
|
|
EXPECT_STREQ("64010600002020000001", o.username_.c_str());
|
|
EXPECT_STREQ("0", o.session_id_.c_str());
|
|
EXPECT_STREQ("0", o.session_version_.c_str());
|
|
EXPECT_STREQ("IN", o.nettype_.c_str());
|
|
EXPECT_STREQ("IP4", o.addrtype_.c_str());
|
|
EXPECT_STREQ("172.20.16.3", o.unicast_address_.c_str());
|
|
EXPECT_STREQ("Play", o.session_name_.c_str());
|
|
EXPECT_EQ(0, o.start_time_);
|
|
EXPECT_EQ(0, o.end_time_);
|
|
|
|
ASSERT_EQ((size_t)1, o.media_descs_.size());
|
|
const SrsMediaDesc& m = o.media_descs_.at(0);
|
|
EXPECT_STREQ("video", m.type_.c_str());
|
|
EXPECT_EQ(6000, m.port_);
|
|
EXPECT_STREQ("RTP/AVP", m.protos_.c_str());
|
|
EXPECT_EQ((size_t)3, m.payload_types_.size());
|
|
|
|
const SrsMediaPayloadType& ps = m.payload_types_.at(0);
|
|
EXPECT_EQ(96, ps.payload_type_);
|
|
EXPECT_STREQ("PS", ps.encoding_name_.c_str());
|
|
EXPECT_EQ(90000, ps.clock_rate_);
|
|
|
|
const SrsMediaPayloadType& h264 = m.payload_types_.at(1);
|
|
EXPECT_EQ(98, h264.payload_type_);
|
|
EXPECT_STREQ("H264", h264.encoding_name_.c_str());
|
|
EXPECT_EQ(90000, h264.clock_rate_);
|
|
|
|
const SrsMediaPayloadType& mpeg4 = m.payload_types_.at(2);
|
|
EXPECT_EQ(97, mpeg4.payload_type_);
|
|
EXPECT_STREQ("MPEG4", mpeg4.encoding_name_.c_str());
|
|
EXPECT_EQ(90000, mpeg4.clock_rate_);
|
|
}
|
|
|
|
VOID TEST(ProtocolGbSipTest, SipStandardOfferEncode)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
SrsSdp o;
|
|
o.version_ = "0";
|
|
o.username_ = "64010600002020000001";
|
|
o.session_id_ = "0";
|
|
o.session_version_ = "0";
|
|
o.nettype_ = "IN";
|
|
o.addrtype_ = "IP4";
|
|
o.unicast_address_ = "172.20.16.3";
|
|
o.session_name_ = "Play";
|
|
o.start_time_ = 0;
|
|
o.end_time_ = 0;
|
|
o.ice_lite_ = ""; // Disable this line.
|
|
o.connection_ = "c=IN IP4 172.20.16.3"; // Session level connection.
|
|
|
|
o.media_descs_.push_back(SrsMediaDesc("video"));
|
|
SrsMediaDesc& m = o.media_descs_.at(0);
|
|
m.port_ = 6000;
|
|
m.protos_ = "RTP/AVP";
|
|
m.connection_ = ""; // Disable media level connection.
|
|
m.recvonly_ = true;
|
|
|
|
m.payload_types_.push_back(SrsMediaPayloadType(96));
|
|
SrsMediaPayloadType& ps = m.payload_types_.at(0);
|
|
ps.encoding_name_ = "PS";
|
|
ps.clock_rate_ = 90000;
|
|
|
|
m.payload_types_.push_back(SrsMediaPayloadType(98));
|
|
SrsMediaPayloadType& h264 = m.payload_types_.at(1);
|
|
h264.encoding_name_ = "H264";
|
|
h264.clock_rate_ = 90000;
|
|
|
|
m.payload_types_.push_back(SrsMediaPayloadType(97));
|
|
SrsMediaPayloadType& mpeg4 = m.payload_types_.at(2);
|
|
mpeg4.encoding_name_ = "MPEG4";
|
|
mpeg4.clock_rate_ = 90000;
|
|
|
|
ostringstream os;
|
|
HELPER_ASSERT_SUCCESS(o.encode(os));
|
|
string ostr = os.str();
|
|
string str = \
|
|
"v=0\r\n" \
|
|
"o=64010600002020000001 0 0 IN IP4 172.20.16.3\r\n" \
|
|
"s=Play\r\n" \
|
|
"c=IN IP4 172.20.16.3\r\n" \
|
|
"t=0 0\r\n" \
|
|
"m=video 6000 RTP/AVP 96 98 97\r\n" \
|
|
"a=recvonly\r\n" \
|
|
"a=rtpmap:96 PS/90000\r\n" \
|
|
"a=rtpmap:98 H264/90000\r\n" \
|
|
"a=rtpmap:97 MPEG4/90000\r\n";
|
|
EXPECT_STREQ(ostr.c_str(), str.c_str());
|
|
}
|
|
|
|
VOID TEST(ProtocolGbSipTest, SipGb28181OfferDecode)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
string str = \
|
|
"v=0\r\n" \
|
|
"o=64010600002020000001 0 0 IN IP4 172.20.16.3\r\n" \
|
|
"s=Play\r\n" \
|
|
"c=IN IP4 172.20.16.3\r\n" \
|
|
"t=0 0\r\n" \
|
|
"m=video 6000 RTP/AVP 96 98 97\r\n" \
|
|
"a=recvonly\r\n" \
|
|
"a=rtpmap:96 PS/90000\r\n" \
|
|
"a=rtpmap:98 H264/90000\r\n" \
|
|
"a=rtpmap:97 MPEG4/90000\r\n" \
|
|
"y=0100008888\r\n";
|
|
SrsSdp o;
|
|
HELPER_ASSERT_SUCCESS(o.parse(str));
|
|
EXPECT_STREQ("0", o.version_.c_str());
|
|
EXPECT_STREQ("64010600002020000001", o.username_.c_str());
|
|
EXPECT_STREQ("0", o.session_id_.c_str());
|
|
EXPECT_STREQ("0", o.session_version_.c_str());
|
|
EXPECT_STREQ("IN", o.nettype_.c_str());
|
|
EXPECT_STREQ("IP4", o.addrtype_.c_str());
|
|
EXPECT_STREQ("172.20.16.3", o.unicast_address_.c_str());
|
|
EXPECT_STREQ("Play", o.session_name_.c_str());
|
|
EXPECT_EQ(0, o.start_time_);
|
|
EXPECT_EQ(0, o.end_time_);
|
|
|
|
ASSERT_EQ((size_t)1, o.media_descs_.size());
|
|
const SrsMediaDesc& m = o.media_descs_.at(0);
|
|
EXPECT_STREQ("video", m.type_.c_str());
|
|
EXPECT_EQ(6000, m.port_);
|
|
EXPECT_STREQ("RTP/AVP", m.protos_.c_str());
|
|
EXPECT_EQ((size_t)3, m.payload_types_.size());
|
|
ASSERT_EQ((size_t)1, m.ssrc_infos_.size());
|
|
|
|
const SrsSSRCInfo& ssrc = m.ssrc_infos_.at(0);
|
|
EXPECT_EQ((uint32_t)100008888, ssrc.ssrc_);
|
|
EXPECT_STREQ("0100008888", ssrc.cname_.c_str());
|
|
EXPECT_STREQ("gb28181", ssrc.label_.c_str());
|
|
|
|
const SrsMediaPayloadType& ps = m.payload_types_.at(0);
|
|
EXPECT_EQ(96, ps.payload_type_);
|
|
EXPECT_STREQ("PS", ps.encoding_name_.c_str());
|
|
EXPECT_EQ(90000, ps.clock_rate_);
|
|
|
|
const SrsMediaPayloadType& h264 = m.payload_types_.at(1);
|
|
EXPECT_EQ(98, h264.payload_type_);
|
|
EXPECT_STREQ("H264", h264.encoding_name_.c_str());
|
|
EXPECT_EQ(90000, h264.clock_rate_);
|
|
|
|
const SrsMediaPayloadType& mpeg4 = m.payload_types_.at(2);
|
|
EXPECT_EQ(97, mpeg4.payload_type_);
|
|
EXPECT_STREQ("MPEG4", mpeg4.encoding_name_.c_str());
|
|
EXPECT_EQ(90000, mpeg4.clock_rate_);
|
|
}
|
|
|
|
VOID TEST(ProtocolGbSipTest, SipGb28181OfferEncode)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
SrsSdp o;
|
|
o.version_ = "0";
|
|
o.username_ = "64010600002020000001";
|
|
o.session_id_ = "0";
|
|
o.session_version_ = "0";
|
|
o.nettype_ = "IN";
|
|
o.addrtype_ = "IP4";
|
|
o.unicast_address_ = "172.20.16.3";
|
|
o.session_name_ = "Play";
|
|
o.start_time_ = 0;
|
|
o.end_time_ = 0;
|
|
o.ice_lite_ = ""; // Disable this line.
|
|
o.connection_ = "c=IN IP4 172.20.16.3"; // Session level connection.
|
|
|
|
o.media_descs_.push_back(SrsMediaDesc("video"));
|
|
SrsMediaDesc& m = o.media_descs_.at(0);
|
|
m.port_ = 6000;
|
|
m.protos_ = "RTP/AVP";
|
|
m.connection_ = ""; // Disable media level connection.
|
|
m.recvonly_ = true;
|
|
|
|
m.payload_types_.push_back(SrsMediaPayloadType(96));
|
|
SrsMediaPayloadType& ps = m.payload_types_.at(0);
|
|
ps.encoding_name_ = "PS";
|
|
ps.clock_rate_ = 90000;
|
|
|
|
m.payload_types_.push_back(SrsMediaPayloadType(98));
|
|
SrsMediaPayloadType& h264 = m.payload_types_.at(1);
|
|
h264.encoding_name_ = "H264";
|
|
h264.clock_rate_ = 90000;
|
|
|
|
m.payload_types_.push_back(SrsMediaPayloadType(97));
|
|
SrsMediaPayloadType& mpeg4 = m.payload_types_.at(2);
|
|
mpeg4.encoding_name_ = "MPEG4";
|
|
mpeg4.clock_rate_ = 90000;
|
|
|
|
m.ssrc_infos_.push_back(SrsSSRCInfo());
|
|
SrsSSRCInfo& ssrc = m.ssrc_infos_.at(0);
|
|
ssrc.ssrc_ = 100008888;
|
|
ssrc.cname_ = "0100008888";
|
|
ssrc.label_ = "gb28181";
|
|
|
|
ostringstream os;
|
|
HELPER_ASSERT_SUCCESS(o.encode(os));
|
|
string ostr = os.str();
|
|
string str = \
|
|
"v=0\r\n" \
|
|
"o=64010600002020000001 0 0 IN IP4 172.20.16.3\r\n" \
|
|
"s=Play\r\n" \
|
|
"c=IN IP4 172.20.16.3\r\n" \
|
|
"t=0 0\r\n" \
|
|
"m=video 6000 RTP/AVP 96 98 97\r\n" \
|
|
"a=recvonly\r\n" \
|
|
"a=rtpmap:96 PS/90000\r\n" \
|
|
"a=rtpmap:98 H264/90000\r\n" \
|
|
"a=rtpmap:97 MPEG4/90000\r\n" \
|
|
"y=0100008888\r\n";
|
|
EXPECT_STREQ(ostr.c_str(), str.c_str());
|
|
}
|
|
|
|
VOID TEST(ProtocolGbSipTest, GbRegisterRequest)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
// See https://www.ietf.org/rfc/rfc3261.html#section-24.1
|
|
MockMSegmentsReader r;
|
|
r.in_bytes.push_back("REGISTER sip:34020000002000000001@3402000000 SIP/2.0\r\n");
|
|
r.in_bytes.push_back("Via: SIP/2.0/UDP 192.168.3.99:5060;rport;branch=z9hG4bK442003727\r\n");
|
|
r.in_bytes.push_back("From: <sip:34020000001320000001@3402000000>;tag=307202390\r\n");
|
|
r.in_bytes.push_back("To: <sip:34020000001320000001@3402000000>\r\n");
|
|
r.in_bytes.push_back("Call-ID: 393945367\r\n");
|
|
r.in_bytes.push_back("CSeq: 1 REGISTER\r\n");
|
|
r.in_bytes.push_back("Contact: <sip:34020000001320000001@192.168.3.99:5060>\r\n");
|
|
r.in_bytes.push_back("Max-Forwards: 70\r\n");
|
|
r.in_bytes.push_back("User-Agent: IP Camera\r\n");
|
|
r.in_bytes.push_back("Expires: 3600\r\n");
|
|
r.in_bytes.push_back("Content-Length: 0\r\n");
|
|
r.in_bytes.push_back("\r\n");
|
|
|
|
SrsHttpParser p;
|
|
HELPER_ASSERT_SUCCESS(p.initialize(HTTP_REQUEST));
|
|
|
|
ISrsHttpMessage* msg = NULL;
|
|
SrsAutoFree(ISrsHttpMessage, msg);
|
|
HELPER_ASSERT_SUCCESS(p.parse_message(&r, &msg));
|
|
EXPECT_EQ(HTTP_REGISTER, msg->method());
|
|
EXPECT_EQ(0, msg->content_length());
|
|
|
|
SrsSipMessage smsg;
|
|
HELPER_ASSERT_SUCCESS(smsg.parse(msg));
|
|
EXPECT_EQ(HTTP_REQUEST, smsg.type_);
|
|
EXPECT_EQ(HTTP_REGISTER, smsg.method_);
|
|
EXPECT_STREQ("sip:34020000002000000001@3402000000", smsg.request_uri_.c_str());
|
|
EXPECT_STREQ("SIP/2.0/UDP 192.168.3.99:5060;rport;branch=z9hG4bK442003727", smsg.via_.c_str());
|
|
EXPECT_STREQ("UDP", smsg.via_transport_.c_str());
|
|
EXPECT_STREQ("192.168.3.99:5060", smsg.via_send_by_.c_str());
|
|
EXPECT_STREQ("192.168.3.99", smsg.via_send_by_address_.c_str());
|
|
EXPECT_EQ(5060, smsg.via_send_by_port_);
|
|
EXPECT_STREQ("branch=z9hG4bK442003727", smsg.via_branch_.c_str());
|
|
EXPECT_STREQ("<sip:34020000001320000001@3402000000>;tag=307202390", smsg.from_.c_str());
|
|
EXPECT_STREQ("<sip:34020000001320000001@3402000000>", smsg.from_address_.c_str());
|
|
EXPECT_STREQ("34020000001320000001", smsg.from_address_user_.c_str());
|
|
EXPECT_STREQ("3402000000", smsg.from_address_host_.c_str());
|
|
EXPECT_STREQ("tag=307202390", smsg.from_tag_.c_str());
|
|
EXPECT_STREQ("<sip:34020000001320000001@3402000000>", smsg.to_.c_str());
|
|
EXPECT_STREQ("<sip:34020000001320000001@3402000000>", smsg.to_address_.c_str());
|
|
EXPECT_STREQ("34020000001320000001", smsg.to_address_user_.c_str());
|
|
EXPECT_STREQ("3402000000", smsg.to_address_host_.c_str());
|
|
EXPECT_STREQ("", smsg.to_tag_.c_str());
|
|
EXPECT_STREQ("393945367", smsg.call_id_.c_str());
|
|
EXPECT_STREQ("1 REGISTER", smsg.cseq_.c_str());
|
|
EXPECT_EQ((uint32_t)1, smsg.cseq_number_);
|
|
EXPECT_STREQ("<sip:34020000001320000001@192.168.3.99:5060>", smsg.contact_.c_str());
|
|
EXPECT_STREQ("34020000001320000001", smsg.contact_user_.c_str());
|
|
EXPECT_STREQ("192.168.3.99:5060", smsg.contact_host_.c_str());
|
|
EXPECT_STREQ("192.168.3.99", smsg.contact_host_address_.c_str());
|
|
EXPECT_EQ(5060, smsg.contact_host_port_);
|
|
EXPECT_EQ((uint32_t)70, smsg.max_forwards_);
|
|
EXPECT_EQ((uint32_t)3600, smsg.expires_);
|
|
|
|
EXPECT_STREQ(smsg.from_address_.c_str(), smsg.to_address_.c_str());
|
|
}
|
|
|
|
VOID TEST(ProtocolGbSipTest, GbRegisterResponse)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
// See https://www.ietf.org/rfc/rfc3261.html#section-24.1
|
|
MockMSegmentsReader r;
|
|
r.in_bytes.push_back("SIP/2.0 200 OK\r\n");
|
|
r.in_bytes.push_back("Via: SIP/2.0/UDP 192.168.3.99:5060;rport;branch=z9hG4bK442003727\r\n");
|
|
r.in_bytes.push_back("From: <sip:34020000001320000001@3402000000>;tag=307202390\r\n");
|
|
r.in_bytes.push_back("To: <sip:34020000001320000001@3402000000>\r\n");
|
|
r.in_bytes.push_back("Call-ID: 393945367\r\n");
|
|
r.in_bytes.push_back("CSeq: 1 REGISTER\r\n");
|
|
r.in_bytes.push_back("Contact: <sip:34020000001320000001@192.168.3.99:5060>\r\n");
|
|
r.in_bytes.push_back("User-Agent: SRS/5.0.65(Bee)\r\n");
|
|
r.in_bytes.push_back("Expires: 3600\r\n");
|
|
r.in_bytes.push_back("Content-Length: 0\r\n");
|
|
r.in_bytes.push_back("\r\n");
|
|
|
|
SrsHttpParser p;
|
|
HELPER_ASSERT_SUCCESS(p.initialize(HTTP_RESPONSE));
|
|
|
|
ISrsHttpMessage* msg = NULL;
|
|
SrsAutoFree(ISrsHttpMessage, msg);
|
|
HELPER_ASSERT_SUCCESS(p.parse_message(&r, &msg));
|
|
EXPECT_EQ(HTTP_RESPONSE, (http_parser_type) msg->message_type());
|
|
EXPECT_EQ(200, msg->status_code());
|
|
EXPECT_EQ(0, msg->content_length());
|
|
|
|
SrsSipMessage smsg;
|
|
HELPER_ASSERT_SUCCESS(smsg.parse(msg));
|
|
EXPECT_EQ(HTTP_RESPONSE, smsg.type_);
|
|
EXPECT_EQ(HTTP_STATUS_OK, smsg.status_);
|
|
EXPECT_STREQ("SIP/2.0/UDP 192.168.3.99:5060;rport;branch=z9hG4bK442003727", smsg.via_.c_str());
|
|
EXPECT_STREQ("UDP", smsg.via_transport_.c_str());
|
|
EXPECT_STREQ("192.168.3.99:5060", smsg.via_send_by_.c_str());
|
|
EXPECT_STREQ("192.168.3.99", smsg.via_send_by_address_.c_str());
|
|
EXPECT_EQ(5060, smsg.via_send_by_port_);
|
|
EXPECT_STREQ("branch=z9hG4bK442003727", smsg.via_branch_.c_str());
|
|
EXPECT_STREQ("<sip:34020000001320000001@3402000000>;tag=307202390", smsg.from_.c_str());
|
|
EXPECT_STREQ("<sip:34020000001320000001@3402000000>", smsg.from_address_.c_str());
|
|
EXPECT_STREQ("34020000001320000001", smsg.from_address_user_.c_str());
|
|
EXPECT_STREQ("3402000000", smsg.from_address_host_.c_str());
|
|
EXPECT_STREQ("tag=307202390", smsg.from_tag_.c_str());
|
|
EXPECT_STREQ("<sip:34020000001320000001@3402000000>", smsg.to_.c_str());
|
|
EXPECT_STREQ("<sip:34020000001320000001@3402000000>", smsg.to_address_.c_str());
|
|
EXPECT_STREQ("34020000001320000001", smsg.to_address_user_.c_str());
|
|
EXPECT_STREQ("3402000000", smsg.to_address_host_.c_str());
|
|
EXPECT_STREQ("", smsg.to_tag_.c_str());
|
|
EXPECT_STREQ("393945367", smsg.call_id_.c_str());
|
|
EXPECT_STREQ("1 REGISTER", smsg.cseq_.c_str());
|
|
EXPECT_EQ((uint32_t)1, smsg.cseq_number_);
|
|
EXPECT_STREQ("<sip:34020000001320000001@192.168.3.99:5060>", smsg.contact_.c_str());
|
|
EXPECT_STREQ("34020000001320000001", smsg.contact_user_.c_str());
|
|
EXPECT_STREQ("192.168.3.99:5060", smsg.contact_host_.c_str());
|
|
EXPECT_STREQ("192.168.3.99", smsg.contact_host_address_.c_str());
|
|
EXPECT_EQ(5060, smsg.contact_host_port_);
|
|
EXPECT_EQ((uint32_t)3600, smsg.expires_);
|
|
}
|
|
|
|
VOID TEST(ProtocolGbSipTest, GbInviteRequest)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
string sdp =
|
|
"v=0\r\n"
|
|
"o=34020000001320000001 0 0 IN IP4 192.168.3.82\r\n"
|
|
"s=Play\r\n"
|
|
"c=IN IP4 192.168.3.82\r\n"
|
|
"t=0 0\r\n"
|
|
"m=video 9000 TCP/RTP/AVP 96\r\n"
|
|
"a=recvonly\r\n"
|
|
"a=rtpmap:96 PS/90000\r\n"
|
|
"y=0200007585\r\n";
|
|
|
|
MockMSegmentsReader r;
|
|
r.in_bytes.push_back("INVITE sip:34020000001320000001@3402000000 SIP/2.0\r\n");
|
|
r.in_bytes.push_back("Via: SIP/2.0/TCP 192.168.3.82:5060;rport;branch=z9hG4bK0l31rx\r\n");
|
|
r.in_bytes.push_back("From: <sip:34020000002000000001@3402000000>;tag=SRSk1er282t\r\n");
|
|
r.in_bytes.push_back("To: <sip:34020000001320000001@3402000000>\r\n");
|
|
r.in_bytes.push_back("CSeq: 854 INVITE\r\n");
|
|
r.in_bytes.push_back("Call-ID: 854k7337207yxpfj\r\n");
|
|
r.in_bytes.push_back("Content-Type: application/sdp\r\n");
|
|
r.in_bytes.push_back("Contact: <sip:34020000002000000001@3402000000>\r\n");
|
|
r.in_bytes.push_back("Max-Forwards: 70\r\n");
|
|
r.in_bytes.push_back("Subject: 34020000001320000001:0200007585,34020000002000000001:0\r\n");
|
|
r.in_bytes.push_back("Server: SRS/5.0.65(Bee)\r\n");
|
|
r.in_bytes.push_back(srs_fmt("Content-Length: %d\r\n", sdp.length()));
|
|
r.in_bytes.push_back("\r\n");
|
|
r.in_bytes.push_back(sdp);
|
|
|
|
SrsHttpParser p;
|
|
HELPER_ASSERT_SUCCESS(p.initialize(HTTP_BOTH));
|
|
|
|
ISrsHttpMessage* msg = NULL;
|
|
SrsAutoFree(ISrsHttpMessage, msg);
|
|
HELPER_ASSERT_SUCCESS(p.parse_message(&r, &msg));
|
|
|
|
SrsSipMessage smsg;
|
|
HELPER_ASSERT_SUCCESS(smsg.parse(msg));
|
|
EXPECT_EQ(HTTP_REQUEST, smsg.type_);
|
|
EXPECT_EQ(HTTP_INVITE, smsg.method_);
|
|
EXPECT_STREQ("sip:34020000001320000001@3402000000", smsg.request_uri_.c_str());
|
|
EXPECT_STREQ("SIP/2.0/TCP 192.168.3.82:5060;rport;branch=z9hG4bK0l31rx", smsg.via_.c_str());
|
|
EXPECT_STREQ("TCP", smsg.via_transport_.c_str());
|
|
EXPECT_STREQ("192.168.3.82:5060", smsg.via_send_by_.c_str());
|
|
EXPECT_STREQ("192.168.3.82", smsg.via_send_by_address_.c_str());
|
|
EXPECT_EQ(5060, smsg.via_send_by_port_);
|
|
EXPECT_STREQ("branch=z9hG4bK0l31rx", smsg.via_branch_.c_str());
|
|
EXPECT_STREQ("<sip:34020000002000000001@3402000000>;tag=SRSk1er282t", smsg.from_.c_str());
|
|
EXPECT_STREQ("<sip:34020000002000000001@3402000000>", smsg.from_address_.c_str());
|
|
EXPECT_STREQ("34020000002000000001", smsg.from_address_user_.c_str());
|
|
EXPECT_STREQ("3402000000", smsg.from_address_host_.c_str());
|
|
EXPECT_STREQ("tag=SRSk1er282t", smsg.from_tag_.c_str());
|
|
EXPECT_STREQ("<sip:34020000001320000001@3402000000>", smsg.to_.c_str());
|
|
EXPECT_STREQ("<sip:34020000001320000001@3402000000>", smsg.to_address_.c_str());
|
|
EXPECT_STREQ("34020000001320000001", smsg.to_address_user_.c_str());
|
|
EXPECT_STREQ("3402000000", smsg.to_address_host_.c_str());
|
|
EXPECT_STREQ("", smsg.to_tag_.c_str());
|
|
EXPECT_STREQ("854 INVITE", smsg.cseq_.c_str());
|
|
EXPECT_EQ((uint32_t)854, smsg.cseq_number_);
|
|
EXPECT_STREQ("854k7337207yxpfj", smsg.call_id_.c_str());
|
|
EXPECT_STREQ("<sip:34020000002000000001@3402000000>", smsg.contact_.c_str());
|
|
EXPECT_STREQ("34020000002000000001", smsg.contact_user_.c_str());
|
|
EXPECT_STREQ("3402000000", smsg.contact_host_.c_str());
|
|
EXPECT_STREQ("3402000000", smsg.contact_host_address_.c_str());
|
|
EXPECT_EQ(5060, smsg.contact_host_port_);
|
|
EXPECT_EQ((uint32_t)70, smsg.max_forwards_);
|
|
EXPECT_STREQ("34020000001320000001:0200007585,34020000002000000001:0", smsg.subject_.c_str());
|
|
EXPECT_STREQ(sdp.c_str(), smsg.body_.c_str());
|
|
}
|
|
|
|
VOID TEST(ProtocolGbSipTest, GbTringResponse)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
// See https://www.ietf.org/rfc/rfc3261.html#section-24.1
|
|
MockMSegmentsReader r;
|
|
r.in_bytes.push_back("SIP/2.0 100 Trying\r\n");
|
|
r.in_bytes.push_back("Via: SIP/2.0/TCP 192.168.3.82:5060;rport=5060;branch=z9hG4bK0l31rx\r\n");
|
|
r.in_bytes.push_back("From: <sip:34020000002000000001@3402000000>;tag=SRSk1er282t\r\n");
|
|
r.in_bytes.push_back("To: <sip:34020000001320000001@3402000000>\r\n");
|
|
r.in_bytes.push_back("Call-ID: 854k7337207yxpfj\r\n");
|
|
r.in_bytes.push_back("CSeq: 854 INVITE\r\n");
|
|
r.in_bytes.push_back("User-Agent: IP Camera\r\n");
|
|
r.in_bytes.push_back("Content-Length: 0\r\n");
|
|
r.in_bytes.push_back("\r\n");
|
|
|
|
SrsHttpParser p;
|
|
HELPER_ASSERT_SUCCESS(p.initialize(HTTP_RESPONSE));
|
|
|
|
ISrsHttpMessage* msg = NULL;
|
|
SrsAutoFree(ISrsHttpMessage, msg);
|
|
HELPER_ASSERT_SUCCESS(p.parse_message(&r, &msg));
|
|
|
|
SrsSipMessage smsg;
|
|
HELPER_ASSERT_SUCCESS(smsg.parse(msg));
|
|
EXPECT_EQ(HTTP_RESPONSE, smsg.type_);
|
|
EXPECT_EQ(100, smsg.status_);
|
|
EXPECT_STREQ("SIP/2.0/TCP 192.168.3.82:5060;rport=5060;branch=z9hG4bK0l31rx", smsg.via_.c_str());
|
|
EXPECT_STREQ("TCP", smsg.via_transport_.c_str());
|
|
EXPECT_STREQ("192.168.3.82:5060", smsg.via_send_by_.c_str());
|
|
EXPECT_STREQ("192.168.3.82", smsg.via_send_by_address_.c_str());
|
|
EXPECT_EQ(5060, smsg.via_send_by_port_);
|
|
EXPECT_STREQ("branch=z9hG4bK0l31rx", smsg.via_branch_.c_str());
|
|
EXPECT_STREQ("<sip:34020000002000000001@3402000000>;tag=SRSk1er282t", smsg.from_.c_str());
|
|
EXPECT_STREQ("<sip:34020000002000000001@3402000000>", smsg.from_address_.c_str());
|
|
EXPECT_STREQ("34020000002000000001", smsg.from_address_user_.c_str());
|
|
EXPECT_STREQ("3402000000", smsg.from_address_host_.c_str());
|
|
EXPECT_STREQ("tag=SRSk1er282t", smsg.from_tag_.c_str());
|
|
EXPECT_STREQ("<sip:34020000001320000001@3402000000>", smsg.to_.c_str());
|
|
EXPECT_STREQ("<sip:34020000001320000001@3402000000>", smsg.to_address_.c_str());
|
|
EXPECT_STREQ("34020000001320000001", smsg.to_address_user_.c_str());
|
|
EXPECT_STREQ("3402000000", smsg.to_address_host_.c_str());
|
|
EXPECT_STREQ("", smsg.to_tag_.c_str());
|
|
EXPECT_STREQ("854 INVITE", smsg.cseq_.c_str());
|
|
EXPECT_EQ((uint32_t)854, smsg.cseq_number_);
|
|
EXPECT_STREQ("854k7337207yxpfj", smsg.call_id_.c_str());
|
|
EXPECT_EQ((size_t)0, smsg.body_.length());
|
|
}
|
|
|
|
VOID TEST(ProtocolGbSipTest, Gb200OkResponse)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
string sdp =
|
|
"v=0\r\n"
|
|
"o=34020000001320000001 1941 1941 IN IP4 192.168.3.99\r\n"
|
|
"s=Play\r\n"
|
|
"c=IN IP4 192.168.3.99\r\n"
|
|
"t=0 0\r\n"
|
|
"m=video 15060 TCP/RTP/AVP 96\r\n"
|
|
"a=setup:active\r\n"
|
|
"a=sendonly\r\n"
|
|
"a=rtpmap:96 PS/90000\r\n"
|
|
"a=filesize:0\r\n"
|
|
"y=0200007585\r\n";
|
|
|
|
// See https://www.ietf.org/rfc/rfc3261.html#section-24.1
|
|
MockMSegmentsReader r;
|
|
r.in_bytes.push_back("SIP/2.0 200 OK\r\n");
|
|
r.in_bytes.push_back("Via: SIP/2.0/TCP 192.168.3.82:5060;rport=5060;branch=z9hG4bK0l31rx\r\n");
|
|
r.in_bytes.push_back("From: <sip:34020000002000000001@3402000000>;tag=SRSk1er282t\r\n");
|
|
r.in_bytes.push_back("To: <sip:34020000001320000001@3402000000>\r\n");
|
|
r.in_bytes.push_back("Call-ID: 854k7337207yxpfj\r\n");
|
|
r.in_bytes.push_back("CSeq: 854 INVITE\r\n");
|
|
r.in_bytes.push_back("Contact: <sip:34020000001320000001@192.168.3.99:5060>\r\n");
|
|
r.in_bytes.push_back("Content-Type: application/sdp\r\n");
|
|
r.in_bytes.push_back("User-Agent: IP Camera\r\n");
|
|
r.in_bytes.push_back(srs_fmt("Content-Length: %d\r\n", sdp.length()));
|
|
r.in_bytes.push_back("\r\n");
|
|
r.in_bytes.push_back(sdp);
|
|
|
|
SrsHttpParser p;
|
|
HELPER_ASSERT_SUCCESS(p.initialize(HTTP_RESPONSE));
|
|
|
|
ISrsHttpMessage* msg = NULL;
|
|
SrsAutoFree(ISrsHttpMessage, msg);
|
|
HELPER_ASSERT_SUCCESS(p.parse_message(&r, &msg));
|
|
|
|
SrsSipMessage smsg;
|
|
HELPER_ASSERT_SUCCESS(smsg.parse(msg));
|
|
EXPECT_EQ(HTTP_RESPONSE, smsg.type_);
|
|
EXPECT_EQ(200, smsg.status_);
|
|
EXPECT_STREQ("SIP/2.0/TCP 192.168.3.82:5060;rport=5060;branch=z9hG4bK0l31rx", smsg.via_.c_str());
|
|
EXPECT_STREQ("TCP", smsg.via_transport_.c_str());
|
|
EXPECT_STREQ("192.168.3.82:5060", smsg.via_send_by_.c_str());
|
|
EXPECT_STREQ("192.168.3.82", smsg.via_send_by_address_.c_str());
|
|
EXPECT_EQ(5060, smsg.via_send_by_port_);
|
|
EXPECT_STREQ("branch=z9hG4bK0l31rx", smsg.via_branch_.c_str());
|
|
EXPECT_STREQ("<sip:34020000002000000001@3402000000>;tag=SRSk1er282t", smsg.from_.c_str());
|
|
EXPECT_STREQ("<sip:34020000002000000001@3402000000>", smsg.from_address_.c_str());
|
|
EXPECT_STREQ("34020000002000000001", smsg.from_address_user_.c_str());
|
|
EXPECT_STREQ("3402000000", smsg.from_address_host_.c_str());
|
|
EXPECT_STREQ("tag=SRSk1er282t", smsg.from_tag_.c_str());
|
|
EXPECT_STREQ("<sip:34020000001320000001@3402000000>", smsg.to_.c_str());
|
|
EXPECT_STREQ("<sip:34020000001320000001@3402000000>", smsg.to_address_.c_str());
|
|
EXPECT_STREQ("34020000001320000001", smsg.to_address_user_.c_str());
|
|
EXPECT_STREQ("3402000000", smsg.to_address_host_.c_str());
|
|
EXPECT_STREQ("", smsg.to_tag_.c_str());
|
|
EXPECT_STREQ("854 INVITE", smsg.cseq_.c_str());
|
|
EXPECT_EQ((uint32_t)854, smsg.cseq_number_);
|
|
EXPECT_STREQ("854k7337207yxpfj", smsg.call_id_.c_str());
|
|
EXPECT_STREQ("<sip:34020000001320000001@192.168.3.99:5060>", smsg.contact_.c_str());
|
|
EXPECT_STREQ("34020000001320000001", smsg.contact_user_.c_str());
|
|
EXPECT_STREQ("192.168.3.99:5060", smsg.contact_host_.c_str());
|
|
EXPECT_STREQ("192.168.3.99", smsg.contact_host_address_.c_str());
|
|
EXPECT_EQ(5060, smsg.contact_host_port_);
|
|
EXPECT_STREQ(sdp.c_str(), smsg.body_.c_str());
|
|
}
|
|
|
|
VOID TEST(ProtocolGbSipTest, GbAckRequest)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
MockMSegmentsReader r;
|
|
r.in_bytes.push_back("ACK sip:34020000001320000001@3402000000 SIP/2.0\r\n");
|
|
r.in_bytes.push_back("Via: SIP/2.0/TCP 192.168.3.82:5060;rport;branch=z9hG4bK9k30b6\r\n");
|
|
r.in_bytes.push_back("From: <sip:34020000002000000001@3402000000>;tag=SRSk1er282t\r\n");
|
|
r.in_bytes.push_back("To: <sip:34020000001320000001@3402000000>\r\n");
|
|
r.in_bytes.push_back("CSeq: 854 ACK\r\n");
|
|
r.in_bytes.push_back("Call-ID: 854k7337207yxpfj\r\n");
|
|
r.in_bytes.push_back("Max-Forwards: 70\r\n");
|
|
r.in_bytes.push_back("Server: SRS/5.0.65(Bee)\r\n");
|
|
r.in_bytes.push_back("Content-Length: 0\r\n");
|
|
r.in_bytes.push_back("\r\n");
|
|
|
|
SrsHttpParser p;
|
|
HELPER_ASSERT_SUCCESS(p.initialize(HTTP_BOTH));
|
|
|
|
ISrsHttpMessage* msg = NULL;
|
|
SrsAutoFree(ISrsHttpMessage, msg);
|
|
HELPER_ASSERT_SUCCESS(p.parse_message(&r, &msg));
|
|
|
|
SrsSipMessage smsg;
|
|
HELPER_ASSERT_SUCCESS(smsg.parse(msg));
|
|
EXPECT_EQ(HTTP_REQUEST, smsg.type_);
|
|
EXPECT_EQ(HTTP_ACK, smsg.method_);
|
|
EXPECT_STREQ("sip:34020000001320000001@3402000000", smsg.request_uri_.c_str());
|
|
EXPECT_STREQ("SIP/2.0/TCP 192.168.3.82:5060;rport;branch=z9hG4bK9k30b6", smsg.via_.c_str());
|
|
EXPECT_STREQ("TCP", smsg.via_transport_.c_str());
|
|
EXPECT_STREQ("192.168.3.82:5060", smsg.via_send_by_.c_str());
|
|
EXPECT_STREQ("192.168.3.82", smsg.via_send_by_address_.c_str());
|
|
EXPECT_EQ(5060, smsg.via_send_by_port_);
|
|
EXPECT_STREQ("branch=z9hG4bK9k30b6", smsg.via_branch_.c_str());
|
|
EXPECT_STREQ("<sip:34020000002000000001@3402000000>;tag=SRSk1er282t", smsg.from_.c_str());
|
|
EXPECT_STREQ("<sip:34020000002000000001@3402000000>", smsg.from_address_.c_str());
|
|
EXPECT_STREQ("34020000002000000001", smsg.from_address_user_.c_str());
|
|
EXPECT_STREQ("3402000000", smsg.from_address_host_.c_str());
|
|
EXPECT_STREQ("tag=SRSk1er282t", smsg.from_tag_.c_str());
|
|
EXPECT_STREQ("<sip:34020000001320000001@3402000000>", smsg.to_.c_str());
|
|
EXPECT_STREQ("<sip:34020000001320000001@3402000000>", smsg.to_address_.c_str());
|
|
EXPECT_STREQ("34020000001320000001", smsg.to_address_user_.c_str());
|
|
EXPECT_STREQ("3402000000", smsg.to_address_host_.c_str());
|
|
EXPECT_STREQ("", smsg.to_tag_.c_str());
|
|
EXPECT_STREQ("854 ACK", smsg.cseq_.c_str());
|
|
EXPECT_EQ((uint32_t)854, smsg.cseq_number_);
|
|
EXPECT_STREQ("854k7337207yxpfj", smsg.call_id_.c_str());
|
|
EXPECT_EQ((uint32_t)70, smsg.max_forwards_);
|
|
EXPECT_EQ((size_t)0, smsg.body_.length());
|
|
}
|
|
|
|
VOID TEST(KernelPSTest, PsPacketDecodePartialPesHeader)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
MockPsHandler handler;
|
|
SrsRecoverablePsContext context;
|
|
|
|
// A PES packet with complete header, but without enough data.
|
|
string raw = string("\x00\x00\x01\xc0\x00\x82\x8c\x80", 8);
|
|
SrsBuffer b((char*)raw.data(), raw.length());
|
|
|
|
// Should be success, for recover mode.
|
|
HELPER_ASSERT_SUCCESS(context.decode(&b, handler.clear()));
|
|
EXPECT_EQ((size_t)0, handler.msgs_.size());
|
|
EXPECT_EQ(1, context.recover_);
|
|
}
|
|
|
|
VOID TEST(KernelPSTest, PsPacketDecodePartialPesHeader2)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
MockPsHandler handler;
|
|
SrsRecoverablePsContext context;
|
|
|
|
// Ignore if PS header is not integrity.
|
|
context.ctx_.set_detect_ps_integrity(true);
|
|
|
|
// A PES packet with complete header, but without enough data.
|
|
string raw = string("\x00\x00\x01\xc0\x00\x82\x8c\x80", 8);
|
|
SrsBuffer b((char*)raw.data(), raw.length());
|
|
|
|
// Should be success, for recover mode.
|
|
HELPER_ASSERT_SUCCESS(context.decode(&b, handler.clear()));
|
|
EXPECT_EQ((size_t)0, handler.msgs_.size());
|
|
EXPECT_EQ(0, context.recover_);
|
|
|
|
// Ignored for not enough bytes.
|
|
EXPECT_EQ(0, b.pos());
|
|
}
|
|
|
|
VOID TEST(KernelPSTest, PsPacketDecodeInvalidPesHeader)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
MockPsHandler handler;
|
|
SrsRecoverablePsContext context;
|
|
|
|
// A packet with invalid PES packet.
|
|
string raw = string("\x00\x02\x00\x17\x00\x01\x80\x01", 8);
|
|
SrsBuffer b((char*)raw.data(), raw.length());
|
|
|
|
// Should be success, for recover mode.
|
|
HELPER_ASSERT_SUCCESS(context.decode(&b, handler.clear()));
|
|
EXPECT_EQ((size_t)0, handler.msgs_.size());
|
|
EXPECT_EQ(1, context.recover_);
|
|
}
|
|
|
|
VOID TEST(KernelPSTest, PsPacketDecodeInvalidRtp)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
MockPsHandler handler;
|
|
SrsRecoverablePsContext context;
|
|
|
|
// A packet with invalid RTP packet.
|
|
string raw = string("x80\x01", 2);
|
|
SrsBuffer b((char*)raw.data(), raw.length());
|
|
|
|
// Should be success, for recover mode.
|
|
HELPER_ASSERT_SUCCESS(context.decode_rtp(&b, 0, handler.clear()));
|
|
EXPECT_EQ((size_t)0, handler.msgs_.size());
|
|
EXPECT_EQ(1, context.recover_);
|
|
}
|
|
|
|
VOID TEST(KernelPSTest, PsPacketDecodeRecover)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
MockPsHandler handler;
|
|
SrsRecoverablePsContext context;
|
|
|
|
if (true) {
|
|
// A PES packet with complete header, but without enough data.
|
|
string raw = string("\x00\x00\x01\xc0\x00\x82\x8c\x80", 8);
|
|
SrsBuffer b((char*)raw.data(), raw.length());
|
|
|
|
// Should be success, for recover mode.
|
|
HELPER_ASSERT_SUCCESS(context.decode(&b, handler.clear()));
|
|
EXPECT_EQ((size_t)0, handler.msgs_.size());
|
|
EXPECT_EQ(1, context.recover_);
|
|
}
|
|
|
|
if (true) {
|
|
// Continous data, but should be dropped for recover mode.
|
|
string raw(136 - 8, 'x');
|
|
SrsBuffer b((char*)raw.data(), raw.length());
|
|
|
|
// Should be success, for recover mode.
|
|
HELPER_ASSERT_SUCCESS(context.decode(&b, handler.clear()));
|
|
EXPECT_EQ((size_t)0, handler.msgs_.size());
|
|
EXPECT_EQ(2, context.recover_);
|
|
}
|
|
|
|
if (true) {
|
|
// New PES packet with header, but should be dropped for recover mode.
|
|
string raw = string("\x00\x00\x01\xc0\x00\x82\x8c\x80", 8) + string(136 - 8, 'x');
|
|
SrsBuffer b((char*)raw.data(), raw.length());
|
|
|
|
// Should be success, for recover mode.
|
|
HELPER_ASSERT_SUCCESS(context.decode(&b, handler.clear()));
|
|
EXPECT_EQ((size_t)0, handler.msgs_.size());
|
|
EXPECT_EQ(3, context.recover_);
|
|
}
|
|
|
|
if (true) {
|
|
// New pack header, should be ok and quit recover mode.
|
|
string raw = string("\x00\x00\x01\xba\x44\x68\x6e\x4c\x94\x01\x01\x30\x13\xfe\xff\xff\x00\x00\xa0\x05", 20)
|
|
+ string("\x00\x00\x01\xc0\x00\x82\x8c\x80\x09\x21\x1a\x1b\xa3\x51\xff\xff\xff\xf8", 18) + string(118, 'x');
|
|
SrsBuffer b((char*)raw.data(), raw.length());
|
|
|
|
// Should be success, for recover mode.
|
|
HELPER_ASSERT_SUCCESS(context.decode(&b, handler.clear()));
|
|
EXPECT_EQ((size_t)1, handler.msgs_.size());
|
|
EXPECT_EQ(0, context.recover_);
|
|
}
|
|
}
|
|
|
|
VOID TEST(KernelPSTest, PsRecoverLimit)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
MockPsHandler handler;
|
|
SrsRecoverablePsContext context;
|
|
|
|
// A packet with invalid RTP packet.
|
|
for (int i = 0; i < 16; i++) {
|
|
string raw = string("x80\x01", 2);
|
|
SrsBuffer b((char*) raw.data(), raw.length());
|
|
|
|
// Should be success, for recover mode.
|
|
HELPER_ASSERT_SUCCESS(context.decode_rtp(&b, 0, handler.clear()));
|
|
EXPECT_EQ((size_t)0, handler.msgs_.size());
|
|
EXPECT_EQ(i+1, context.recover_);
|
|
}
|
|
|
|
// The last time, should fail.
|
|
string raw = string("x80\x01", 2);
|
|
SrsBuffer b((char*) raw.data(), raw.length());
|
|
|
|
// Should be fail, because exceed max recover limit.
|
|
HELPER_ASSERT_FAILED(context.decode_rtp(&b, 0, handler.clear()));
|
|
EXPECT_EQ((size_t)0, handler.msgs_.size());
|
|
EXPECT_EQ(17, context.recover_);
|
|
}
|
|
|
|
VOID TEST(KernelPSTest, PsRecoverLimit2)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
MockPsHandler handler;
|
|
SrsRecoverablePsContext context;
|
|
|
|
// A packet with invalid PES packet.
|
|
for (int i = 0; i < 16; i++) {
|
|
string raw = string("\x00\x02\x00\x17\x00\x01\x80\x01", 8);
|
|
SrsBuffer b((char*)raw.data(), raw.length());
|
|
|
|
// Should be success, for recover mode.
|
|
HELPER_ASSERT_SUCCESS(context.decode_rtp(&b, 0, handler.clear()));
|
|
EXPECT_EQ((size_t)0, handler.msgs_.size());
|
|
EXPECT_EQ(i+1, context.recover_);
|
|
}
|
|
|
|
// The last time, should fail.
|
|
string raw = string("\x00\x02\x00\x17\x00\x01\x80\x01", 8);
|
|
SrsBuffer b((char*)raw.data(), raw.length());
|
|
|
|
// Should be fail, because exceed max recover limit.
|
|
HELPER_ASSERT_FAILED(context.decode_rtp(&b, 0, handler.clear()));
|
|
EXPECT_EQ((size_t)0, handler.msgs_.size());
|
|
EXPECT_EQ(17, context.recover_);
|
|
}
|
|
|
|
VOID TEST(KernelPSTest, PsNoRecoverLargeLength)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
MockPsHandler handler;
|
|
SrsRecoverablePsContext context;
|
|
|
|
// A packet with large RTP packet.
|
|
string raw = string(1501, 'x');
|
|
SrsBuffer b((char*)raw.data(), raw.length());
|
|
|
|
// Should be success, for recover mode.
|
|
HELPER_ASSERT_FAILED(context.decode_rtp(&b, 0, &handler));
|
|
EXPECT_EQ((size_t)0, handler.msgs_.size());
|
|
EXPECT_EQ(1, context.recover_);
|
|
}
|
|
|
|
VOID TEST(KernelPSTest, PsSkipUtilPack)
|
|
{
|
|
if (true) {
|
|
string raws[] = {
|
|
string("\x00\x00\x01\xba", 4),
|
|
string("\xaa\x00\x00\x01\xba", 5),
|
|
string("\x00\x00\x00\x01\xba", 5),
|
|
string("\x01\x00\x00\x01\xba", 5),
|
|
string("\xaa\xaa\x00\x00\x01\xba", 6),
|
|
string("\x00\x00\x00\x00\x01\xba", 6),
|
|
string("\x00\x01\x00\x00\x01\xba", 6),
|
|
string("\x01\x00\x00\x00\x01\xba", 6),
|
|
string("\xaa\xaa\xaa\x00\x00\x01\xba", 7),
|
|
string("\x00\x00\x00\x00\x00\x01\xba", 7),
|
|
string("\x00\x00\x01\x00\x00\x01\xba", 7),
|
|
string("\x00\x01\x00\x00\x00\x01\xba", 7),
|
|
string("\x01\x00\x00\x00\x00\x01\xba", 7),
|
|
string("\xaa\xaa\xaa\xaa\x00\x00\x01\xba", 8),
|
|
string("\x00\x00\x00\x00\x00\x00\x01\xba", 8),
|
|
string("\x00\x00\x00\x01\x00\x00\x01\xba", 8),
|
|
string("\x00\x00\x01\x00\x00\x00\x01\xba", 8),
|
|
string("\x00\x01\x00\x00\x00\x00\x01\xba", 8),
|
|
string("\x01\x00\x00\x00\x00\x00\x01\xba", 8),
|
|
};
|
|
for (int i = 0; i < (int)(sizeof(raws) / sizeof(string)); i++) {
|
|
string raw = raws[i];
|
|
SrsBuffer b((char*) raw.data(), raw.length());
|
|
EXPECT_TRUE(srs_skip_util_pack(&b));
|
|
}
|
|
}
|
|
|
|
if (true) {
|
|
string raws[] = {
|
|
string(8, '\x00') + string(4, '\xaa'),
|
|
string(7, '\x00') + string(4, '\xaa'),
|
|
string(6, '\x00') + string(4, '\xaa'),
|
|
string(5, '\x00') + string(4, '\xaa'),
|
|
string(4, '\x00') + string(4, '\xaa'),
|
|
string(3, '\x00') + string(4, '\xaa'),
|
|
string(2, '\x00') + string(4, '\xaa'),
|
|
string(1, '\x00') + string(4, '\xaa'),
|
|
string(1, '\x00') + string(3, '\xaa'),
|
|
string(1, '\x00') + string(2, '\xaa'),
|
|
string(1, '\x00') + string(1, '\xaa'),
|
|
string(1, '\x00'),
|
|
string(8, '\x00'), string(8, '\x01'), string(8, '\xaa'),
|
|
string(7, '\x00'), string(7, '\x01'), string(7, '\xaa'),
|
|
string(6, '\x00'), string(6, '\x01'), string(6, '\xaa'),
|
|
string(5, '\x00'), string(5, '\x01'), string(5, '\xaa'),
|
|
string(4, '\x00'), string(4, '\x01'), string(4, '\xaa'),
|
|
string(3, '\x00'), string(3, '\x01'), string(3, '\xaa'),
|
|
string(2, '\x00'), string(2, '\x01'), string(2, '\xaa'),
|
|
string(1, '\x00'), string(1, '\x01'), string(1, '\xaa'),
|
|
};
|
|
for (int i = 0; i < (int)(sizeof(raws) / sizeof(string)); i++) {
|
|
string raw = raws[i];
|
|
SrsBuffer b((char*) raw.data(), raw.length());
|
|
EXPECT_FALSE(srs_skip_util_pack(&b));
|
|
}
|
|
}
|
|
|
|
if (true) {
|
|
SrsBuffer b(NULL, 0);
|
|
EXPECT_FALSE(srs_skip_util_pack(&b));
|
|
}
|
|
}
|
|
|
|
VOID TEST(KernelPSTest, PsPacketDecodeRegularMessage)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
MockPsHandler handler;
|
|
SrsRecoverablePsContext context;
|
|
|
|
// PT=DynamicRTP-Type-96, SSRC=0xBEBD135, Seq=31916, Time=95652000
|
|
SrsRtpPacket rtp;
|
|
string raw = string(
|
|
"\x80\x60\x7c\xac\x05\xb3\x88\xa0\x0b\xeb\xd1\x35\x00\x00\x01\xc0" \
|
|
"\x00\x6e\x8c\x80\x07\x25\x8a\x6d\xa9\xfd\xff\xf8\xff\xf9\x50\x40" \
|
|
"\x0c\x9f\xfc\x01\x3a\x2e\x98\x28\x18\x0a\x09\x84\x81\x60\xc0\x50" \
|
|
"\x2a\x12\x13\x05\x02\x22\x00\x88\x4c\x40\x11\x09\x85\x02\x61\x10" \
|
|
"\xa8\x40\x00\x00\x00\x1f\xa6\x8d\xef\x03\xca\xf0\x63\x7f\x02\xe2" \
|
|
"\x1d\x7f\xbf\x3e\x22\xbe\x3d\xf7\xa2\x7c\xba\xe6\xc8\xfb\x35\x9f" \
|
|
"\xd1\xa2\xc4\xaa\xc5\x3d\xf6\x67\xfd\xc6\x39\x06\x9f\x9e\xdf\x9b" \
|
|
"\x10\xd7\x4f\x59\xfd\xef\xea\xee\xc8\x4c\x40\xe5\xd9\xed\x00\x1c", 128);
|
|
SrsBuffer b2((char*) raw.data(), raw.length());
|
|
HELPER_ASSERT_SUCCESS(rtp.decode(&b2));
|
|
|
|
SrsRtpRawPayload* rtp_raw = dynamic_cast<SrsRtpRawPayload*>(rtp.payload());
|
|
SrsBuffer b((char*)rtp_raw->payload, rtp_raw->nn_payload);
|
|
|
|
// Should be success, for recover mode.
|
|
HELPER_ASSERT_SUCCESS(context.decode(&b, &handler));
|
|
ASSERT_EQ((size_t)1, handler.msgs_.size());
|
|
EXPECT_EQ(0, context.recover_);
|
|
|
|
SrsTsMessage* m = handler.msgs_.front();
|
|
EXPECT_EQ(SrsTsPESStreamIdAudioCommon, m->sid);
|
|
EXPECT_EQ(100, m->PES_packet_length);
|
|
}
|
|
|
|
VOID TEST(KernelPSTest, PsPacketDecodeRegularMessage2)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
MockPsHandler handler;
|
|
SrsRecoverablePsContext context;
|
|
|
|
// PT=DynamicRTP-Type-96, SSRC=0xBEBD135, Seq=31916, Time=95652000
|
|
SrsRtpPacket rtp;
|
|
string raw = string(
|
|
"\x80\x60\x7c\xac\x05\xb3\x88\xa0\x0b\xeb\xd1\x35\x00\x00\x01\xc0" \
|
|
"\x00\x6e\x8c\x80\x07\x25\x8a\x6d\xa9\xfd\xff\xf8\xff\xf9\x50\x40" \
|
|
"\x0c\x9f\xfc\x01\x3a\x2e\x98\x28\x18\x0a\x09\x84\x81\x60\xc0\x50" \
|
|
"\x2a\x12\x13\x05\x02\x22\x00\x88\x4c\x40\x11\x09\x85\x02\x61\x10" \
|
|
"\xa8\x40\x00\x00\x00\x1f\xa6\x8d\xef\x03\xca\xf0\x63\x7f\x02\xe2" \
|
|
"\x1d\x7f\xbf\x3e\x22\xbe\x3d\xf7\xa2\x7c\xba\xe6\xc8\xfb\x35\x9f" \
|
|
"\xd1\xa2\xc4\xaa\xc5\x3d\xf6\x67\xfd\xc6\x39\x06\x9f\x9e\xdf\x9b" \
|
|
"\x10\xd7\x4f\x59\xfd\xef\xea\xee\xc8\x4c\x40\xe5\xd9\xed\x00\x1c", 128);
|
|
SrsBuffer b((char*) raw.data(), raw.length());
|
|
|
|
// Should be success, for recover mode.
|
|
HELPER_ASSERT_SUCCESS(context.decode_rtp(&b, 0, &handler));
|
|
ASSERT_EQ((size_t)1, handler.msgs_.size());
|
|
EXPECT_EQ(0, context.recover_);
|
|
|
|
SrsTsMessage* m = handler.msgs_.front();
|
|
EXPECT_EQ(SrsTsPESStreamIdAudioCommon, m->sid);
|
|
EXPECT_EQ(100, m->PES_packet_length);
|
|
}
|
|
|
|
VOID TEST(KernelPSTest, PsPacketDecodeRegularMessage3)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
MockPsHandler handler;
|
|
SrsRecoverablePsContext context;
|
|
|
|
// PT=DynamicRTP-Type-96, SSRC=0xBEBD135, Seq=31916, Time=95652000
|
|
SrsRtpPacket rtp;
|
|
string raw = string(
|
|
"\x00\x00\x01\xc0\x80\x60\x7c\xac\x05\xb3\x88\xa0\x0b\xeb\xd1\x35" \
|
|
"\x00\x6e\x8c\x80\x07\x25\x8a\x6d\xa9\xfd\xff\xf8\xff\xf9\x50\x40" \
|
|
"\x0c\x9f\xfc\x01\x3a\x2e\x98\x28\x18\x0a\x09\x84\x81\x60\xc0\x50" \
|
|
"\x2a\x12\x13\x05\x02\x22\x00\x88\x4c\x40\x11\x09\x85\x02\x61\x10" \
|
|
"\xa8\x40\x00\x00\x00\x1f\xa6\x8d\xef\x03\xca\xf0\x63\x7f\x02\xe2" \
|
|
"\x1d\x7f\xbf\x3e\x22\xbe\x3d\xf7\xa2\x7c\xba\xe6\xc8\xfb\x35\x9f" \
|
|
"\xd1\xa2\xc4\xaa\xc5\x3d\xf6\x67\xfd\xc6\x39\x06\x9f\x9e\xdf\x9b" \
|
|
"\x10\xd7\x4f\x59\xfd\xef\xea\xee\xc8\x4c\x40\xe5\xd9\xed\x00\x1c", 128);
|
|
SrsBuffer b((char*) raw.data(), raw.length());
|
|
|
|
// Should be success, for recover mode.
|
|
HELPER_ASSERT_SUCCESS(context.decode_rtp(&b, 4, &handler));
|
|
ASSERT_EQ((size_t)1, handler.msgs_.size());
|
|
EXPECT_EQ(0, context.recover_);
|
|
|
|
SrsTsMessage* m = handler.msgs_.front();
|
|
EXPECT_EQ(SrsTsPESStreamIdAudioCommon, m->sid);
|
|
EXPECT_EQ(100, m->PES_packet_length);
|
|
}
|
|
|
|
VOID TEST(KernelPSTest, PsPacketDecodeInvalidStartCode)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
// PS: Enter recover=1, seq=31914, ts=95648400, pt=96, pack=31813, pack-msgs=6, sopm=31913,
|
|
// bytes=[00 02 00 17 00 01 80 01], pos=0, left=96 for err
|
|
// code=4048(GbPsHeader)(Invalid PS header for GB28181) : decode pack : decode : Invalid PS stream 0 0x2 0
|
|
//
|
|
// thread [2378][ha430859]: decode() [src/app/srs_app_gb28181.cpp:1631][errno=35]
|
|
// thread [2378][ha430859]: decode() [src/kernel/srs_kernel_ps.cpp:76][errno=35]
|
|
// thread [2378][ha430859]: do_decode() [src/kernel/srs_kernel_ps.cpp:145][errno=35]
|
|
|
|
MockPsHandler handler;
|
|
SrsRecoverablePsContext context;
|
|
|
|
// PT=DynamicRTP-Type-96, SSRC=0xBEBD135, Seq=31813, Time=95648400
|
|
if (true) {
|
|
string raw = string(
|
|
"\x00\x00\x01\xba" \
|
|
"\x56\x29\xb6\x04\xd4\x01\x09\xc3\x47\xfe\xff\xff\x01\x78\x46\xc7" \
|
|
"\x00\x00\x01\xbb\x00\x12\x84\xe1\xa3\x04\xe1\x7f\xe0\xe0\x80\xc0" \
|
|
"\xc0\x08\xbd\xe0\x80\xbf\xe0\x80\x00\x00\x01\xbc\x00\x5e\xe0\xff" \
|
|
"\x00\x24\x40\x0e\x48\x4b\x01\x00\x16\x9f\x21\xb6\x6b\x77\x00\xff" \
|
|
"\xff\xff\x41\x12\x48\x4b\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09" \
|
|
"\x0a\x0b\x0c\x0d\x0e\x0f\x00\x30\x1b\xe0\x00\x1c\x42\x0e\x07\x10" \
|
|
"\x10\xea\x0a\x00\x05\xa0\x11\x30\x00\x00\x1c\x21\x2a\x0a\x7f\xff" \
|
|
"\x00\x00\x07\x08\x1f\xfe\x40\xb4\x0f\xc0\x00\x0c\x43\x0a\x00\x90" \
|
|
"\xfe\x02\xb1\x13\x01\xf4\x03\xff\x51\x2b\xe5\x9b\x00\x00\x01\xe0" \
|
|
"\x00\x2a\x8c\x80\x0a\x25\x8a\x6d\x81\x35\xff\xff\xff\xff\xfc\x00" \
|
|
"\x00\x00\x01\x67\x4d\x00\x32\x9d\xa8\x0a\x00\x2d\x69\xb8\x08\x08" \
|
|
"\x0a\x00\x00\x03\x00\x02\x00\x00\x03\x00\x65\x08\x00\x00\x01\xe0" \
|
|
"\x00\x0e\x8c\x00\x03\xff\xff\xfc\x00\x00\x00\x01\x68\xee\x3c\x80" \
|
|
"\x00\x00\x01\xe0\x00\x0e\x8c\x00\x02\xff\xfc\x00\x00\x00\x01\x06" \
|
|
"\xe5\x01\xfb\x80\x00\x00\x01\xe0\xff\xc6\x8c\x00\x03\xff\xff\xfd" \
|
|
"\x00\x00\x00\x01\x65\xb8\x00\x00\x03\x02\x98\x24\x13\xff\xf2\x82", 1400-1140) + string(1140, 'x');
|
|
SrsBuffer b((char*) raw.data(), raw.length());
|
|
|
|
// Should be success, for recover mode.
|
|
HELPER_ASSERT_SUCCESS(context.decode(&b, &handler));
|
|
ASSERT_EQ((size_t)3, handler.msgs_.size());
|
|
EXPECT_EQ(0, context.recover_);
|
|
|
|
SrsTsMessage* last = context.ctx_.last_;
|
|
ASSERT_EQ(65472, last->PES_packet_length);
|
|
ASSERT_EQ(1156, last->payload->length());
|
|
}
|
|
|
|
// Seq 31814 to 31858, 45*1400=63000, left is 65472-1156-63000=1316 bytes in next packet(seq=31859).
|
|
for (int i = 0; i <= 31858 - 31814; i++) {
|
|
string raw(1400, 'x');
|
|
SrsBuffer b((char*) raw.data(), raw.length());
|
|
|
|
HELPER_ASSERT_SUCCESS(context.decode(&b, &handler));
|
|
ASSERT_EQ((size_t)3, handler.msgs_.size()); // We don't clear handler, so there must be 3 messages.
|
|
EXPECT_EQ(0, context.recover_);
|
|
|
|
SrsTsMessage* last = context.ctx_.last_;
|
|
ASSERT_EQ(65472, last->PES_packet_length);
|
|
ASSERT_EQ(1156 + 1400 * (i + 1), last->payload->length());
|
|
}
|
|
if (true) {
|
|
SrsTsMessage* last = context.ctx_.last_;
|
|
ASSERT_EQ(65472, last->PES_packet_length);
|
|
ASSERT_EQ(64156, last->payload->length());
|
|
}
|
|
|
|
// PT=DynamicRTP-Type-96, SSRC=0xBEBD135, Seq=31859, Time=95648400 [TCP segment of a reassembled PDU]
|
|
if (true) {
|
|
string raw = string(1312, 'x') + string(
|
|
"\x1a\x67\xe4\x00" /* last 1312+4=1316 bytes for previous video frame */ \
|
|
"\x00\x00\x01\xe0\xff\xc6\x88\x00\x03\xff\xff\xff" \
|
|
"\x7a\xc3\x59\x8e\x08\x09\x39\x7d\x56\xa5\x97\x2e\xf5\xc6\x7e\x2c" \
|
|
"\xb8\xd3\x7f\x4b\x57\x6a\xba\x7a\x75\xd0\xb9\x95\x19\x61\x13\xd5" \
|
|
"\x21\x8c\x88\x62\x62\x4c\xa8\x3c\x0e\x2e\xe6\x2b\x3d\xf0\x9a\x8e" \
|
|
"\xb3\xbc\xe1\xe7\x52\x79\x4b\x14\xa9\x8e\xf0\x78\x38\xf4\xb6\x27" \
|
|
"\x62\x4f\x97\x89\x87\xc8\x8f\x6c", 88);
|
|
SrsBuffer b((char*) raw.data(), raw.length());
|
|
|
|
// Should be success, for recover mode.
|
|
HELPER_ASSERT_SUCCESS(context.decode(&b, &handler));
|
|
ASSERT_EQ((size_t)4, handler.msgs_.size());
|
|
EXPECT_EQ(0, context.recover_);
|
|
|
|
SrsTsMessage* last = context.ctx_.last_;
|
|
ASSERT_EQ(65472, last->PES_packet_length);
|
|
ASSERT_EQ(72, last->payload->length());
|
|
}
|
|
|
|
// Seq 31860 to 31905, 46*1400=64400, left is 65472-72-64400=1000 bytes in next packet(seq=31906).
|
|
for (int i = 0; i <= 31905 - 31860; i++) {
|
|
string raw(1400, 'x');
|
|
SrsBuffer b((char*) raw.data(), raw.length());
|
|
|
|
HELPER_ASSERT_SUCCESS(context.decode(&b, &handler));
|
|
ASSERT_EQ((size_t)4, handler.msgs_.size()); // We don't clear handler, so there must be 4 messages.
|
|
EXPECT_EQ(0, context.recover_);
|
|
|
|
SrsTsMessage* last = context.ctx_.last_;
|
|
ASSERT_EQ(65472, last->PES_packet_length);
|
|
ASSERT_EQ(72 + 1400 * (i + 1), last->payload->length());
|
|
}
|
|
if (true) {
|
|
SrsTsMessage* last = context.ctx_.last_;
|
|
ASSERT_EQ(65472, last->PES_packet_length);
|
|
ASSERT_EQ(64472, last->payload->length());
|
|
}
|
|
|
|
// PT=DynamicRTP-Type-96, SSRC=0xBEBD135, Seq=31906, Time=95648400 [TCP segment of a reassembled PDU]
|
|
if (true) {
|
|
string raw = string(992, 'x') + string(
|
|
"\x28\xa9\x68\x46\x6f\xaf\x11\x9e" /* last 992+8=1000 bytes for previous video frame */ \
|
|
"\x00\x00\x01\xe0\x27\xc2\x88\x00" \
|
|
"\x03\xff\xff\xfa\x05\xcb\xbc\x6f\x7b\x70\x13\xbc\xc1\xc8\x9a\x7d" \
|
|
"\x13\x09\x6d\x17\x78\xb7\xaf\x95\x23\xa6\x25\x40\xc0\xdf\x8b\x7e", 48) + string(360, 'x');
|
|
SrsBuffer b((char*) raw.data(), raw.length());
|
|
|
|
// Should be success, for recover mode.
|
|
HELPER_ASSERT_SUCCESS(context.decode(&b, &handler));
|
|
ASSERT_EQ((size_t)5, handler.msgs_.size());
|
|
EXPECT_EQ(0, context.recover_);
|
|
|
|
SrsTsMessage* last = context.ctx_.last_;
|
|
ASSERT_EQ(10172, last->PES_packet_length);
|
|
ASSERT_EQ(388, last->payload->length());
|
|
}
|
|
|
|
// Seq 31907 to 31912, 6*1400=8400, left is 10172-388-8400=1384 bytes in next packet(seq=31913).
|
|
for (int i = 0; i <= 31912 - 31907; i++) {
|
|
string raw(1400, 'x');
|
|
SrsBuffer b((char*) raw.data(), raw.length());
|
|
|
|
HELPER_ASSERT_SUCCESS(context.decode(&b, &handler));
|
|
ASSERT_EQ((size_t)5, handler.msgs_.size()); // We don't clear handler, so there must be 5 messages.
|
|
EXPECT_EQ(0, context.recover_);
|
|
|
|
SrsTsMessage* last = context.ctx_.last_;
|
|
ASSERT_EQ(10172, last->PES_packet_length);
|
|
ASSERT_EQ(388 + 1400 * (i + 1), last->payload->length());
|
|
}
|
|
if (true) {
|
|
SrsTsMessage* last = context.ctx_.last_;
|
|
ASSERT_EQ(10172, last->PES_packet_length);
|
|
ASSERT_EQ(8788, last->payload->length());
|
|
}
|
|
|
|
// PT=DynamicRTP-Type-96, SSRC=0xBEBD135, Seq=31913, Time=95648400
|
|
if (true) {
|
|
string raw = string(1376, 'x') + string(
|
|
"\x02\xf0\x42\x42\x74\xe3\x1c\x20" /* last 1376+8=1384 bytes for previous video frame */ \
|
|
"\x00\x00\x01\xbd\x00\x6a\x8c\x80" \
|
|
"\x07\x25\x8a\x6d\x81\x35\xff\xf8", 24);
|
|
SrsBuffer b((char*) raw.data(), raw.length());
|
|
|
|
// Should be success, for recover mode.
|
|
HELPER_ASSERT_SUCCESS(context.decode(&b, &handler));
|
|
ASSERT_EQ((size_t)6, handler.msgs_.size());
|
|
EXPECT_EQ(0, context.recover_);
|
|
|
|
SrsTsMessage* last = context.ctx_.last_;
|
|
ASSERT_EQ(96, last->PES_packet_length);
|
|
ASSERT_EQ(0, last->payload->length());
|
|
}
|
|
|
|
// Seq 31914, 96 bytes
|
|
if (true) {
|
|
string raw = string(
|
|
"\x00\x02\x00\x17\x00\x01\x80\x01\x78\xff\x46\xc7\xe0\xf1\xf0\x50" \
|
|
"\x49\x6c\x65\xc2\x19\x2b\xae\x38\xd1\xa7\x08\x00\x82\x60\x16\x39" \
|
|
"\xa6\x6b\xa7\x03\x8e\x8d\xff\x3c\xe2\xa9\x80\xac\x09\x06\x60\xc9" \
|
|
"\x12\x0f\xb2\xf7\xb7\x40\x3b\x49\xb8\x75\x6b\x70\x2c\x03\xb4\x1a" \
|
|
"\x12\x0f\xb2\xf7\xb7\x40\x3b\x49\xb8\x75\x6b\x70\x2c\x03\xb4\x1a" \
|
|
"\xa2\x15\x7a\x9e\x83\x7a\xee\xb1\xd6\x64\xdf\x7e\x11\x9c\xb9\xe9", 96);
|
|
SrsBuffer b((char*) raw.data(), raw.length());
|
|
|
|
// Should be success, for recover mode.
|
|
HELPER_ASSERT_SUCCESS(context.decode(&b, &handler));
|
|
ASSERT_EQ((size_t)6, handler.msgs_.size()); // Private Stream is dropped, so there should be still 6 messages.
|
|
EXPECT_EQ(0, context.recover_);
|
|
}
|
|
}
|
|
|
|
VOID TEST(KernelPSTest, PsPacketDecodePartialPayload)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
MockPsHandler handler;
|
|
SrsRecoverablePsContext context;
|
|
|
|
if (true) {
|
|
string raw = string(
|
|
"\x00\x00\x01\xbd\x00\x6a" /* PES header */ \
|
|
"\x8c\x80\x07\x25\x8a\x6d\x81\x35\xff\xf8" /* PES header data */, 16);
|
|
SrsBuffer b((char*) raw.data(), raw.length());
|
|
|
|
// Should be success, for recover mode.
|
|
HELPER_ASSERT_SUCCESS(context.decode(&b, &handler));
|
|
ASSERT_EQ((size_t)0, handler.msgs_.size()); // Drop Private Stream message.
|
|
EXPECT_EQ(0, context.recover_);
|
|
}
|
|
|
|
if (true) {
|
|
string raw = string(
|
|
/* Bellow is PES packet payload, 96 bytes */ \
|
|
"\x00\x02\x00\x17\x00\x01\x80\x01\x78\xff\x46\xc7\xe0\xf1\xf0\x50" \
|
|
"\x49\x6c\x65\xc2\x19\x2b\xae\x38\xd1\xa7\x08\x00\x82\x60\x16\x39" \
|
|
"\xa6\x6b\xa7\x03\x8e\x8d\xff\x3c\xe2\xa9\x80\xac\x09\x06\x60\xc9" \
|
|
"\x12\x0f\xb2\xf7\xb7\x40\x3b\x49\xb8\x75\x6b\x70\x2c\x03\xb4\x1a" \
|
|
"\x12\x0f\xb2\xf7\xb7\x40\x3b\x49\xb8\x75\x6b\x70\x2c\x03\xb4\x1a" \
|
|
"\xa2\x15\x7a\x9e\x83\x7a\xee\xb1\xd6\x64\xdf\x7e\x11\x9c\xb9\xe9", 96);
|
|
SrsBuffer b((char*) raw.data(), raw.length());
|
|
|
|
// Should be success, for recover mode.
|
|
HELPER_ASSERT_SUCCESS(context.decode(&b, &handler));
|
|
ASSERT_EQ((size_t)0, handler.msgs_.size()); // Drop Private Stream message.
|
|
EXPECT_EQ(0, context.recover_);
|
|
}
|
|
}
|
|
|
|
VOID TEST(KernelPSTest, PsPacketDecodePrivateStream)
|
|
{
|
|
srs_error_t err = srs_success;
|
|
|
|
MockPsHandler handler;
|
|
SrsRecoverablePsContext context;
|
|
|
|
string raw = string(
|
|
"\x00\x00\x01\xbd\x00\x6a" /* PES header */ \
|
|
"\x8c\x80\x07\x25\x8a\x6d\x81\x35\xff\xf8" /* PES header data */ \
|
|
/* Bellow is PES packet payload, 96 bytes */ \
|
|
"\x00\x02\x00\x17\x00\x01\x80\x01\x78\xff\x46\xc7\xe0\xf1\xf0\x50" \
|
|
"\x49\x6c\x65\xc2\x19\x2b\xae\x38\xd1\xa7\x08\x00\x82\x60\x16\x39" \
|
|
"\xa6\x6b\xa7\x03\x8e\x8d\xff\x3c\xe2\xa9\x80\xac\x09\x06\x60\xc9" \
|
|
"\x12\x0f\xb2\xf7\xb7\x40\x3b\x49\xb8\x75\x6b\x70\x2c\x03\xb4\x1a" \
|
|
"\x12\x0f\xb2\xf7\xb7\x40\x3b\x49\xb8\x75\x6b\x70\x2c\x03\xb4\x1a" \
|
|
"\xa2\x15\x7a\x9e\x83\x7a\xee\xb1\xd6\x64\xdf\x7e\x11\x9c\xb9\xe9", 16+96);
|
|
SrsBuffer b((char*) raw.data(), raw.length());
|
|
|
|
// Should be success, for recover mode.
|
|
HELPER_ASSERT_SUCCESS(context.decode(&b, &handler));
|
|
ASSERT_EQ((size_t)0, handler.msgs_.size()); // Drop Private Stream message.
|
|
EXPECT_EQ(0, context.recover_);
|
|
}
|
|
|