srs/trunk/src/utest/srs_utest_ai19.hpp
OSSRS-AI 1a96abc880
AI: API: Add audio_frames and video_frames to HTTP API. v7.0.122 (#4559) (#4564)
This PR adds separate audio and video frame counting to the HTTP API
(`/api/v1/streams/`) for better stream observability. The API now
reports three frame fields:
- `frames` - Total frames (video + audio)
- `video_frames` - Video frames/packets only
- `audio_frames` - Audio frames/packets only

This enhancement provides better visibility into stream composition and
helps detect issues with CBR/VBR streams, audio/video sync problems, and
codec-specific behavior.

**Before:**
```json
{
  "streams": [
    {
      "frames": 0, // video frames.
    }
  ]
}
```

**After:**
```json
{
  "streams": [
    {
      "frames": 6912, // video frames.
      "audio_frames": 5678, // audio frames.
      "video_frames": 1234, // video frames.
    }
  ]
}
```

Frame Counting Strategy
- All protocols report frames every N frames to balance accuracy and
performance
- Frames are counted at the protocol-specific message/packet level:
  - RTMP: Counts RTMP messages (video/audio)
  - WebRTC: Counts RTP packets (video/audio)
  - SRT: Counts MPEG-TS messages (H.264/HEVC/AAC)
2025-11-07 22:32:26 -05:00

927 lines
27 KiB
C++

//
// Copyright (c) 2013-2025 The SRS Authors
//
// SPDX-License-Identifier: MIT
//
#ifndef SRS_UTEST_AI19_HPP
#define SRS_UTEST_AI19_HPP
/*
#include <srs_utest_ai19.hpp>
*/
#include <srs_utest.hpp>
#include <srs_app_caster_flv.hpp>
#include <srs_app_circuit_breaker.hpp>
#include <srs_app_config.hpp>
#include <srs_app_factory.hpp>
#include <srs_app_ffmpeg.hpp>
#include <srs_app_listener.hpp>
#include <srs_app_mpegts_udp.hpp>
#include <srs_app_utility.hpp>
#include <srs_kernel_pithy_print.hpp>
#include <srs_protocol_http_client.hpp>
#include <srs_protocol_raw_avc.hpp>
#include <srs_protocol_rtmp_conn.hpp>
#include <srs_utest_ai11.hpp>
#include <srs_utest_ai15.hpp>
#include <srs_utest_ai16.hpp>
#include <srs_utest_manual_kernel.hpp>
// Mock ISrsAppConfig for testing SrsUdpCasterListener
class MockAppConfigForUdpCaster : public MockAppConfig
{
public:
int stream_caster_listen_port_;
public:
MockAppConfigForUdpCaster();
virtual ~MockAppConfigForUdpCaster();
public:
virtual int get_stream_caster_listen(SrsConfDirective *conf);
};
// Mock ISrsIpListener for testing SrsUdpCasterListener
class MockIpListenerForUdpCaster : public ISrsIpListener
{
public:
std::string endpoint_ip_;
int endpoint_port_;
std::string label_;
bool set_endpoint_called_;
bool set_label_called_;
bool listen_called_;
bool close_called_;
public:
MockIpListenerForUdpCaster();
virtual ~MockIpListenerForUdpCaster();
public:
virtual ISrsListener *set_endpoint(const std::string &i, int p);
virtual ISrsListener *set_label(const std::string &label);
virtual srs_error_t listen();
virtual void close();
void reset();
};
// Mock ISrsMpegtsOverUdp for testing SrsUdpCasterListener
class MockMpegtsOverUdp : public ISrsMpegtsOverUdp
{
public:
bool initialize_called_;
srs_error_t initialize_error_;
public:
MockMpegtsOverUdp();
virtual ~MockMpegtsOverUdp();
public:
virtual srs_error_t initialize(SrsConfDirective *c);
virtual srs_error_t on_ts_message(SrsTsMessage *msg);
virtual srs_error_t on_udp_packet(const sockaddr *from, const int fromlen, char *buf, int nb_buf);
void reset();
};
// Mock ISrsAppConfig for testing SrsNgExec
class MockAppConfigForNgExec : public MockAppConfig
{
public:
bool exec_enabled_;
std::vector<SrsConfDirective *> exec_publishs_;
public:
MockAppConfigForNgExec();
virtual ~MockAppConfigForNgExec();
public:
virtual bool get_exec_enabled(std::string vhost);
virtual std::vector<SrsConfDirective *> get_exec_publishs(std::string vhost);
};
// Mock ISrsRawH264Stream for testing SrsMpegtsOverUdp::on_ts_video
class MockMpegtsRawH264Stream : public ISrsRawH264Stream
{
public:
bool annexb_demux_called_;
bool is_sps_called_;
bool is_pps_called_;
bool sps_demux_called_;
bool pps_demux_called_;
srs_error_t annexb_demux_error_;
srs_error_t sps_demux_error_;
srs_error_t pps_demux_error_;
// Mock return values
char *demux_frame_;
int demux_frame_size_;
bool is_sps_result_;
bool is_pps_result_;
std::string sps_output_;
std::string pps_output_;
public:
MockMpegtsRawH264Stream();
virtual ~MockMpegtsRawH264Stream();
public:
virtual srs_error_t annexb_demux(SrsBuffer *stream, char **pframe, int *pnb_frame);
virtual bool is_sps(char *frame, int nb_frame);
virtual bool is_pps(char *frame, int nb_frame);
virtual srs_error_t sps_demux(char *frame, int nb_frame, std::string &sps);
virtual srs_error_t pps_demux(char *frame, int nb_frame, std::string &pps);
virtual srs_error_t mux_sequence_header(std::string sps, std::string pps, std::string &sh);
virtual srs_error_t mux_ipb_frame(char *frame, int frame_size, std::string &ibp);
virtual srs_error_t mux_avc2flv(std::string video, int8_t frame_type, int8_t avc_packet_type, uint32_t dts, uint32_t pts, char **flv, int *nb_flv);
void reset();
};
// Mock ISrsAppFactory for testing SrsMpegtsOverUdp::rtmp_write_packet
class MockAppFactoryForMpegtsOverUdp : public SrsAppFactory
{
public:
MockRtmpClient *mock_rtmp_client_;
bool create_rtmp_client_called_;
public:
MockAppFactoryForMpegtsOverUdp();
virtual ~MockAppFactoryForMpegtsOverUdp();
public:
virtual ISrsBasicRtmpClient *create_rtmp_client(std::string url, srs_utime_t cto, srs_utime_t sto);
void reset();
};
// Mock ISrsAppConfig for testing SrsHttpFlvListener
class MockAppConfigForHttpFlvListener : public MockAppConfig
{
public:
int stream_caster_listen_port_;
public:
MockAppConfigForHttpFlvListener();
virtual ~MockAppConfigForHttpFlvListener();
public:
virtual int get_stream_caster_listen(SrsConfDirective *conf);
};
// Mock SrsTcpListener for testing SrsHttpFlvListener
class MockTcpListenerForHttpFlv : public SrsTcpListener
{
public:
std::string endpoint_ip_;
int endpoint_port_;
std::string label_;
bool set_endpoint_called_;
bool set_label_called_;
bool listen_called_;
bool close_called_;
public:
MockTcpListenerForHttpFlv(ISrsTcpHandler *h);
virtual ~MockTcpListenerForHttpFlv();
public:
virtual ISrsListener *set_endpoint(const std::string &i, int p);
virtual ISrsListener *set_label(const std::string &label);
virtual srs_error_t listen();
void close();
void reset();
};
// Mock ISrsAppCasterFlv for testing SrsHttpFlvListener
class MockAppCasterFlv : public ISrsAppCasterFlv
{
public:
bool initialize_called_;
bool on_tcp_client_called_;
srs_error_t initialize_error_;
srs_error_t on_tcp_client_error_;
public:
MockAppCasterFlv();
virtual ~MockAppCasterFlv();
public:
virtual srs_error_t initialize(SrsConfDirective *c);
virtual srs_error_t on_tcp_client(ISrsListener *listener, srs_netfd_t stfd);
virtual srs_error_t start();
virtual bool empty();
virtual size_t size();
virtual void add(ISrsResource *conn, bool *exists);
virtual void add_with_id(const std::string &id, ISrsResource *conn);
virtual void add_with_fast_id(uint64_t id, ISrsResource *conn);
virtual void add_with_name(const std::string &name, ISrsResource *conn);
virtual ISrsResource *at(int index);
virtual ISrsResource *find_by_id(std::string id);
virtual ISrsResource *find_by_fast_id(uint64_t id);
virtual ISrsResource *find_by_name(std::string name);
virtual void remove(ISrsResource *c);
virtual void subscribe(ISrsDisposingHandler *h);
virtual void unsubscribe(ISrsDisposingHandler *h);
virtual srs_error_t serve_http(ISrsHttpResponseWriter *w, ISrsHttpMessage *r);
void reset();
};
// Mock ISrsAppConfig for testing SrsAppCasterFlv
class MockAppConfigForAppCasterFlv : public MockAppConfig
{
public:
std::string stream_caster_output_;
public:
MockAppConfigForAppCasterFlv();
virtual ~MockAppConfigForAppCasterFlv();
public:
virtual std::string get_stream_caster_output(SrsConfDirective *conf);
};
// Mock SrsHttpServeMux for testing SrsAppCasterFlv
class MockHttpServeMuxForAppCasterFlv : public SrsHttpServeMux
{
public:
bool handle_called_;
std::string handle_pattern_;
ISrsHttpHandler *handle_handler_;
srs_error_t handle_error_;
public:
MockHttpServeMuxForAppCasterFlv();
virtual ~MockHttpServeMuxForAppCasterFlv();
public:
virtual srs_error_t handle(std::string pattern, ISrsHttpHandler *handler);
void reset();
};
// Mock SrsResourceManager for testing SrsAppCasterFlv
class MockResourceManagerForAppCasterFlv : public SrsResourceManager
{
public:
bool start_called_;
srs_error_t start_error_;
public:
MockResourceManagerForAppCasterFlv();
virtual ~MockResourceManagerForAppCasterFlv();
public:
virtual srs_error_t start();
void reset();
};
// Mock ISrsHttpResponseReader for testing SrsDynamicHttpConn::do_proxy
class MockHttpResponseReaderForDynamicConn : public ISrsHttpResponseReader
{
public:
std::string content_;
size_t read_pos_;
bool eof_;
public:
MockHttpResponseReaderForDynamicConn();
virtual ~MockHttpResponseReaderForDynamicConn();
public:
virtual bool eof();
virtual srs_error_t read(void *buf, size_t size, ssize_t *nread);
void reset();
};
// Mock ISrsFlvDecoder for testing SrsDynamicHttpConn::do_proxy
class MockFlvDecoderForDynamicConn : public ISrsFlvDecoder
{
public:
bool read_tag_header_called_;
bool read_tag_data_called_;
bool read_previous_tag_size_called_;
srs_error_t read_tag_header_error_;
srs_error_t read_tag_data_error_;
srs_error_t read_previous_tag_size_error_;
// Mock return values for read_tag_header
char tag_type_;
int32_t tag_size_;
uint32_t tag_time_;
// Mock tag data to return
char *tag_data_;
int tag_data_size_;
public:
MockFlvDecoderForDynamicConn();
virtual ~MockFlvDecoderForDynamicConn();
public:
virtual srs_error_t initialize(ISrsReader *fr);
virtual srs_error_t read_header(char header[9]);
virtual srs_error_t read_tag_header(char *ptype, int32_t *pdata_size, uint32_t *ptime);
virtual srs_error_t read_tag_data(char *data, int32_t size);
virtual srs_error_t read_previous_tag_size(char previous_tag_size[4]);
void reset();
};
// Mock ISrsAppFactory for testing SrsDynamicHttpConn::do_proxy
class MockAppFactoryForDynamicConn : public SrsAppFactory
{
public:
MockRtmpClient *mock_rtmp_client_;
bool create_rtmp_client_called_;
public:
MockAppFactoryForDynamicConn();
virtual ~MockAppFactoryForDynamicConn();
public:
virtual ISrsBasicRtmpClient *create_rtmp_client(std::string url, srs_utime_t cto, srs_utime_t sto);
void reset();
};
// Mock ISrsPithyPrint for testing SrsDynamicHttpConn::do_proxy
class MockPithyPrintForDynamicConn : public ISrsPithyPrint
{
public:
bool elapse_called_;
bool can_print_called_;
bool can_print_result_;
srs_utime_t age_value_;
public:
MockPithyPrintForDynamicConn();
virtual ~MockPithyPrintForDynamicConn();
public:
virtual void elapse();
virtual bool can_print();
virtual srs_utime_t age();
void reset();
};
// Mock ISrsResourceManager for testing SrsDynamicHttpConn
class MockResourceManagerForDynamicConn : public ISrsResourceManager
{
public:
bool remove_called_;
ISrsResource *removed_resource_;
public:
MockResourceManagerForDynamicConn();
virtual ~MockResourceManagerForDynamicConn();
public:
virtual srs_error_t start();
virtual bool empty();
virtual size_t size();
virtual void add(ISrsResource *conn, bool *exists = NULL);
virtual void add_with_id(const std::string &id, ISrsResource *conn);
virtual void add_with_fast_id(uint64_t id, ISrsResource *conn);
virtual void add_with_name(const std::string &name, ISrsResource *conn);
virtual ISrsResource *at(int index);
virtual ISrsResource *find_by_id(std::string id);
virtual ISrsResource *find_by_fast_id(uint64_t id);
virtual ISrsResource *find_by_name(std::string name);
virtual void remove(ISrsResource *c);
virtual void subscribe(ISrsDisposingHandler *h);
virtual void unsubscribe(ISrsDisposingHandler *h);
void reset();
};
// Mock ISrsHttpConn for testing SrsDynamicHttpConn
class MockHttpConnForDynamicConn : public ISrsHttpConn
{
public:
std::string remote_ip_;
SrsContextId context_id_;
public:
MockHttpConnForDynamicConn();
virtual ~MockHttpConnForDynamicConn();
public:
virtual ISrsKbpsDelta *delta();
virtual srs_error_t start();
virtual srs_error_t cycle();
virtual srs_error_t pull();
virtual srs_error_t set_crossdomain_enabled(bool v);
virtual srs_error_t set_auth_enabled(bool auth_enabled);
virtual srs_error_t set_jsonp(bool v);
virtual std::string remote_ip();
virtual const SrsContextId &get_id();
virtual std::string desc();
virtual void expire();
};
// Mock ISrsCoroutine for testing SrsHttpConn::cycle()
class MockCoroutineForCycle : public ISrsCoroutine
{
public:
bool pull_called_;
srs_error_t pull_error_;
public:
MockCoroutineForCycle();
virtual ~MockCoroutineForCycle();
public:
virtual srs_error_t start();
virtual void stop();
virtual void interrupt();
virtual srs_error_t pull();
virtual const SrsContextId &cid();
virtual void set_cid(const SrsContextId &cid);
void reset();
};
// Mock SrsHttpMessage for testing SrsHttpConn::cycle()
class MockHttpMessageForCycle : public SrsHttpMessage
{
public:
bool is_keep_alive_;
public:
MockHttpMessageForCycle();
virtual ~MockHttpMessageForCycle();
public:
virtual bool is_keep_alive();
virtual ISrsRequest *to_request(std::string vhost);
};
// Mock ISrsResourceManager for testing SrsHttpxConn
class MockResourceManagerForHttpxConn : public ISrsResourceManager
{
public:
bool remove_called_;
ISrsResource *removed_resource_;
public:
MockResourceManagerForHttpxConn();
virtual ~MockResourceManagerForHttpxConn();
public:
virtual srs_error_t start();
virtual bool empty();
virtual size_t size();
virtual void add(ISrsResource *conn, bool *exists = NULL);
virtual void add_with_id(const std::string &id, ISrsResource *conn);
virtual void add_with_fast_id(uint64_t id, ISrsResource *conn);
virtual void add_with_name(const std::string &name, ISrsResource *conn);
virtual ISrsResource *at(int index);
virtual ISrsResource *find_by_id(std::string id);
virtual ISrsResource *find_by_fast_id(uint64_t id);
virtual ISrsResource *find_by_name(std::string name);
virtual void remove(ISrsResource *c);
virtual void subscribe(ISrsDisposingHandler *h);
virtual void unsubscribe(ISrsDisposingHandler *h);
void reset();
};
// Mock ISrsStatistic for testing SrsHttpxConn
class MockStatisticForHttpxConn : public ISrsStatistic
{
public:
bool on_disconnect_called_;
bool kbps_add_delta_called_;
std::string disconnect_id_;
std::string kbps_id_;
public:
MockStatisticForHttpxConn();
virtual ~MockStatisticForHttpxConn();
public:
virtual void on_disconnect(std::string id, srs_error_t err);
virtual srs_error_t on_client(std::string id, ISrsRequest *req, ISrsExpire *conn, SrsRtmpConnType type);
virtual srs_error_t on_video_info(ISrsRequest *req, SrsVideoCodecId vcodec, int avc_profile, int avc_level, int width, int height);
virtual srs_error_t on_audio_info(ISrsRequest *req, SrsAudioCodecId acodec, SrsAudioSampleRate asample_rate, SrsAudioChannels asound_type, SrsAacObjectType aac_object);
virtual void on_stream_publish(ISrsRequest *req, std::string publisher_id);
virtual void on_stream_close(ISrsRequest *req);
virtual void kbps_add_delta(std::string id, ISrsKbpsDelta *delta);
virtual void kbps_sample();
virtual srs_error_t on_video_frames(ISrsRequest *req, int nb_frames);
virtual srs_error_t on_audio_frames(ISrsRequest *req, int nb_frames);
virtual srs_error_t dumps_vhosts(SrsJsonArray *arr);
virtual srs_error_t dumps_streams(SrsJsonArray *arr, int start, int count);
virtual srs_error_t dumps_clients(SrsJsonArray *arr, int start, int count);
virtual srs_error_t dumps_metrics(int64_t &send_bytes, int64_t &recv_bytes, int64_t &nstreams, int64_t &nclients, int64_t &total_nclients, int64_t &nerrs);
virtual std::string server_id();
virtual std::string service_id();
virtual std::string service_pid();
virtual SrsStatisticVhost *find_vhost_by_id(std::string vid);
virtual SrsStatisticStream *find_stream(std::string sid);
virtual SrsStatisticStream *find_stream_by_url(std::string url);
virtual SrsStatisticClient *find_client(std::string client_id);
void reset();
};
// Mock ISrsHttpConn for testing SrsHttpxConn
class MockHttpConnForHttpxConn : public ISrsHttpConn
{
public:
std::string remote_ip_;
SrsContextId context_id_;
ISrsKbpsDelta *delta_;
public:
MockHttpConnForHttpxConn();
virtual ~MockHttpConnForHttpxConn();
public:
virtual ISrsKbpsDelta *delta();
virtual srs_error_t start();
virtual srs_error_t cycle();
virtual srs_error_t pull();
virtual srs_error_t set_crossdomain_enabled(bool v);
virtual srs_error_t set_auth_enabled(bool auth_enabled);
virtual srs_error_t set_jsonp(bool v);
virtual std::string remote_ip();
virtual const SrsContextId &get_id();
virtual std::string desc();
virtual void expire();
};
// Mock ISrsFFMPEG for testing SrsEncoder
class MockFFMPEGForEncoder : public ISrsFFMPEG
{
public:
bool initialize_called_;
bool start_called_;
srs_error_t start_error_;
std::string output_;
public:
MockFFMPEGForEncoder();
virtual ~MockFFMPEGForEncoder();
public:
virtual void append_iparam(std::string iparam);
virtual void set_oformat(std::string format);
virtual std::string output();
virtual srs_error_t initialize(std::string in, std::string out, std::string log);
virtual srs_error_t initialize_transcode(SrsConfDirective *engine);
virtual srs_error_t initialize_copy();
virtual srs_error_t start();
virtual srs_error_t cycle();
virtual void stop();
virtual void fast_stop();
virtual void fast_kill();
void reset();
};
// Mock ISrsAppConfig for testing SrsEncoder
class MockAppConfigForEncoder : public MockAppConfig
{
public:
SrsConfDirective *transcode_directive_;
bool transcode_enabled_;
std::string transcode_ffmpeg_bin_;
std::vector<SrsConfDirective *> transcode_engines_;
bool engine_enabled_;
std::string target_scope_; // The scope for which to return transcode_directive_
public:
MockAppConfigForEncoder();
virtual ~MockAppConfigForEncoder();
public:
virtual SrsConfDirective *get_transcode(std::string vhost, std::string scope);
virtual bool get_transcode_enabled(SrsConfDirective *conf);
virtual std::string get_transcode_ffmpeg(SrsConfDirective *conf);
virtual std::vector<SrsConfDirective *> get_transcode_engines(SrsConfDirective *conf);
virtual bool get_engine_enabled(SrsConfDirective *conf);
virtual std::string get_engine_output(SrsConfDirective *conf);
virtual bool get_ff_log_enabled();
void reset();
};
// Mock ISrsAppFactory for testing SrsEncoder
class MockAppFactoryForEncoder : public SrsAppFactory
{
public:
MockFFMPEGForEncoder *mock_ffmpeg_;
public:
MockAppFactoryForEncoder();
virtual ~MockAppFactoryForEncoder();
public:
virtual ISrsFFMPEG *create_ffmpeg(std::string ffmpeg_bin);
void reset();
};
// Mock ISrsHttpResponseReader for testing SrsLatestVersion
class MockHttpResponseReaderForLatestVersion : public ISrsHttpResponseReader
{
public:
std::string content_;
size_t read_pos_;
bool eof_;
public:
MockHttpResponseReaderForLatestVersion();
virtual ~MockHttpResponseReaderForLatestVersion();
public:
virtual srs_error_t read(void *buf, size_t size, ssize_t *nread);
virtual bool eof();
void reset();
};
// Mock ISrsHttpMessage for testing SrsLatestVersion
class MockHttpMessageForLatestVersion : public ISrsHttpMessage
{
public:
int status_code_;
std::string body_content_;
MockHttpResponseReaderForLatestVersion *body_reader_;
public:
MockHttpMessageForLatestVersion();
virtual ~MockHttpMessageForLatestVersion();
public:
virtual uint8_t message_type();
virtual uint8_t method();
virtual uint16_t status_code();
virtual std::string method_str();
virtual bool is_http_get();
virtual bool is_http_put();
virtual bool is_http_post();
virtual bool is_http_delete();
virtual bool is_http_options();
virtual std::string uri();
virtual std::string url();
virtual std::string host();
virtual std::string path();
virtual std::string query();
virtual std::string ext();
virtual srs_error_t body_read_all(std::string &body);
virtual ISrsHttpResponseReader *body_reader();
virtual int64_t content_length();
virtual std::string query_get(std::string key);
virtual SrsHttpHeader *header();
virtual bool is_jsonp();
virtual bool is_keep_alive();
virtual ISrsRequest *to_request(std::string vhost);
virtual std::string parse_rest_id(std::string pattern);
void reset();
};
// Mock ISrsHttpClient for testing SrsLatestVersion
class MockHttpClientForLatestVersion : public ISrsHttpClient
{
public:
bool initialize_called_;
bool get_called_;
std::string schema_;
std::string host_;
int port_;
std::string path_;
MockHttpMessageForLatestVersion *mock_response_;
srs_error_t initialize_error_;
srs_error_t get_error_;
public:
MockHttpClientForLatestVersion();
virtual ~MockHttpClientForLatestVersion();
public:
virtual srs_error_t initialize(std::string schema, std::string h, int p, srs_utime_t tm = SRS_HTTP_CLIENT_TIMEOUT);
virtual srs_error_t get(std::string path, std::string req, ISrsHttpMessage **ppmsg);
virtual srs_error_t post(std::string path, std::string req, ISrsHttpMessage **ppmsg);
virtual void set_recv_timeout(srs_utime_t tm);
virtual void kbps_sample(const char *label, srs_utime_t age);
void reset();
};
// Mock ISrsAppFactory for testing SrsLatestVersion
class MockAppFactoryForLatestVersion : public SrsAppFactory
{
public:
MockHttpClientForLatestVersion *mock_http_client_;
bool create_http_client_called_;
public:
MockAppFactoryForLatestVersion();
virtual ~MockAppFactoryForLatestVersion();
public:
virtual ISrsHttpClient *create_http_client();
void reset();
};
// Mock ISrsHttpMessage for testing SrsHttpHeartbeat
class MockHttpMessageForHeartbeat : public ISrsHttpMessage
{
public:
int status_code_;
std::string body_content_;
ISrsReader *body_reader_;
public:
MockHttpMessageForHeartbeat();
virtual ~MockHttpMessageForHeartbeat();
public:
virtual uint8_t method();
virtual uint16_t status_code();
virtual std::string method_str();
virtual std::string url();
virtual std::string host();
virtual std::string path();
virtual std::string query();
virtual std::string ext();
virtual srs_error_t body_read_all(std::string &body);
virtual ISrsHttpResponseReader *body_reader();
virtual int64_t content_length();
virtual std::string query_get(std::string key);
virtual SrsHttpHeader *header();
virtual bool is_jsonp();
virtual bool is_keep_alive();
virtual ISrsRequest *to_request(std::string vhost);
virtual std::string parse_rest_id(std::string pattern);
virtual uint8_t message_type();
virtual bool is_http_get();
virtual bool is_http_put();
virtual bool is_http_post();
virtual bool is_http_delete();
virtual bool is_http_options();
virtual std::string uri();
void reset();
};
// Mock ISrsHttpClient for testing SrsHttpHeartbeat
class MockHttpClientForHeartbeat : public ISrsHttpClient
{
public:
bool initialize_called_;
bool post_called_;
std::string schema_;
std::string host_;
int port_;
std::string path_;
std::string request_body_;
MockHttpMessageForHeartbeat *mock_response_;
srs_error_t initialize_error_;
srs_error_t post_error_;
bool should_delete_response_;
public:
MockHttpClientForHeartbeat();
virtual ~MockHttpClientForHeartbeat();
public:
virtual srs_error_t initialize(std::string schema, std::string h, int p, srs_utime_t tm = SRS_HTTP_CLIENT_TIMEOUT);
virtual srs_error_t get(std::string path, std::string req, ISrsHttpMessage **ppmsg);
virtual srs_error_t post(std::string path, std::string req, ISrsHttpMessage **ppmsg);
virtual void set_recv_timeout(srs_utime_t tm);
virtual void kbps_sample(const char *label, srs_utime_t age);
void reset();
};
// Mock ISrsAppFactory for testing SrsHttpHeartbeat
class MockAppFactoryForHeartbeat : public SrsAppFactory
{
public:
MockHttpClientForHeartbeat *mock_http_client_;
bool create_http_client_called_;
bool should_delete_client_;
public:
MockAppFactoryForHeartbeat();
virtual ~MockAppFactoryForHeartbeat();
public:
virtual ISrsHttpClient *create_http_client();
void reset();
};
// Mock ISrsAppConfig for testing SrsHttpHeartbeat
class MockAppConfigForHeartbeat : public MockAppConfig
{
public:
std::string heartbeat_url_;
std::string heartbeat_device_id_;
bool heartbeat_summaries_;
bool heartbeat_ports_;
int stats_network_;
bool http_stream_enabled_;
bool http_api_enabled_;
bool srt_enabled_;
bool rtsp_server_enabled_;
bool rtc_server_enabled_;
bool rtc_server_tcp_enabled_;
std::vector<std::string> listens_;
std::vector<std::string> http_stream_listens_;
std::vector<std::string> http_api_listens_;
std::vector<std::string> srt_listens_;
std::vector<std::string> rtsp_server_listens_;
std::vector<std::string> rtc_server_listens_;
std::vector<std::string> rtc_server_tcp_listens_;
public:
MockAppConfigForHeartbeat();
virtual ~MockAppConfigForHeartbeat();
public:
virtual std::string get_heartbeat_url();
virtual std::string get_heartbeat_device_id();
virtual bool get_heartbeat_summaries();
virtual bool get_heartbeat_ports();
virtual int get_stats_network();
virtual std::vector<std::string> get_listens();
virtual bool get_http_stream_enabled();
virtual std::vector<std::string> get_http_stream_listens();
virtual bool get_http_api_enabled();
virtual std::vector<std::string> get_http_api_listens();
virtual bool get_srt_enabled();
virtual std::vector<std::string> get_srt_listens();
virtual bool get_rtsp_server_enabled();
virtual std::vector<std::string> get_rtsp_server_listens();
virtual bool get_rtc_server_enabled();
virtual std::vector<std::string> get_rtc_server_listens();
virtual bool get_rtc_server_tcp_enabled();
virtual std::vector<std::string> get_rtc_server_tcp_listens();
};
// Mock ISrsAppConfig for testing SrsCircuitBreaker
class MockAppConfigForCircuitBreaker : public MockAppConfig
{
public:
bool circuit_breaker_enabled_;
int high_threshold_;
int high_pulse_;
int critical_threshold_;
int critical_pulse_;
int dying_threshold_;
int dying_pulse_;
public:
MockAppConfigForCircuitBreaker();
virtual ~MockAppConfigForCircuitBreaker();
public:
virtual bool get_circuit_breaker();
virtual int get_high_threshold();
virtual int get_high_pulse();
virtual int get_critical_threshold();
virtual int get_critical_pulse();
virtual int get_dying_threshold();
virtual int get_dying_pulse();
};
// Mock ISrsFastTimer for testing SrsCircuitBreaker
class MockFastTimerForCircuitBreaker : public ISrsFastTimer
{
public:
bool subscribe_called_;
ISrsFastTimerHandler *subscribed_handler_;
public:
MockFastTimerForCircuitBreaker();
virtual ~MockFastTimerForCircuitBreaker();
public:
virtual srs_error_t start();
virtual void subscribe(ISrsFastTimerHandler *handler);
virtual void unsubscribe(ISrsFastTimerHandler *handler);
void reset();
};
// Mock ISrsSharedTimer for testing SrsCircuitBreaker
class MockSharedTimerForCircuitBreaker : public ISrsSharedTimer
{
public:
MockFastTimerForCircuitBreaker *timer1s_;
public:
MockSharedTimerForCircuitBreaker();
virtual ~MockSharedTimerForCircuitBreaker();
public:
virtual ISrsFastTimer *timer20ms();
virtual ISrsFastTimer *timer100ms();
virtual ISrsFastTimer *timer1s();
virtual ISrsFastTimer *timer5s();
};
// Mock ISrsHost for testing SrsCircuitBreaker
class MockHostForCircuitBreaker : public ISrsHost
{
public:
SrsProcSelfStat *proc_stat_;
public:
MockHostForCircuitBreaker();
virtual ~MockHostForCircuitBreaker();
public:
virtual SrsProcSelfStat *self_proc_stat();
};
#endif