AI: Add utest to cover signal manager
This commit is contained in:
parent
341c0c000c
commit
4e35b6cacc
6
trunk/configure
vendored
6
trunk/configure
vendored
|
|
@ -386,12 +386,12 @@ if [[ $SRS_UTEST == YES ]]; then
|
||||||
MODULE_FILES+=("srs_utest_ai01" "srs_utest_ai02" "srs_utest_ai03" "srs_utest_ai04" "srs_utest_ai05"
|
MODULE_FILES+=("srs_utest_ai01" "srs_utest_ai02" "srs_utest_ai03" "srs_utest_ai04" "srs_utest_ai05"
|
||||||
"srs_utest_ai06" "srs_utest_ai07" "srs_utest_ai08" "srs_utest_ai09" "srs_utest_ai10" "srs_utest_ai11"
|
"srs_utest_ai06" "srs_utest_ai07" "srs_utest_ai08" "srs_utest_ai09" "srs_utest_ai10" "srs_utest_ai11"
|
||||||
"srs_utest_ai12" "srs_utest_ai13" "srs_utest_ai14" "srs_utest_ai15" "srs_utest_ai16" "srs_utest_ai17"
|
"srs_utest_ai12" "srs_utest_ai13" "srs_utest_ai14" "srs_utest_ai15" "srs_utest_ai16" "srs_utest_ai17"
|
||||||
"srs_utest_ai18" "srs_utest_ai19")
|
"srs_utest_ai18" "srs_utest_ai19" "srs_utest_ai20")
|
||||||
if [[ $SRS_GB28181 == YES ]]; then
|
if [[ $SRS_GB28181 == YES ]]; then
|
||||||
MODULE_FILES+=("srs_utest_gb28181" "srs_utest_app14")
|
MODULE_FILES+=("srs_utest_gb28181" "srs_utest_ai23")
|
||||||
fi
|
fi
|
||||||
if [[ $SRS_RTSP == YES ]]; then
|
if [[ $SRS_RTSP == YES ]]; then
|
||||||
MODULE_FILES+=("srs_utest_app12" "srs_utest_app13")
|
MODULE_FILES+=("srs_utest_ai21" "srs_utest_ai22")
|
||||||
fi
|
fi
|
||||||
ModuleLibIncs=(${SRS_OBJS} ${LibSTRoot} ${LibSSLRoot} ${LibSrtpRoot})
|
ModuleLibIncs=(${SRS_OBJS} ${LibSTRoot} ${LibSSLRoot} ${LibSrtpRoot})
|
||||||
if [[ $SRS_FFMPEG_FIT == YES ]]; then
|
if [[ $SRS_FFMPEG_FIT == YES ]]; then
|
||||||
|
|
|
||||||
|
|
@ -1649,7 +1649,7 @@ void SrsServer::on_unpublish(ISrsRequest *r)
|
||||||
|
|
||||||
SrsSignalManager *SrsSignalManager::instance = NULL;
|
SrsSignalManager *SrsSignalManager::instance = NULL;
|
||||||
|
|
||||||
SrsSignalManager::SrsSignalManager(SrsServer *s)
|
SrsSignalManager::SrsSignalManager(ISrsSignalHandler *s)
|
||||||
{
|
{
|
||||||
SrsSignalManager::instance = this;
|
SrsSignalManager::instance = this;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -362,11 +362,11 @@ SRS_DECLARE_PRIVATE: // clang-format on
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
SRS_DECLARE_PRIVATE: // clang-format on
|
SRS_DECLARE_PRIVATE: // clang-format on
|
||||||
SrsServer *server_;
|
ISrsSignalHandler *server_;
|
||||||
ISrsCoroutine *trd_;
|
ISrsCoroutine *trd_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SrsSignalManager(SrsServer *s);
|
SrsSignalManager(ISrsSignalHandler *s);
|
||||||
virtual ~SrsSignalManager();
|
virtual ~SrsSignalManager();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ using namespace std;
|
||||||
#include <srs_utest_ai13.hpp>
|
#include <srs_utest_ai13.hpp>
|
||||||
#include <srs_utest_ai15.hpp>
|
#include <srs_utest_ai15.hpp>
|
||||||
#include <srs_utest_ai16.hpp>
|
#include <srs_utest_ai16.hpp>
|
||||||
#include <srs_utest_app14.hpp>
|
#include <srs_utest_ai23.hpp>
|
||||||
#include <srs_utest_coworkers.hpp>
|
#include <srs_utest_coworkers.hpp>
|
||||||
#include <srs_utest_fmp4.hpp>
|
#include <srs_utest_fmp4.hpp>
|
||||||
#include <srs_utest_http.hpp>
|
#include <srs_utest_http.hpp>
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ using namespace std;
|
||||||
#include <srs_kernel_st.hpp>
|
#include <srs_kernel_st.hpp>
|
||||||
#include <srs_kernel_utility.hpp>
|
#include <srs_kernel_utility.hpp>
|
||||||
#include <srs_protocol_utility.hpp>
|
#include <srs_protocol_utility.hpp>
|
||||||
#include <srs_utest_app14.hpp>
|
#include <srs_utest_ai23.hpp>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
// Mock ISrsSrtSocket implementation
|
// Mock ISrsSrtSocket implementation
|
||||||
|
|
|
||||||
163
trunk/src/utest/srs_utest_ai20.cpp
Normal file
163
trunk/src/utest/srs_utest_ai20.cpp
Normal file
|
|
@ -0,0 +1,163 @@
|
||||||
|
//
|
||||||
|
// Copyright (c) 2013-2025 The SRS Authors
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <srs_utest_ai20.hpp>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#include <srs_app_server.hpp>
|
||||||
|
#include <srs_kernel_consts.hpp>
|
||||||
|
#include <srs_kernel_error.hpp>
|
||||||
|
#include <srs_protocol_st.hpp>
|
||||||
|
#include <srs_utest_mock.hpp>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
// Mock ISrsSignalHandler implementation
|
||||||
|
MockSignalHandlerForManager::MockSignalHandlerForManager()
|
||||||
|
{
|
||||||
|
signal_reload_count_ = 0;
|
||||||
|
signal_fast_quit_count_ = 0;
|
||||||
|
signal_gracefully_quit_count_ = 0;
|
||||||
|
signal_reopen_log_count_ = 0;
|
||||||
|
signal_persistence_config_count_ = 0;
|
||||||
|
signal_assert_abort_count_ = 0;
|
||||||
|
last_signo_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
MockSignalHandlerForManager::~MockSignalHandlerForManager()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void MockSignalHandlerForManager::on_signal(int signo)
|
||||||
|
{
|
||||||
|
last_signo_ = signo;
|
||||||
|
|
||||||
|
if (signo == SRS_SIGNAL_RELOAD) {
|
||||||
|
signal_reload_count_++;
|
||||||
|
} else if (signo == SRS_SIGNAL_FAST_QUIT) {
|
||||||
|
signal_fast_quit_count_++;
|
||||||
|
} else if (signo == SRS_SIGNAL_GRACEFULLY_QUIT) {
|
||||||
|
signal_gracefully_quit_count_++;
|
||||||
|
} else if (signo == SRS_SIGNAL_REOPEN_LOG) {
|
||||||
|
signal_reopen_log_count_++;
|
||||||
|
} else if (signo == SRS_SIGNAL_PERSISTENCE_CONFIG) {
|
||||||
|
signal_persistence_config_count_++;
|
||||||
|
} else if (signo == SRS_SIGNAL_ASSERT_ABORT) {
|
||||||
|
signal_assert_abort_count_++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MockSignalHandlerForManager::reset()
|
||||||
|
{
|
||||||
|
signal_reload_count_ = 0;
|
||||||
|
signal_fast_quit_count_ = 0;
|
||||||
|
signal_gracefully_quit_count_ = 0;
|
||||||
|
signal_reopen_log_count_ = 0;
|
||||||
|
signal_persistence_config_count_ = 0;
|
||||||
|
signal_assert_abort_count_ = 0;
|
||||||
|
last_signo_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID TEST(SignalManagerTest, MajorWorkflow)
|
||||||
|
{
|
||||||
|
srs_error_t err;
|
||||||
|
|
||||||
|
// Create mock signal handler
|
||||||
|
MockSignalHandlerForManager mock_handler;
|
||||||
|
|
||||||
|
// Create SrsSignalManager instance
|
||||||
|
SrsUniquePtr<SrsSignalManager> signal_manager(new SrsSignalManager(&mock_handler));
|
||||||
|
|
||||||
|
// Test 1: Initialize the signal manager (creates pipe)
|
||||||
|
HELPER_EXPECT_SUCCESS(signal_manager->initialize());
|
||||||
|
|
||||||
|
// Verify pipe was created
|
||||||
|
EXPECT_TRUE(signal_manager->sig_pipe_[0] > 0);
|
||||||
|
EXPECT_TRUE(signal_manager->sig_pipe_[1] > 0);
|
||||||
|
EXPECT_TRUE(signal_manager->signal_read_stfd_ != NULL);
|
||||||
|
|
||||||
|
// Test 2: Start the signal manager (starts coroutine)
|
||||||
|
HELPER_EXPECT_SUCCESS(signal_manager->start());
|
||||||
|
|
||||||
|
// Give coroutine time to start
|
||||||
|
srs_usleep(1 * SRS_UTIME_MILLISECONDS);
|
||||||
|
|
||||||
|
// Test 3: Write SRS_SIGNAL_RELOAD directly to the pipe
|
||||||
|
int signo = SRS_SIGNAL_RELOAD;
|
||||||
|
ssize_t nwrite = ::write(signal_manager->sig_pipe_[1], &signo, sizeof(int));
|
||||||
|
EXPECT_EQ((ssize_t)sizeof(int), nwrite);
|
||||||
|
|
||||||
|
// Give time for signal to be processed
|
||||||
|
srs_usleep(1 * SRS_UTIME_MILLISECONDS);
|
||||||
|
|
||||||
|
// Verify the signal was received and processed
|
||||||
|
EXPECT_EQ(1, mock_handler.signal_reload_count_);
|
||||||
|
EXPECT_EQ(SRS_SIGNAL_RELOAD, mock_handler.last_signo_);
|
||||||
|
|
||||||
|
// Test 4: Write SRS_SIGNAL_REOPEN_LOG directly to the pipe
|
||||||
|
signo = SRS_SIGNAL_REOPEN_LOG;
|
||||||
|
nwrite = ::write(signal_manager->sig_pipe_[1], &signo, sizeof(int));
|
||||||
|
EXPECT_EQ((ssize_t)sizeof(int), nwrite);
|
||||||
|
|
||||||
|
// Give time for signal to be processed
|
||||||
|
srs_usleep(1 * SRS_UTIME_MILLISECONDS);
|
||||||
|
|
||||||
|
// Verify the signal was received and processed
|
||||||
|
EXPECT_EQ(1, mock_handler.signal_reopen_log_count_);
|
||||||
|
EXPECT_EQ(SRS_SIGNAL_REOPEN_LOG, mock_handler.last_signo_);
|
||||||
|
|
||||||
|
// Test 5: Write SRS_SIGNAL_FAST_QUIT directly to the pipe
|
||||||
|
signo = SRS_SIGNAL_FAST_QUIT;
|
||||||
|
nwrite = ::write(signal_manager->sig_pipe_[1], &signo, sizeof(int));
|
||||||
|
EXPECT_EQ((ssize_t)sizeof(int), nwrite);
|
||||||
|
|
||||||
|
// Give time for signal to be processed
|
||||||
|
srs_usleep(1 * SRS_UTIME_MILLISECONDS);
|
||||||
|
|
||||||
|
// Verify the signal was received and processed
|
||||||
|
EXPECT_EQ(1, mock_handler.signal_fast_quit_count_);
|
||||||
|
EXPECT_EQ(SRS_SIGNAL_FAST_QUIT, mock_handler.last_signo_);
|
||||||
|
|
||||||
|
// Test 6: Write SRS_SIGNAL_GRACEFULLY_QUIT directly to the pipe
|
||||||
|
signo = SRS_SIGNAL_GRACEFULLY_QUIT;
|
||||||
|
nwrite = ::write(signal_manager->sig_pipe_[1], &signo, sizeof(int));
|
||||||
|
EXPECT_EQ((ssize_t)sizeof(int), nwrite);
|
||||||
|
|
||||||
|
// Give time for signal to be processed
|
||||||
|
srs_usleep(1 * SRS_UTIME_MILLISECONDS);
|
||||||
|
|
||||||
|
// Verify the signal was received and processed
|
||||||
|
EXPECT_EQ(1, mock_handler.signal_gracefully_quit_count_);
|
||||||
|
EXPECT_EQ(SRS_SIGNAL_GRACEFULLY_QUIT, mock_handler.last_signo_);
|
||||||
|
|
||||||
|
// Test 7: Write SRS_SIGNAL_PERSISTENCE_CONFIG directly to the pipe
|
||||||
|
signo = SRS_SIGNAL_PERSISTENCE_CONFIG;
|
||||||
|
nwrite = ::write(signal_manager->sig_pipe_[1], &signo, sizeof(int));
|
||||||
|
EXPECT_EQ((ssize_t)sizeof(int), nwrite);
|
||||||
|
|
||||||
|
// Give time for signal to be processed
|
||||||
|
srs_usleep(1 * SRS_UTIME_MILLISECONDS);
|
||||||
|
|
||||||
|
// Verify the signal was received and processed
|
||||||
|
EXPECT_EQ(1, mock_handler.signal_persistence_config_count_);
|
||||||
|
EXPECT_EQ(SRS_SIGNAL_PERSISTENCE_CONFIG, mock_handler.last_signo_);
|
||||||
|
|
||||||
|
// Test 8: Write multiple signals in sequence
|
||||||
|
signo = SRS_SIGNAL_RELOAD;
|
||||||
|
nwrite = ::write(signal_manager->sig_pipe_[1], &signo, sizeof(int));
|
||||||
|
EXPECT_EQ((ssize_t)sizeof(int), nwrite);
|
||||||
|
|
||||||
|
signo = SRS_SIGNAL_RELOAD;
|
||||||
|
nwrite = ::write(signal_manager->sig_pipe_[1], &signo, sizeof(int));
|
||||||
|
EXPECT_EQ((ssize_t)sizeof(int), nwrite);
|
||||||
|
|
||||||
|
// Give time for signals to be processed
|
||||||
|
srs_usleep(1 * SRS_UTIME_MILLISECONDS);
|
||||||
|
|
||||||
|
// Verify the signal was received multiple times (now 3 times total)
|
||||||
|
EXPECT_EQ(3, mock_handler.signal_reload_count_);
|
||||||
|
EXPECT_EQ(SRS_SIGNAL_RELOAD, mock_handler.last_signo_);
|
||||||
|
}
|
||||||
38
trunk/src/utest/srs_utest_ai20.hpp
Normal file
38
trunk/src/utest/srs_utest_ai20.hpp
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
//
|
||||||
|
// Copyright (c) 2013-2025 The SRS Authors
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef SRS_UTEST_AI20_HPP
|
||||||
|
#define SRS_UTEST_AI20_HPP
|
||||||
|
|
||||||
|
/*
|
||||||
|
#include <srs_utest_ai20.hpp>
|
||||||
|
*/
|
||||||
|
#include <srs_utest.hpp>
|
||||||
|
|
||||||
|
#include <srs_app_server.hpp>
|
||||||
|
|
||||||
|
// Mock ISrsSignalHandler implementation for testing SrsSignalManager
|
||||||
|
class MockSignalHandlerForManager : public ISrsSignalHandler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
int signal_reload_count_;
|
||||||
|
int signal_fast_quit_count_;
|
||||||
|
int signal_gracefully_quit_count_;
|
||||||
|
int signal_reopen_log_count_;
|
||||||
|
int signal_persistence_config_count_;
|
||||||
|
int signal_assert_abort_count_;
|
||||||
|
int last_signo_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
MockSignalHandlerForManager();
|
||||||
|
virtual ~MockSignalHandlerForManager();
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual void on_signal(int signo);
|
||||||
|
void reset();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
//
|
//
|
||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
//
|
//
|
||||||
#include <srs_utest_app12.hpp>
|
#include <srs_utest_ai21.hpp>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
|
@ -4,11 +4,11 @@
|
||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef SRS_UTEST_APP12_HPP
|
#ifndef SRS_UTEST_AI21_HPP
|
||||||
#define SRS_UTEST_APP12_HPP
|
#define SRS_UTEST_AI21_HPP
|
||||||
|
|
||||||
/*
|
/*
|
||||||
#include <srs_utest_app12.hpp>
|
#include <srs_utest_ai21.hpp>
|
||||||
*/
|
*/
|
||||||
#include <srs_utest.hpp>
|
#include <srs_utest.hpp>
|
||||||
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
//
|
//
|
||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
//
|
//
|
||||||
#include <srs_utest_app13.hpp>
|
#include <srs_utest_ai22.hpp>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
|
@ -4,11 +4,11 @@
|
||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef SRS_UTEST_APP13_HPP
|
#ifndef SRS_UTEST_AI22_HPP
|
||||||
#define SRS_UTEST_APP13_HPP
|
#define SRS_UTEST_AI22_HPP
|
||||||
|
|
||||||
/*
|
/*
|
||||||
#include <srs_utest_app13.hpp>
|
#include <srs_utest_ai22.hpp>
|
||||||
*/
|
*/
|
||||||
#include <srs_utest.hpp>
|
#include <srs_utest.hpp>
|
||||||
|
|
||||||
|
|
@ -35,7 +35,7 @@
|
||||||
#include <srs_protocol_rtsp_stack.hpp>
|
#include <srs_protocol_rtsp_stack.hpp>
|
||||||
#endif
|
#endif
|
||||||
#include <srs_utest_ai11.hpp>
|
#include <srs_utest_ai11.hpp>
|
||||||
#include <srs_utest_app12.hpp>
|
#include <srs_utest_ai21.hpp>
|
||||||
|
|
||||||
// Mock request class for testing edge upstream
|
// Mock request class for testing edge upstream
|
||||||
class MockEdgeRequest : public ISrsRequest
|
class MockEdgeRequest : public ISrsRequest
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
//
|
//
|
||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
//
|
//
|
||||||
#include <srs_utest_app14.hpp>
|
#include <srs_utest_ai23.hpp>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
|
@ -4,11 +4,11 @@
|
||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef SRS_UTEST_APP14_HPP
|
#ifndef SRS_UTEST_AI23_HPP
|
||||||
#define SRS_UTEST_APP14_HPP
|
#define SRS_UTEST_AI23_HPP
|
||||||
|
|
||||||
/*
|
/*
|
||||||
#include <srs_utest_app14.hpp>
|
#include <srs_utest_ai23.hpp>
|
||||||
*/
|
*/
|
||||||
#include <srs_utest.hpp>
|
#include <srs_utest.hpp>
|
||||||
|
|
||||||
|
|
@ -40,7 +40,7 @@
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
#include <srs_utest_app13.hpp>
|
#include <srs_utest_ai22.hpp>
|
||||||
|
|
||||||
// MockSdpFactory implementation
|
// MockSdpFactory implementation
|
||||||
MockSdpFactory::MockSdpFactory()
|
MockSdpFactory::MockSdpFactory()
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@
|
||||||
#include <srs_utest_ai11.hpp>
|
#include <srs_utest_ai11.hpp>
|
||||||
#include <srs_utest_ai15.hpp>
|
#include <srs_utest_ai15.hpp>
|
||||||
#include <srs_utest_ai18.hpp>
|
#include <srs_utest_ai18.hpp>
|
||||||
#include <srs_utest_app13.hpp>
|
#include <srs_utest_ai22.hpp>
|
||||||
#include <srs_utest_mock.hpp>
|
#include <srs_utest_mock.hpp>
|
||||||
#include <srs_utest_service.hpp>
|
#include <srs_utest_service.hpp>
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user