AI: Add utests to cover app rtc module. (#4498)
Co-authored-by: OSSRS-AI <winlinam@gmail.com>
This commit is contained in:
parent
04b88e889f
commit
e999de09ea
25
trunk/configure
vendored
25
trunk/configure
vendored
|
|
@ -237,8 +237,8 @@ fi
|
||||||
MODULE_ID="CORE"
|
MODULE_ID="CORE"
|
||||||
MODULE_DEPENDS=()
|
MODULE_DEPENDS=()
|
||||||
ModuleLibIncs=(${SRS_OBJS})
|
ModuleLibIncs=(${SRS_OBJS})
|
||||||
MODULE_FILES=("srs_core" "srs_core_version" "srs_core_version7" "srs_core_autofree" "srs_core_performance"
|
MODULE_FILES=("srs_core" "srs_core_version" "srs_core_version7" "srs_core_autofree"
|
||||||
"srs_core_time" "srs_core_platform" "srs_core_deprecated")
|
"srs_core_time" "srs_core_platform" "srs_core_deprecated" "srs_core_performance")
|
||||||
CORE_INCS="src/core"; MODULE_DIR=${CORE_INCS} . $SRS_WORKDIR/auto/modules.sh
|
CORE_INCS="src/core"; MODULE_DIR=${CORE_INCS} . $SRS_WORKDIR/auto/modules.sh
|
||||||
CORE_OBJS="${MODULE_OBJS[@]}"
|
CORE_OBJS="${MODULE_OBJS[@]}"
|
||||||
#
|
#
|
||||||
|
|
@ -248,10 +248,10 @@ MODULE_DEPENDS=("CORE")
|
||||||
ModuleLibIncs=(${SRS_OBJS} ${LibSSLRoot})
|
ModuleLibIncs=(${SRS_OBJS} ${LibSSLRoot})
|
||||||
MODULE_FILES=("srs_kernel_error" "srs_kernel_log" "srs_kernel_buffer"
|
MODULE_FILES=("srs_kernel_error" "srs_kernel_log" "srs_kernel_buffer"
|
||||||
"srs_kernel_utility" "srs_kernel_flv" "srs_kernel_codec" "srs_kernel_io"
|
"srs_kernel_utility" "srs_kernel_flv" "srs_kernel_codec" "srs_kernel_io"
|
||||||
"srs_kernel_consts" "srs_kernel_aac" "srs_kernel_mp3" "srs_kernel_ts" "srs_kernel_ps"
|
"srs_kernel_consts" "srs_kernel_aac" "srs_kernel_mp3" "srs_kernel_ts"
|
||||||
"srs_kernel_stream" "srs_kernel_balance" "srs_kernel_mp4" "srs_kernel_file"
|
"srs_kernel_stream" "srs_kernel_balance" "srs_kernel_mp4" "srs_kernel_file"
|
||||||
"srs_kernel_kbps" "srs_kernel_rtc_rtp" "srs_kernel_rtc_rtcp" "srs_kernel_packet"
|
"srs_kernel_kbps" "srs_kernel_rtc_rtp" "srs_kernel_rtc_rtcp" "srs_kernel_packet"
|
||||||
"srs_kernel_st" "srs_kernel_factory" "srs_kernel_hourglass"
|
"srs_kernel_st" "srs_kernel_factory" "srs_kernel_hourglass" "srs_kernel_ps"
|
||||||
"srs_kernel_pithy_print" "srs_kernel_rtc_queue" "srs_kernel_resource")
|
"srs_kernel_pithy_print" "srs_kernel_rtc_queue" "srs_kernel_resource")
|
||||||
KERNEL_INCS="src/kernel"; MODULE_DIR=${KERNEL_INCS} . $SRS_WORKDIR/auto/modules.sh
|
KERNEL_INCS="src/kernel"; MODULE_DIR=${KERNEL_INCS} . $SRS_WORKDIR/auto/modules.sh
|
||||||
KERNEL_OBJS="${MODULE_OBJS[@]}"
|
KERNEL_OBJS="${MODULE_OBJS[@]}"
|
||||||
|
|
@ -261,8 +261,8 @@ MODULE_ID="PROTOCOL"
|
||||||
MODULE_DEPENDS=("CORE" "KERNEL")
|
MODULE_DEPENDS=("CORE" "KERNEL")
|
||||||
ModuleLibIncs=(${SRS_OBJS} ${LibSTRoot} ${LibSSLRoot})
|
ModuleLibIncs=(${SRS_OBJS} ${LibSTRoot} ${LibSSLRoot})
|
||||||
MODULE_FILES=("srs_protocol_amf0" "srs_protocol_io" "srs_protocol_conn" "srs_protocol_rtmp_handshake"
|
MODULE_FILES=("srs_protocol_amf0" "srs_protocol_io" "srs_protocol_conn" "srs_protocol_rtmp_handshake"
|
||||||
"srs_protocol_rtmp_stack" "srs_protocol_utility" "srs_protocol_rtmp_msg_array" "srs_protocol_stream"
|
"srs_protocol_rtmp_stack" "srs_protocol_utility" "srs_protocol_rtmp_msg_array"
|
||||||
"srs_protocol_raw_avc" "srs_protocol_http_stack" "srs_protocol_json"
|
"srs_protocol_raw_avc" "srs_protocol_http_stack" "srs_protocol_json" "srs_protocol_stream"
|
||||||
"srs_protocol_format" "srs_protocol_log" "srs_protocol_st" "srs_protocol_http_client"
|
"srs_protocol_format" "srs_protocol_log" "srs_protocol_st" "srs_protocol_http_client"
|
||||||
"srs_protocol_http_conn" "srs_protocol_rtmp_conn" "srs_protocol_protobuf"
|
"srs_protocol_http_conn" "srs_protocol_rtmp_conn" "srs_protocol_protobuf"
|
||||||
"srs_protocol_http_stack_llhttp" "srs_protocol_http_stack_llhttpapi"
|
"srs_protocol_http_stack_llhttp" "srs_protocol_http_stack_llhttpapi"
|
||||||
|
|
@ -289,17 +289,17 @@ if [[ $SRS_FFMPEG_FIT == YES ]]; then
|
||||||
ModuleLibIncs+=("${LibFfmpegRoot[*]}")
|
ModuleLibIncs+=("${LibFfmpegRoot[*]}")
|
||||||
fi
|
fi
|
||||||
MODULE_FILES=("srs_app_server" "srs_app_rtmp_conn" "srs_app_rtmp_source"
|
MODULE_FILES=("srs_app_server" "srs_app_rtmp_conn" "srs_app_rtmp_source"
|
||||||
"srs_app_refer" "srs_app_hls" "srs_app_forward" "srs_app_encoder" "srs_app_http_stream"
|
"srs_app_refer" "srs_app_hls" "srs_app_forward" "srs_app_encoder"
|
||||||
"srs_app_st" "srs_app_log" "srs_app_config" "srs_app_stream_bridge"
|
"srs_app_st" "srs_app_log" "srs_app_config" "srs_app_stream_bridge"
|
||||||
"srs_app_reload" "srs_app_http_api" "srs_app_http_conn" "srs_app_http_hooks"
|
"srs_app_reload" "srs_app_http_api" "srs_app_http_conn" "srs_app_http_hooks"
|
||||||
"srs_app_ingest" "srs_app_ffmpeg" "srs_app_utility" "srs_app_edge"
|
"srs_app_ingest" "srs_app_ffmpeg" "srs_app_utility" "srs_app_edge"
|
||||||
"srs_app_heartbeat" "srs_app_http_client" "srs_app_http_static"
|
"srs_app_heartbeat" "srs_app_http_client" "srs_app_http_static"
|
||||||
"srs_app_recv_thread" "srs_app_security" "srs_app_statistic" "srs_app_hds"
|
"srs_app_recv_thread" "srs_app_security" "srs_app_statistic" "srs_app_hds"
|
||||||
"srs_app_mpegts_udp" "srs_app_listener" "srs_app_async_call"
|
"srs_app_mpegts_udp" "srs_app_listener" "srs_app_async_call"
|
||||||
"srs_app_caster_flv" "srs_app_latest_version" "srs_app_process" "srs_app_ng_exec"
|
"srs_app_caster_flv" "srs_app_latest_version" "srs_app_process"
|
||||||
"srs_app_dash" "srs_app_fragment" "srs_app_dvr"
|
"srs_app_dash" "srs_app_fragment" "srs_app_dvr" "srs_app_ng_exec"
|
||||||
"srs_app_coworkers" "srs_app_circuit_breaker" "srs_app_factory"
|
"srs_app_coworkers" "srs_app_circuit_breaker" "srs_app_factory"
|
||||||
"srs_app_stream_token")
|
"srs_app_stream_token" "srs_app_http_stream")
|
||||||
# Always include SRT app modules
|
# Always include SRT app modules
|
||||||
MODULE_FILES+=("srs_app_srt_server" "srs_app_srt_listener" "srs_app_srt_conn" "srs_app_srt_source")
|
MODULE_FILES+=("srs_app_srt_server" "srs_app_srt_listener" "srs_app_srt_conn" "srs_app_srt_source")
|
||||||
MODULE_FILES+=("srs_app_rtc_conn" "srs_app_rtc_dtls" "srs_app_rtc_network"
|
MODULE_FILES+=("srs_app_rtc_conn" "srs_app_rtc_dtls" "srs_app_rtc_network"
|
||||||
|
|
@ -378,10 +378,11 @@ if [[ $SRS_UTEST == YES ]]; then
|
||||||
MODULE_FILES=("srs_utest" "srs_utest_amf0" "srs_utest_kernel" "srs_utest_core"
|
MODULE_FILES=("srs_utest" "srs_utest_amf0" "srs_utest_kernel" "srs_utest_core"
|
||||||
"srs_utest_config" "srs_utest_rtmp" "srs_utest_http" "srs_utest_avc" "srs_utest_reload"
|
"srs_utest_config" "srs_utest_rtmp" "srs_utest_http" "srs_utest_avc" "srs_utest_reload"
|
||||||
"srs_utest_mp4" "srs_utest_service" "srs_utest_app" "srs_utest_app2" "srs_utest_rtc" "srs_utest_config2"
|
"srs_utest_mp4" "srs_utest_service" "srs_utest_app" "srs_utest_app2" "srs_utest_rtc" "srs_utest_config2"
|
||||||
"srs_utest_config3" "srs_utest_config4" "srs_utest_protocol" "srs_utest_protocol2" "srs_utest_kernel2" "srs_utest_protocol3"
|
"srs_utest_config3" "srs_utest_config4" "srs_utest_protocol" "srs_utest_protocol2" "srs_utest_kernel2"
|
||||||
"srs_utest_st" "srs_utest_rtc2" "srs_utest_rtc3" "srs_utest_fmp4" "srs_utest_source_lock"
|
"srs_utest_st" "srs_utest_rtc2" "srs_utest_rtc3" "srs_utest_fmp4" "srs_utest_source_lock"
|
||||||
"srs_utest_stream_token" "srs_utest_rtc_recv_track" "srs_utest_st2" "srs_utest_hevc_structs"
|
"srs_utest_stream_token" "srs_utest_rtc_recv_track" "srs_utest_st2" "srs_utest_hevc_structs"
|
||||||
"srs_utest_coworkers" "srs_utest_pithy_print" "srs_utest_kernel3" "srs_utest_protocol4")
|
"srs_utest_coworkers" "srs_utest_pithy_print" "srs_utest_kernel3" "srs_utest_protocol4"
|
||||||
|
"srs_utest_protocol3")
|
||||||
# Always include SRT utest
|
# Always include SRT utest
|
||||||
MODULE_FILES+=("srs_utest_srt")
|
MODULE_FILES+=("srs_utest_srt")
|
||||||
if [[ $SRS_GB28181 == YES ]]; then
|
if [[ $SRS_GB28181 == YES ]]; then
|
||||||
|
|
|
||||||
|
|
@ -400,6 +400,7 @@ SrsRtcSource::SrsRtcSource()
|
||||||
#ifdef SRS_FFMPEG_FIT
|
#ifdef SRS_FFMPEG_FIT
|
||||||
frame_builder_ = NULL;
|
frame_builder_ = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
circuit_breaker_ = _srs_circuit_breaker;
|
||||||
|
|
||||||
pli_for_rtmp_ = pli_elapsed_ = 0;
|
pli_for_rtmp_ = pli_elapsed_ = 0;
|
||||||
stream_die_at_ = 0;
|
stream_die_at_ = 0;
|
||||||
|
|
@ -793,7 +794,7 @@ srs_error_t SrsRtcSource::on_rtp(SrsRtpPacket *pkt)
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
// If circuit-breaker is dying, drop packet.
|
// If circuit-breaker is dying, drop packet.
|
||||||
if (_srs_circuit_breaker->hybrid_dying_water_level()) {
|
if (circuit_breaker_ && circuit_breaker_->hybrid_dying_water_level()) {
|
||||||
_srs_pps_aloss2->sugar_ += (int64_t)consumers_.size();
|
_srs_pps_aloss2->sugar_ += (int64_t)consumers_.size();
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,7 @@ class SrsRtcFrameBuilder;
|
||||||
class SrsLiveSource;
|
class SrsLiveSource;
|
||||||
class SrsRtpVideoBuilder;
|
class SrsRtpVideoBuilder;
|
||||||
class ISrsRtcConsumer;
|
class ISrsRtcConsumer;
|
||||||
|
class ISrsCircuitBreaker;
|
||||||
|
|
||||||
// Firefox defaults as 109, Chrome is 111.
|
// Firefox defaults as 109, Chrome is 111.
|
||||||
const int kAudioPayloadType = 111;
|
const int kAudioPayloadType = 111;
|
||||||
|
|
@ -219,6 +220,8 @@ public:
|
||||||
class SrsRtcSource : public ISrsFastTimer, public ISrsRtcSourceForConsumer
|
class SrsRtcSource : public ISrsFastTimer, public ISrsRtcSourceForConsumer
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
// Circuit breaker for protecting server resources.
|
||||||
|
ISrsCircuitBreaker *circuit_breaker_;
|
||||||
// For publish, it's the publish client id.
|
// For publish, it's the publish client id.
|
||||||
// For edge, it's the edge ingest id.
|
// For edge, it's the edge ingest id.
|
||||||
// when source id changed, for example, the edge reconnect,
|
// when source id changed, for example, the edge reconnect,
|
||||||
|
|
|
||||||
|
|
@ -329,8 +329,23 @@ srs_error_t SrsHttpTestServer::start()
|
||||||
{
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
if ((err = srs_tcp_listen(ip_, port_, &fd_)) != srs_success) {
|
// Retry up to 3 times with different random ports if listen fails
|
||||||
return srs_error_wrap(err, "listen %s:%d", ip_.c_str(), port_);
|
for (int retry = 0; retry < 3; retry++) {
|
||||||
|
if ((err = srs_tcp_listen(ip_, port_, &fd_)) == srs_success) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If this is not the last retry, generate a new random port and try again
|
||||||
|
if (retry < 2) {
|
||||||
|
srs_freep(err);
|
||||||
|
port_ = srs_rand_integer(30000, 60000);
|
||||||
|
srs_trace("HTTP test server listen failed on %s:%d, retry %d with new port %d",
|
||||||
|
ip_.c_str(), port_, retry + 1, port_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err != srs_success) {
|
||||||
|
return srs_error_wrap(err, "listen %s:%d after 3 retries", ip_.c_str(), port_);
|
||||||
}
|
}
|
||||||
|
|
||||||
return trd_->start();
|
return trd_->start();
|
||||||
|
|
@ -418,8 +433,23 @@ srs_error_t SrsHttpsTestServer::start()
|
||||||
{
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
if ((err = srs_tcp_listen(ip_, port_, &fd_)) != srs_success) {
|
// Retry up to 3 times with different random ports if listen fails
|
||||||
return srs_error_wrap(err, "listen %s:%d", ip_.c_str(), port_);
|
for (int retry = 0; retry < 3; retry++) {
|
||||||
|
if ((err = srs_tcp_listen(ip_, port_, &fd_)) == srs_success) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If this is not the last retry, generate a new random port and try again
|
||||||
|
if (retry < 2) {
|
||||||
|
srs_freep(err);
|
||||||
|
port_ = srs_rand_integer(30000, 60000);
|
||||||
|
srs_trace("HTTPS test server listen failed on %s:%d, retry %d with new port %d",
|
||||||
|
ip_.c_str(), port_, retry + 1, port_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err != srs_success) {
|
||||||
|
return srs_error_wrap(err, "listen %s:%d after 3 retries", ip_.c_str(), port_);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((err = trd_->start()) != srs_success) {
|
if ((err = trd_->start()) != srs_success) {
|
||||||
|
|
@ -527,8 +557,23 @@ srs_error_t SrsRtmpTestServer::start()
|
||||||
{
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
if ((err = srs_tcp_listen(ip_, port_, &fd_)) != srs_success) {
|
// Retry up to 3 times with different random ports if listen fails
|
||||||
return srs_error_wrap(err, "listen %s:%d", ip_.c_str(), port_);
|
for (int retry = 0; retry < 3; retry++) {
|
||||||
|
if ((err = srs_tcp_listen(ip_, port_, &fd_)) == srs_success) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If this is not the last retry, generate a new random port and try again
|
||||||
|
if (retry < 2) {
|
||||||
|
srs_freep(err);
|
||||||
|
port_ = srs_rand_integer(30000, 60000);
|
||||||
|
srs_trace("RTMP test server listen failed on %s:%d, retry %d with new port %d",
|
||||||
|
ip_.c_str(), port_, retry + 1, port_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err != srs_success) {
|
||||||
|
return srs_error_wrap(err, "listen %s:%d after 3 retries", ip_.c_str(), port_);
|
||||||
}
|
}
|
||||||
|
|
||||||
return trd_->start();
|
return trd_->start();
|
||||||
|
|
@ -835,9 +880,23 @@ srs_error_t SrsUdpTestServer::start()
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create UDP socket
|
// Create UDP socket - retry up to 3 times with different random ports if listen fails
|
||||||
if ((err = srs_udp_listen(host_, port_, &lfd_)) != srs_success) {
|
for (int retry = 0; retry < 3; retry++) {
|
||||||
return srs_error_wrap(err, "udp listen %s:%d", host_.c_str(), port_);
|
if ((err = srs_udp_listen(host_, port_, &lfd_)) == srs_success) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If this is not the last retry, generate a new random port and try again
|
||||||
|
if (retry < 2) {
|
||||||
|
srs_freep(err);
|
||||||
|
port_ = 30000 + (srs_rand_integer() % (60000 - 30000 + 1));
|
||||||
|
srs_trace("UDP test server listen failed on %s:%d, retry %d with new port %d",
|
||||||
|
host_.c_str(), port_, retry + 1, port_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err != srs_success) {
|
||||||
|
return srs_error_wrap(err, "udp listen %s:%d after 3 retries", host_.c_str(), port_);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the actual port that was assigned
|
// Get the actual port that was assigned
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1516,19 +1516,19 @@ VOID TEST(KernelRTC2Test, SrsRtcFrameBuilderVideoFrameDetectorNullPacketHandling
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mock bridge for testing SrsRtcFrameBuilder
|
// Mock bridge for testing SrsRtcFrameBuilder
|
||||||
class MockStreamBridge : public ISrsStreamBridge
|
class MockRtcFrameBuilderBridge : public ISrsStreamBridge
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
srs_error_t last_error;
|
srs_error_t last_error;
|
||||||
int frame_count;
|
int frame_count;
|
||||||
|
|
||||||
MockStreamBridge()
|
MockRtcFrameBuilderBridge()
|
||||||
{
|
{
|
||||||
last_error = srs_success;
|
last_error = NULL;
|
||||||
frame_count = 0;
|
frame_count = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~MockStreamBridge()
|
virtual ~MockRtcFrameBuilderBridge()
|
||||||
{
|
{
|
||||||
srs_freep(last_error);
|
srs_freep(last_error);
|
||||||
}
|
}
|
||||||
|
|
@ -1577,7 +1577,7 @@ VOID TEST(KernelRTC2Test, SrsRtcFrameBuilderPacketVideoRtmpNullPointerCrash)
|
||||||
// but the start packet (100) is missing. With the fix, the function should use
|
// but the start packet (100) is missing. With the fix, the function should use
|
||||||
// packet 101 (first available) instead of crashing on the missing packet 100.
|
// packet 101 (first available) instead of crashing on the missing packet 100.
|
||||||
if (true) {
|
if (true) {
|
||||||
MockStreamBridge bridge;
|
MockRtcFrameBuilderBridge bridge;
|
||||||
SrsRtcFrameBuilder frame_builder(&bridge);
|
SrsRtcFrameBuilder frame_builder(&bridge);
|
||||||
|
|
||||||
// Skip initialization and directly set up the test scenario
|
// Skip initialization and directly set up the test scenario
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user