srs/trunk/src/utest/srs_utest_config2.cpp
Winlin 04b88e889f AI: Improve coverage of app by utest (#4494)
Co-authored-by: OSSRS-AI <winlinam@gmail.com>
2025-09-17 21:51:07 -04:00

5517 lines
205 KiB
C++

//
// Copyright (c) 2013-2025 The SRS Authors
//
// SPDX-License-Identifier: MIT
//
#include <srs_utest_config2.hpp>
#include <srs_app_utility.hpp>
#include <srs_kernel_error.hpp>
#include <srs_kernel_file.hpp>
#include <srs_kernel_utility.hpp>
#include <srs_utest_kernel.hpp>
VOID TEST(ConfigMainTest, CheckIncludeEmptyConfig)
{
srs_error_t err;
if (true) {
string filepath = _srs_tmp_file_prefix + "utest-main.conf";
MockFileRemover _mfr(filepath);
string included = _srs_tmp_file_prefix + "utest-included-empty.conf";
MockFileRemover _mfr2(included);
if (true) {
SrsFileWriter fw;
fw.open(included);
}
if (true) {
SrsFileWriter fw;
fw.open(filepath);
string content = _MIN_OK_CONF "include " + included + ";";
fw.write((void *)content.data(), (int)content.length(), NULL);
}
SrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.parse_file(filepath.c_str()));
EXPECT_EQ(1, (int)conf.get_listens().size());
}
if (true) {
MockSrsConfig conf;
conf.mock_include("test.conf", "");
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "include test.conf;"));
EXPECT_EQ(1, (int)conf.get_listens().size());
}
}
VOID TEST(ConfigMainTest, CheckHttpListenFollow)
{
srs_error_t err;
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "http_api{enabled on;https{enabled on;}}http_server{enabled on;listen 1985;https{enabled on;listen 4567;}}"));
EXPECT_TRUE(conf.get_http_stream_enabled());
// If http API use same port to HTTP server.
EXPECT_EQ(1, (int)conf.get_http_stream_listens().size());
EXPECT_STREQ("1985", conf.get_http_stream_listens().at(0).c_str());
EXPECT_EQ(1, (int)conf.get_http_api_listens().size());
EXPECT_STREQ("1985", conf.get_http_api_listens().at(0).c_str());
// Then HTTPS API should use the same port to HTTPS server.
EXPECT_EQ(1, (int)conf.get_https_stream_listens().size());
EXPECT_STREQ("4567", conf.get_https_stream_listens().at(0).c_str());
EXPECT_EQ(1, (int)conf.get_https_api_listens().size());
EXPECT_STREQ("4567", conf.get_https_api_listens().at(0).c_str());
EXPECT_TRUE(conf.get_http_stream_crossdomain());
}
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "http_api{enabled on;listen 8080;https{enabled on;}}http_server{enabled on;https{enabled on;listen 4567;}}"));
EXPECT_TRUE(conf.get_http_stream_enabled());
// If http API use same port to HTTP server.
EXPECT_EQ(1, (int)conf.get_http_stream_listens().size());
EXPECT_STREQ("8080", conf.get_http_stream_listens().at(0).c_str());
EXPECT_EQ(1, (int)conf.get_http_api_listens().size());
EXPECT_STREQ("8080", conf.get_http_api_listens().at(0).c_str());
// Then HTTPS API should use the same port to HTTPS server.
EXPECT_EQ(1, (int)conf.get_https_stream_listens().size());
EXPECT_STREQ("4567", conf.get_https_stream_listens().at(0).c_str());
EXPECT_EQ(1, (int)conf.get_https_api_listens().size());
EXPECT_STREQ("4567", conf.get_https_api_listens().at(0).c_str());
EXPECT_TRUE(conf.get_http_stream_crossdomain());
}
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "http_api{enabled on;listen 8080;https{enabled on;}}http_server{enabled on;https{enabled on;}}"));
EXPECT_TRUE(conf.get_http_stream_enabled());
// If http API use same port to HTTP server.
EXPECT_EQ(1, (int)conf.get_http_stream_listens().size());
EXPECT_STREQ("8080", conf.get_http_stream_listens().at(0).c_str());
EXPECT_EQ(1, (int)conf.get_http_api_listens().size());
EXPECT_STREQ("8080", conf.get_http_api_listens().at(0).c_str());
// Then HTTPS API should use the same port to HTTPS server.
EXPECT_EQ(1, (int)conf.get_https_stream_listens().size());
EXPECT_STREQ("8088", conf.get_https_stream_listens().at(0).c_str());
EXPECT_EQ(1, (int)conf.get_https_api_listens().size());
EXPECT_STREQ("8088", conf.get_https_api_listens().at(0).c_str());
EXPECT_TRUE(conf.get_http_stream_crossdomain());
}
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "http_api{enabled on;https{enabled on;}}http_server{enabled on;listen 1985;https{enabled on;}}"));
EXPECT_TRUE(conf.get_http_stream_enabled());
// If http API use same port to HTTP server.
EXPECT_EQ(1, (int)conf.get_http_stream_listens().size());
EXPECT_STREQ("1985", conf.get_http_stream_listens().at(0).c_str());
EXPECT_EQ(1, (int)conf.get_http_api_listens().size());
EXPECT_STREQ("1985", conf.get_http_api_listens().at(0).c_str());
// Then HTTPS API should use the same port to HTTPS server.
EXPECT_EQ(1, (int)conf.get_https_stream_listens().size());
EXPECT_STREQ("8088", conf.get_https_stream_listens().at(0).c_str());
EXPECT_EQ(1, (int)conf.get_https_api_listens().size());
EXPECT_STREQ("8088", conf.get_https_api_listens().at(0).c_str());
EXPECT_TRUE(conf.get_http_stream_crossdomain());
}
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "http_api{enabled on;listen 1234;https{enabled on;}}http_server{enabled on;listen 1234;https{enabled on;}}"));
EXPECT_TRUE(conf.get_http_stream_enabled());
// If http API use same port to HTTP server.
EXPECT_EQ(1, (int)conf.get_http_stream_listens().size());
EXPECT_STREQ("1234", conf.get_http_stream_listens().at(0).c_str());
EXPECT_EQ(1, (int)conf.get_http_api_listens().size());
EXPECT_STREQ("1234", conf.get_http_api_listens().at(0).c_str());
// Then HTTPS API should use the same port to HTTPS server.
EXPECT_EQ(1, (int)conf.get_https_stream_listens().size());
EXPECT_STREQ("8088", conf.get_https_stream_listens().at(0).c_str());
EXPECT_EQ(1, (int)conf.get_https_api_listens().size());
EXPECT_STREQ("8088", conf.get_https_api_listens().at(0).c_str());
EXPECT_TRUE(conf.get_http_stream_crossdomain());
}
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "http_api{enabled on;listen 1234;https{enabled on;}}http_server{enabled on;listen 1234;https{enabled on;listen 4567;}}"));
EXPECT_TRUE(conf.get_http_stream_enabled());
// If http API use same port to HTTP server.
EXPECT_EQ(1, (int)conf.get_http_stream_listens().size());
EXPECT_STREQ("1234", conf.get_http_stream_listens().at(0).c_str());
EXPECT_EQ(1, (int)conf.get_http_api_listens().size());
EXPECT_STREQ("1234", conf.get_http_api_listens().at(0).c_str());
// Then HTTPS API should use the same port to HTTPS server.
EXPECT_EQ(1, (int)conf.get_https_stream_listens().size());
EXPECT_STREQ("4567", conf.get_https_stream_listens().at(0).c_str());
EXPECT_EQ(1, (int)conf.get_https_api_listens().size());
EXPECT_STREQ("4567", conf.get_https_api_listens().at(0).c_str());
EXPECT_TRUE(conf.get_http_stream_crossdomain());
}
}
extern bool srs_directive_equals(SrsConfDirective *a, SrsConfDirective *b);
extern bool srs_directive_equals(SrsConfDirective *a, SrsConfDirective *b, string except);
VOID TEST(ConfigDirectiveTest, DirectiveEqualsNullBoth)
{
// Test the case where both directives are NULL - should return true
EXPECT_TRUE(srs_directive_equals(NULL, NULL));
}
VOID TEST(ConfigDirectiveTest, DirectiveEqualsWithExceptParameter)
{
// Test srs_directive_equals with except parameter - both NULL case
if (true) {
// Both NULL, should return true regardless of except parameter
EXPECT_TRUE(srs_directive_equals(NULL, NULL, "any_except"));
}
// Test srs_directive_equals_self failure case
if (true) {
// Create two directives with different names - should fail srs_directive_equals_self
SrsConfDirective *a = new SrsConfDirective();
a->name_ = "vhost";
a->args_.push_back("test.com");
SrsConfDirective *b = new SrsConfDirective();
b->name_ = "different"; // Different name
b->args_.push_back("test.com");
// Should return false because srs_directive_equals_self fails
EXPECT_FALSE(srs_directive_equals(a, b, "any_except"));
srs_freep(a);
srs_freep(b);
}
// Test except parameter functionality - skip child directive with except name
if (true) {
// Create two directives that differ only in a child directive named "hls"
SrsConfDirective *a = new SrsConfDirective();
a->name_ = "vhost";
a->args_.push_back("test.com");
SrsConfDirective *child_a1 = new SrsConfDirective();
child_a1->name_ = "hls";
child_a1->args_.push_back("on");
a->directives_.push_back(child_a1);
SrsConfDirective *child_a2 = new SrsConfDirective();
child_a2->name_ = "dvr";
child_a2->args_.push_back("on");
a->directives_.push_back(child_a2);
SrsConfDirective *b = new SrsConfDirective();
b->name_ = "vhost";
b->args_.push_back("test.com");
SrsConfDirective *child_b1 = new SrsConfDirective();
child_b1->name_ = "hls";
child_b1->args_.push_back("off"); // Different from a
b->directives_.push_back(child_b1);
SrsConfDirective *child_b2 = new SrsConfDirective();
child_b2->name_ = "dvr";
child_b2->args_.push_back("on"); // Same as a
b->directives_.push_back(child_b2);
// Without except parameter, should be false because hls differs
EXPECT_FALSE(srs_directive_equals(a, b, ""));
// With except="hls", should be true because hls directive is skipped
EXPECT_TRUE(srs_directive_equals(a, b, "hls"));
// With except="dvr", should be false because hls still differs
EXPECT_FALSE(srs_directive_equals(a, b, "dvr"));
srs_freep(a);
srs_freep(b);
}
// Test recursive comparison failure case
if (true) {
// Create two directives with nested child directives that differ
SrsConfDirective *a = new SrsConfDirective();
a->name_ = "vhost";
a->args_.push_back("test.com");
SrsConfDirective *child_a = new SrsConfDirective();
child_a->name_ = "rtc";
a->directives_.push_back(child_a);
SrsConfDirective *grandchild_a = new SrsConfDirective();
grandchild_a->name_ = "enabled";
grandchild_a->args_.push_back("on");
child_a->directives_.push_back(grandchild_a);
SrsConfDirective *b = new SrsConfDirective();
b->name_ = "vhost";
b->args_.push_back("test.com");
SrsConfDirective *child_b = new SrsConfDirective();
child_b->name_ = "rtc";
b->directives_.push_back(child_b);
SrsConfDirective *grandchild_b = new SrsConfDirective();
grandchild_b->name_ = "enabled";
grandchild_b->args_.push_back("off"); // Different from a
child_b->directives_.push_back(grandchild_b);
// Should return false because nested comparison fails
EXPECT_FALSE(srs_directive_equals(a, b, "some_other_except"));
srs_freep(a);
srs_freep(b);
}
// Test multiple except directives with complex structure
if (true) {
// Create complex directives with multiple child directives
SrsConfDirective *a = new SrsConfDirective();
a->name_ = "vhost";
a->args_.push_back("test.com");
SrsConfDirective *child_a1 = new SrsConfDirective();
child_a1->name_ = "hls";
child_a1->args_.push_back("on");
a->directives_.push_back(child_a1);
SrsConfDirective *child_a2 = new SrsConfDirective();
child_a2->name_ = "dvr";
child_a2->args_.push_back("on");
a->directives_.push_back(child_a2);
SrsConfDirective *child_a3 = new SrsConfDirective();
child_a3->name_ = "rtc";
child_a3->args_.push_back("on");
a->directives_.push_back(child_a3);
SrsConfDirective *b = new SrsConfDirective();
b->name_ = "vhost";
b->args_.push_back("test.com");
SrsConfDirective *child_b1 = new SrsConfDirective();
child_b1->name_ = "hls";
child_b1->args_.push_back("off"); // Different
b->directives_.push_back(child_b1);
SrsConfDirective *child_b2 = new SrsConfDirective();
child_b2->name_ = "dvr";
child_b2->args_.push_back("off"); // Different
b->directives_.push_back(child_b2);
SrsConfDirective *child_b3 = new SrsConfDirective();
child_b3->name_ = "rtc";
child_b3->args_.push_back("on"); // Same
b->directives_.push_back(child_b3);
// Without except, should be false
EXPECT_FALSE(srs_directive_equals(a, b, ""));
// Skip hls, should still be false because dvr differs
EXPECT_FALSE(srs_directive_equals(a, b, "hls"));
// Skip dvr, should still be false because hls differs
EXPECT_FALSE(srs_directive_equals(a, b, "dvr"));
srs_freep(a);
srs_freep(b);
}
// Test edge case: empty directives with except parameter
if (true) {
// Create two identical empty directives
SrsConfDirective *a = new SrsConfDirective();
a->name_ = "simple";
a->args_.push_back("value");
SrsConfDirective *b = new SrsConfDirective();
b->name_ = "simple";
b->args_.push_back("value");
// Should be equal even with except parameter since no child directives
EXPECT_TRUE(srs_directive_equals(a, b, "any_except"));
srs_freep(a);
srs_freep(b);
}
// Test case where only one directive has the except child
if (true) {
SrsConfDirective *a = new SrsConfDirective();
a->name_ = "vhost";
a->args_.push_back("test.com");
SrsConfDirective *child_a = new SrsConfDirective();
child_a->name_ = "hls";
child_a->args_.push_back("on");
a->directives_.push_back(child_a);
SrsConfDirective *b = new SrsConfDirective();
b->name_ = "vhost";
b->args_.push_back("test.com");
SrsConfDirective *child_b = new SrsConfDirective();
child_b->name_ = "dvr"; // Different name, not "hls"
child_b->args_.push_back("on");
b->directives_.push_back(child_b);
// Should be false because child directive names differ
// and "hls" is not present in b to be skipped
EXPECT_FALSE(srs_directive_equals(a, b, "hls"));
srs_freep(a);
srs_freep(b);
}
}
VOID TEST(ConfigDirectiveTest, DirectiveEqualsWithChildDirectives)
{
// Test the recursive comparison of child directives
if (true) {
// Create two identical directives with child directives
SrsConfDirective *a = new SrsConfDirective();
a->name_ = "vhost";
a->args_.push_back("test.com");
SrsConfDirective *child_a = new SrsConfDirective();
child_a->name_ = "hls";
child_a->args_.push_back("on");
a->directives_.push_back(child_a);
SrsConfDirective *b = new SrsConfDirective();
b->name_ = "vhost";
b->args_.push_back("test.com");
SrsConfDirective *child_b = new SrsConfDirective();
child_b->name_ = "hls";
child_b->args_.push_back("on");
b->directives_.push_back(child_b);
// Should be equal since all properties and child directives match
EXPECT_TRUE(srs_directive_equals(a, b));
srs_freep(a);
srs_freep(b);
}
if (true) {
// Create two directives with different child directives
SrsConfDirective *a = new SrsConfDirective();
a->name_ = "vhost";
a->args_.push_back("test.com");
SrsConfDirective *child_a = new SrsConfDirective();
child_a->name_ = "hls";
child_a->args_.push_back("on");
a->directives_.push_back(child_a);
SrsConfDirective *b = new SrsConfDirective();
b->name_ = "vhost";
b->args_.push_back("test.com");
SrsConfDirective *child_b = new SrsConfDirective();
child_b->name_ = "hls";
child_b->args_.push_back("off"); // Different argument
b->directives_.push_back(child_b);
// Should not be equal since child directive arguments differ
EXPECT_FALSE(srs_directive_equals(a, b));
srs_freep(a);
srs_freep(b);
}
if (true) {
// Create two directives with multiple levels of child directives
SrsConfDirective *a = new SrsConfDirective();
a->name_ = "vhost";
a->args_.push_back("test.com");
SrsConfDirective *child_a = new SrsConfDirective();
child_a->name_ = "hls";
SrsConfDirective *grandchild_a = new SrsConfDirective();
grandchild_a->name_ = "enabled";
grandchild_a->args_.push_back("on");
child_a->directives_.push_back(grandchild_a);
a->directives_.push_back(child_a);
SrsConfDirective *b = new SrsConfDirective();
b->name_ = "vhost";
b->args_.push_back("test.com");
SrsConfDirective *child_b = new SrsConfDirective();
child_b->name_ = "hls";
SrsConfDirective *grandchild_b = new SrsConfDirective();
grandchild_b->name_ = "enabled";
grandchild_b->args_.push_back("on");
child_b->directives_.push_back(grandchild_b);
b->directives_.push_back(child_b);
// Should be equal since all nested directives match
EXPECT_TRUE(srs_directive_equals(a, b));
srs_freep(a);
srs_freep(b);
}
if (true) {
// Create two directives with multiple child directives
SrsConfDirective *a = new SrsConfDirective();
a->name_ = "vhost";
a->args_.push_back("test.com");
SrsConfDirective *child_a1 = new SrsConfDirective();
child_a1->name_ = "hls";
child_a1->args_.push_back("on");
a->directives_.push_back(child_a1);
SrsConfDirective *child_a2 = new SrsConfDirective();
child_a2->name_ = "dvr";
child_a2->args_.push_back("off");
a->directives_.push_back(child_a2);
SrsConfDirective *b = new SrsConfDirective();
b->name_ = "vhost";
b->args_.push_back("test.com");
SrsConfDirective *child_b1 = new SrsConfDirective();
child_b1->name_ = "hls";
child_b1->args_.push_back("on");
b->directives_.push_back(child_b1);
SrsConfDirective *child_b2 = new SrsConfDirective();
child_b2->name_ = "dvr";
child_b2->args_.push_back("off");
b->directives_.push_back(child_b2);
// Should be equal since all child directives match
EXPECT_TRUE(srs_directive_equals(a, b));
srs_freep(a);
srs_freep(b);
}
if (true) {
// Test empty directives (no child directives)
SrsConfDirective *a = new SrsConfDirective();
a->name_ = "simple";
a->args_.push_back("value");
SrsConfDirective *b = new SrsConfDirective();
b->name_ = "simple";
b->args_.push_back("value");
// Should be equal since they have same name, args, and no child directives
EXPECT_TRUE(srs_directive_equals(a, b));
srs_freep(a);
srs_freep(b);
}
}
extern srs_error_t srs_config_transform_vhost(SrsConfDirective *root);
VOID TEST(ConfigTransformTest, TransformRtcServerRemoveDeprecatedConfigs)
{
srs_error_t err;
// Test removing perf_stat from rtc_server section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on; listen 8000; perf_stat on;}"));
// Verify perf_stat was removed during transformation
SrsConfDirective *rtc_server = conf.get_root()->get("rtc_server");
ASSERT_TRUE(rtc_server != NULL);
EXPECT_TRUE(rtc_server->get("enabled") != NULL);
EXPECT_TRUE(rtc_server->get("listen") != NULL);
EXPECT_TRUE(rtc_server->get("perf_stat") == NULL); // Should be removed
}
// Test removing queue_length from rtc_server section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on; listen 8000; queue_length 10;}"));
// Verify queue_length was removed during transformation
SrsConfDirective *rtc_server = conf.get_root()->get("rtc_server");
ASSERT_TRUE(rtc_server != NULL);
EXPECT_TRUE(rtc_server->get("enabled") != NULL);
EXPECT_TRUE(rtc_server->get("listen") != NULL);
EXPECT_TRUE(rtc_server->get("queue_length") == NULL); // Should be removed
}
// Test removing both perf_stat and queue_length from rtc_server section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on; listen 8000; perf_stat on; queue_length 10; protocol udp;}"));
// Verify both deprecated configs were removed during transformation
SrsConfDirective *rtc_server = conf.get_root()->get("rtc_server");
ASSERT_TRUE(rtc_server != NULL);
EXPECT_TRUE(rtc_server->get("enabled") != NULL);
EXPECT_TRUE(rtc_server->get("listen") != NULL);
EXPECT_TRUE(rtc_server->get("protocol") != NULL);
EXPECT_TRUE(rtc_server->get("perf_stat") == NULL); // Should be removed
EXPECT_TRUE(rtc_server->get("queue_length") == NULL); // Should be removed
}
// Test that other rtc_server configs are preserved
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on; listen 8000; protocol udp; candidate 192.168.1.100; perf_stat on; queue_length 10;}"));
// Verify valid configs are preserved and deprecated ones are removed
SrsConfDirective *rtc_server = conf.get_root()->get("rtc_server");
ASSERT_TRUE(rtc_server != NULL);
EXPECT_TRUE(rtc_server->get("enabled") != NULL);
EXPECT_TRUE(rtc_server->get("listen") != NULL);
EXPECT_TRUE(rtc_server->get("protocol") != NULL);
EXPECT_TRUE(rtc_server->get("candidate") != NULL);
EXPECT_TRUE(rtc_server->get("perf_stat") == NULL); // Should be removed
EXPECT_TRUE(rtc_server->get("queue_length") == NULL); // Should be removed
}
// Test rtc_server section without deprecated configs (should remain unchanged)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on; listen 8000; protocol udp;}"));
// Verify all configs are preserved when no deprecated configs present
SrsConfDirective *rtc_server = conf.get_root()->get("rtc_server");
ASSERT_TRUE(rtc_server != NULL);
EXPECT_TRUE(rtc_server->get("enabled") != NULL);
EXPECT_TRUE(rtc_server->get("listen") != NULL);
EXPECT_TRUE(rtc_server->get("protocol") != NULL);
EXPECT_EQ(3, (int)rtc_server->directives_.size()); // Should have exactly 3 directives
}
// Test multiple rtc_server sections (edge case)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on; perf_stat on;} rtc_server{listen 8001; queue_length 5;}"));
// Get all rtc_server directives
std::vector<SrsConfDirective *> rtc_servers;
for (int i = 0; i < (int)conf.get_root()->directives_.size(); i++) {
SrsConfDirective *dir = conf.get_root()->directives_.at(i);
if (dir->name_ == "rtc_server") {
rtc_servers.push_back(dir);
}
}
// Should have 2 rtc_server sections
EXPECT_EQ(2, (int)rtc_servers.size());
// First rtc_server should have enabled but not perf_stat
EXPECT_TRUE(rtc_servers[0]->get("enabled") != NULL);
EXPECT_TRUE(rtc_servers[0]->get("perf_stat") == NULL);
// Second rtc_server should have listen but not queue_length
EXPECT_TRUE(rtc_servers[1]->get("listen") != NULL);
EXPECT_TRUE(rtc_servers[1]->get("queue_length") == NULL);
}
}
VOID TEST(ConfigTransformTest, TransformRtcServerNestedDeprecatedConfigs)
{
srs_error_t err;
// Test nested rtc_server with deprecated configs in complex structure
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on; listen 8000; perf_stat{enabled on; interval 30;} queue_length 100;}"));
// Verify nested perf_stat directive is completely removed
SrsConfDirective *rtc_server = conf.get_root()->get("rtc_server");
ASSERT_TRUE(rtc_server != NULL);
EXPECT_TRUE(rtc_server->get("enabled") != NULL);
EXPECT_TRUE(rtc_server->get("listen") != NULL);
EXPECT_TRUE(rtc_server->get("perf_stat") == NULL); // Should be removed entirely
EXPECT_TRUE(rtc_server->get("queue_length") == NULL); // Should be removed
}
// Test rtc_server with only deprecated configs
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{perf_stat on; queue_length 50;}"));
// Verify rtc_server section exists but is empty after removing deprecated configs
SrsConfDirective *rtc_server = conf.get_root()->get("rtc_server");
ASSERT_TRUE(rtc_server != NULL);
EXPECT_EQ(0, (int)rtc_server->directives_.size()); // Should be empty
EXPECT_TRUE(rtc_server->get("perf_stat") == NULL);
EXPECT_TRUE(rtc_server->get("queue_length") == NULL);
}
// Test rtc_server with mixed valid and deprecated configs in different order
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{perf_stat on; enabled on; queue_length 25; listen 8000; protocol udp; perf_stat off;}"));
// Verify all perf_stat instances are removed and valid configs preserved
SrsConfDirective *rtc_server = conf.get_root()->get("rtc_server");
ASSERT_TRUE(rtc_server != NULL);
EXPECT_TRUE(rtc_server->get("enabled") != NULL);
EXPECT_TRUE(rtc_server->get("listen") != NULL);
EXPECT_TRUE(rtc_server->get("protocol") != NULL);
EXPECT_TRUE(rtc_server->get("perf_stat") == NULL); // All instances should be removed
EXPECT_TRUE(rtc_server->get("queue_length") == NULL); // Should be removed
EXPECT_EQ(3, (int)rtc_server->directives_.size()); // Should have exactly 3 valid directives
}
}
VOID TEST(ConfigTransformTest, TransformRtcServerPreserveOtherSections)
{
srs_error_t err;
// Test that deprecated config removal only affects rtc_server sections
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on; perf_stat on; queue_length 10;} http_server{enabled on; listen 8080;}"));
// Verify rtc_server has deprecated configs removed
SrsConfDirective *rtc_server = conf.get_root()->get("rtc_server");
ASSERT_TRUE(rtc_server != NULL);
EXPECT_TRUE(rtc_server->get("enabled") != NULL);
EXPECT_TRUE(rtc_server->get("perf_stat") == NULL); // Should be removed from rtc_server
EXPECT_TRUE(rtc_server->get("queue_length") == NULL); // Should be removed from rtc_server
// Verify http_server preserves all valid configs (transformation doesn't affect it)
SrsConfDirective *http_server = conf.get_root()->get("http_server");
ASSERT_TRUE(http_server != NULL);
EXPECT_TRUE(http_server->get("enabled") != NULL);
EXPECT_TRUE(http_server->get("listen") != NULL); // Should be preserved in http_server
}
// Test vhost sections are not affected by rtc_server transformation
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{perf_stat on; queue_length 5;} vhost test.com{rtc{enabled on; rtmp_to_rtc on;}}"));
// Verify rtc_server has deprecated configs removed
SrsConfDirective *rtc_server = conf.get_root()->get("rtc_server");
ASSERT_TRUE(rtc_server != NULL);
EXPECT_TRUE(rtc_server->get("perf_stat") == NULL);
EXPECT_TRUE(rtc_server->get("queue_length") == NULL);
// Verify vhost rtc section preserves valid configs (different section)
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL);
EXPECT_TRUE(rtc->get("enabled") != NULL);
EXPECT_TRUE(rtc->get("rtmp_to_rtc") != NULL); // Should be preserved in vhost.rtc
}
}
VOID TEST(ConfigTransformTest, TransformVhostDirectCall)
{
srs_error_t err;
// Test direct call to srs_config_transform_vhost function
if (true) {
// Create a root directive with rtc_server containing deprecated configs
SrsConfDirective *root = new SrsConfDirective();
// Add rtmp section (required for valid config)
SrsConfDirective *rtmp = new SrsConfDirective();
rtmp->name_ = "rtmp";
SrsConfDirective *listen = new SrsConfDirective();
listen->name_ = "listen";
listen->args_.push_back("1935");
rtmp->directives_.push_back(listen);
root->directives_.push_back(rtmp);
// Add rtc_server section with deprecated configs
SrsConfDirective *rtc_server = new SrsConfDirective();
rtc_server->name_ = "rtc_server";
SrsConfDirective *enabled = new SrsConfDirective();
enabled->name_ = "enabled";
enabled->args_.push_back("on");
rtc_server->directives_.push_back(enabled);
SrsConfDirective *perf_stat = new SrsConfDirective();
perf_stat->name_ = "perf_stat";
perf_stat->args_.push_back("on");
rtc_server->directives_.push_back(perf_stat);
SrsConfDirective *queue_length = new SrsConfDirective();
queue_length->name_ = "queue_length";
queue_length->args_.push_back("100");
rtc_server->directives_.push_back(queue_length);
SrsConfDirective *protocol = new SrsConfDirective();
protocol->name_ = "protocol";
protocol->args_.push_back("udp");
rtc_server->directives_.push_back(protocol);
root->directives_.push_back(rtc_server);
// Verify initial state
EXPECT_EQ(4, (int)rtc_server->directives_.size());
EXPECT_TRUE(rtc_server->get("enabled") != NULL);
EXPECT_TRUE(rtc_server->get("perf_stat") != NULL);
EXPECT_TRUE(rtc_server->get("queue_length") != NULL);
EXPECT_TRUE(rtc_server->get("protocol") != NULL);
// Call the transform function directly
HELPER_ASSERT_SUCCESS(srs_config_transform_vhost(root));
// Verify deprecated configs were removed
EXPECT_EQ(2, (int)rtc_server->directives_.size()); // Should have only enabled and protocol
EXPECT_TRUE(rtc_server->get("enabled") != NULL);
EXPECT_TRUE(rtc_server->get("protocol") != NULL);
EXPECT_TRUE(rtc_server->get("perf_stat") == NULL); // Should be removed
EXPECT_TRUE(rtc_server->get("queue_length") == NULL); // Should be removed
srs_freep(root);
}
// Test transform function with empty rtc_server section
if (true) {
SrsConfDirective *root = new SrsConfDirective();
// Add rtmp section (required for valid config)
SrsConfDirective *rtmp = new SrsConfDirective();
rtmp->name_ = "rtmp";
SrsConfDirective *listen = new SrsConfDirective();
listen->name_ = "listen";
listen->args_.push_back("1935");
rtmp->directives_.push_back(listen);
root->directives_.push_back(rtmp);
// Add empty rtc_server section
SrsConfDirective *rtc_server = new SrsConfDirective();
rtc_server->name_ = "rtc_server";
root->directives_.push_back(rtc_server);
// Verify initial state
EXPECT_EQ(0, (int)rtc_server->directives_.size());
// Call the transform function directly
HELPER_ASSERT_SUCCESS(srs_config_transform_vhost(root));
// Verify rtc_server remains empty
EXPECT_EQ(0, (int)rtc_server->directives_.size());
srs_freep(root);
}
}
VOID TEST(ConfigTransformTest, TransformVhostNackToRtc)
{
srs_error_t err;
// Test transforming vhost nack directive to vhost.rtc.nack
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{nack{enabled on;}}"));
// Verify nack was moved to rtc section
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
EXPECT_TRUE(vhost->get("nack") == NULL); // Should be removed from vhost level
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL); // Should be created
EXPECT_TRUE(rtc->get("nack") != NULL); // Should be moved here
EXPECT_STREQ("on", rtc->get("nack")->arg0().c_str());
}
// Test transforming vhost nack with no_copy directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{nack{enabled on; no_copy off;}}"));
// Verify nack and nack_no_copy were moved to rtc section
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
EXPECT_TRUE(vhost->get("nack") == NULL); // Should be removed from vhost level
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL); // Should be created
EXPECT_TRUE(rtc->get("nack") != NULL); // Should be moved here
EXPECT_STREQ("on", rtc->get("nack")->arg0().c_str());
EXPECT_TRUE(rtc->get("nack_no_copy") != NULL); // Should be created from no_copy
EXPECT_STREQ("off", rtc->get("nack_no_copy")->arg0().c_str());
}
// Test transforming vhost nack with only no_copy directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{nack{no_copy on;}}"));
// Verify only nack_no_copy was created in rtc section
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
EXPECT_TRUE(vhost->get("nack") == NULL); // Should be removed from vhost level
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL); // Should be created
EXPECT_TRUE(rtc->get("nack") == NULL); // Should not be created (no enabled directive)
EXPECT_TRUE(rtc->get("nack_no_copy") != NULL); // Should be created from no_copy
EXPECT_STREQ("on", rtc->get("nack_no_copy")->arg0().c_str());
}
// Test transforming empty nack directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{nack{}}"));
// Verify nack was removed but rtc section was created (empty)
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
EXPECT_TRUE(vhost->get("nack") == NULL); // Should be removed from vhost level
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL); // Should be created
EXPECT_TRUE(rtc->get("nack") == NULL); // Should not be created (no enabled directive)
EXPECT_TRUE(rtc->get("nack_no_copy") == NULL); // Should not be created (no no_copy directive)
}
}
VOID TEST(ConfigTransformTest, TransformVhostTwccToRtc)
{
srs_error_t err;
// Test transforming vhost twcc directive to vhost.rtc.twcc
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{twcc{enabled on;}}"));
// Verify twcc was moved to rtc section
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
EXPECT_TRUE(vhost->get("twcc") == NULL); // Should be removed from vhost level
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL); // Should be created
EXPECT_TRUE(rtc->get("twcc") != NULL); // Should be moved here
EXPECT_STREQ("on", rtc->get("twcc")->arg0().c_str());
}
// Test transforming vhost twcc with enabled off
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{twcc{enabled off;}}"));
// Verify twcc was moved to rtc section with correct value
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
EXPECT_TRUE(vhost->get("twcc") == NULL); // Should be removed from vhost level
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL); // Should be created
EXPECT_TRUE(rtc->get("twcc") != NULL); // Should be moved here
EXPECT_STREQ("off", rtc->get("twcc")->arg0().c_str());
}
// Test transforming empty twcc directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{twcc{}}"));
// Verify twcc was removed but rtc section was created (empty)
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
EXPECT_TRUE(vhost->get("twcc") == NULL); // Should be removed from vhost level
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL); // Should be created
EXPECT_TRUE(rtc->get("twcc") == NULL); // Should not be created (no enabled directive)
}
}
VOID TEST(ConfigTransformTest, TransformVhostNackAndTwccToRtc)
{
srs_error_t err;
// Test transforming both nack and twcc directives together
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{nack{enabled on; no_copy off;} twcc{enabled on;}}"));
// Verify both nack and twcc were moved to rtc section
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
EXPECT_TRUE(vhost->get("nack") == NULL); // Should be removed from vhost level
EXPECT_TRUE(vhost->get("twcc") == NULL); // Should be removed from vhost level
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL); // Should be created
EXPECT_TRUE(rtc->get("nack") != NULL); // Should be moved here
EXPECT_STREQ("on", rtc->get("nack")->arg0().c_str());
EXPECT_TRUE(rtc->get("nack_no_copy") != NULL); // Should be created from no_copy
EXPECT_STREQ("off", rtc->get("nack_no_copy")->arg0().c_str());
EXPECT_TRUE(rtc->get("twcc") != NULL); // Should be moved here
EXPECT_STREQ("on", rtc->get("twcc")->arg0().c_str());
}
// Test transforming nack and twcc with existing rtc section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on;} nack{enabled off;} twcc{enabled on;}}"));
// Verify nack and twcc were added to existing rtc section
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
EXPECT_TRUE(vhost->get("nack") == NULL); // Should be removed from vhost level
EXPECT_TRUE(vhost->get("twcc") == NULL); // Should be removed from vhost level
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL); // Should exist
EXPECT_TRUE(rtc->get("enabled") != NULL); // Should preserve existing config
EXPECT_STREQ("on", rtc->get("enabled")->arg0().c_str());
EXPECT_TRUE(rtc->get("nack") != NULL); // Should be added
EXPECT_STREQ("off", rtc->get("nack")->arg0().c_str());
EXPECT_TRUE(rtc->get("twcc") != NULL); // Should be added
EXPECT_STREQ("on", rtc->get("twcc")->arg0().c_str());
}
}
VOID TEST(ConfigTransformTest, TransformVhostNackTwccMultipleVhosts)
{
srs_error_t err;
// Test transforming nack and twcc in multiple vhosts
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test1.com{nack{enabled on;}} vhost test2.com{twcc{enabled off;}} vhost test3.com{nack{no_copy on;} twcc{enabled on;}}"));
// Get all vhost directives
std::vector<SrsConfDirective *> vhosts;
for (int i = 0; i < (int)conf.get_root()->directives_.size(); i++) {
SrsConfDirective *dir = conf.get_root()->directives_.at(i);
if (dir->name_ == "vhost") {
vhosts.push_back(dir);
}
}
// Should have 3 vhost sections
EXPECT_EQ(3, (int)vhosts.size());
// First vhost (test1.com) - nack transformation
SrsConfDirective *vhost1 = NULL;
for (int i = 0; i < (int)vhosts.size(); i++) {
if (vhosts[i]->arg0() == "test1.com") {
vhost1 = vhosts[i];
break;
}
}
ASSERT_TRUE(vhost1 != NULL);
EXPECT_TRUE(vhost1->get("nack") == NULL); // Should be removed
SrsConfDirective *rtc1 = vhost1->get("rtc");
ASSERT_TRUE(rtc1 != NULL);
EXPECT_TRUE(rtc1->get("nack") != NULL);
EXPECT_STREQ("on", rtc1->get("nack")->arg0().c_str());
// Second vhost (test2.com) - twcc transformation
SrsConfDirective *vhost2 = NULL;
for (int i = 0; i < (int)vhosts.size(); i++) {
if (vhosts[i]->arg0() == "test2.com") {
vhost2 = vhosts[i];
break;
}
}
ASSERT_TRUE(vhost2 != NULL);
EXPECT_TRUE(vhost2->get("twcc") == NULL); // Should be removed
SrsConfDirective *rtc2 = vhost2->get("rtc");
ASSERT_TRUE(rtc2 != NULL);
EXPECT_TRUE(rtc2->get("twcc") != NULL);
EXPECT_STREQ("off", rtc2->get("twcc")->arg0().c_str());
// Third vhost (test3.com) - both nack and twcc transformation
SrsConfDirective *vhost3 = NULL;
for (int i = 0; i < (int)vhosts.size(); i++) {
if (vhosts[i]->arg0() == "test3.com") {
vhost3 = vhosts[i];
break;
}
}
ASSERT_TRUE(vhost3 != NULL);
EXPECT_TRUE(vhost3->get("nack") == NULL); // Should be removed
EXPECT_TRUE(vhost3->get("twcc") == NULL); // Should be removed
SrsConfDirective *rtc3 = vhost3->get("rtc");
ASSERT_TRUE(rtc3 != NULL);
EXPECT_TRUE(rtc3->get("nack_no_copy") != NULL);
EXPECT_STREQ("on", rtc3->get("nack_no_copy")->arg0().c_str());
EXPECT_TRUE(rtc3->get("twcc") != NULL);
EXPECT_STREQ("on", rtc3->get("twcc")->arg0().c_str());
}
}
VOID TEST(ConfigTransformTest, TransformVhostNackTwccComplexArgs)
{
srs_error_t err;
// Test transforming nack and twcc with multiple arguments
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{nack{enabled on off; no_copy off on;} twcc{enabled on off on;}}"));
// Verify nack and twcc were moved to rtc section with all arguments preserved
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
EXPECT_TRUE(vhost->get("nack") == NULL); // Should be removed from vhost level
EXPECT_TRUE(vhost->get("twcc") == NULL); // Should be removed from vhost level
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL); // Should be created
// Check nack directive with multiple arguments
SrsConfDirective *nack = rtc->get("nack");
ASSERT_TRUE(nack != NULL);
EXPECT_EQ(2, (int)nack->args_.size());
EXPECT_STREQ("on", nack->args_[0].c_str());
EXPECT_STREQ("off", nack->args_[1].c_str());
// Check nack_no_copy directive with multiple arguments
SrsConfDirective *nack_no_copy = rtc->get("nack_no_copy");
ASSERT_TRUE(nack_no_copy != NULL);
EXPECT_EQ(2, (int)nack_no_copy->args_.size());
EXPECT_STREQ("off", nack_no_copy->args_[0].c_str());
EXPECT_STREQ("on", nack_no_copy->args_[1].c_str());
// Check twcc directive with multiple arguments
SrsConfDirective *twcc = rtc->get("twcc");
ASSERT_TRUE(twcc != NULL);
EXPECT_EQ(3, (int)twcc->args_.size());
EXPECT_STREQ("on", twcc->args_[0].c_str());
EXPECT_STREQ("off", twcc->args_[1].c_str());
EXPECT_STREQ("on", twcc->args_[2].c_str());
}
}
VOID TEST(ConfigTransformTest, TransformVhostNackTwccPreserveOtherConfigs)
{
srs_error_t err;
// Test that transformation preserves other vhost configurations
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{hls{enabled on;} nack{enabled on;} dvr{enabled off;} twcc{enabled on;} play{mw_latency 100;}}"));
// Verify nack and twcc were moved to rtc section
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
EXPECT_TRUE(vhost->get("nack") == NULL); // Should be removed from vhost level
EXPECT_TRUE(vhost->get("twcc") == NULL); // Should be removed from vhost level
// Verify other vhost configs are preserved
EXPECT_TRUE(vhost->get("hls") != NULL); // Should be preserved
EXPECT_TRUE(vhost->get("dvr") != NULL); // Should be preserved
EXPECT_TRUE(vhost->get("play") != NULL); // Should be preserved
// Verify rtc section was created with transformed configs
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL); // Should be created
EXPECT_TRUE(rtc->get("nack") != NULL); // Should be moved here
EXPECT_STREQ("on", rtc->get("nack")->arg0().c_str());
EXPECT_TRUE(rtc->get("twcc") != NULL); // Should be moved here
EXPECT_STREQ("on", rtc->get("twcc")->arg0().c_str());
// Verify other sections have correct configs
SrsConfDirective *hls = vhost->get("hls");
ASSERT_TRUE(hls != NULL);
EXPECT_TRUE(hls->get("enabled") != NULL);
EXPECT_STREQ("on", hls->get("enabled")->arg0().c_str());
SrsConfDirective *dvr = vhost->get("dvr");
ASSERT_TRUE(dvr != NULL);
EXPECT_TRUE(dvr->get("enabled") != NULL);
EXPECT_STREQ("off", dvr->get("enabled")->arg0().c_str());
SrsConfDirective *play = vhost->get("play");
ASSERT_TRUE(play != NULL);
EXPECT_TRUE(play->get("mw_latency") != NULL);
EXPECT_STREQ("100", play->get("mw_latency")->arg0().c_str());
}
}
VOID TEST(ConfigTransformTest, TransformVhostNackTwccDirectCall)
{
srs_error_t err;
// Test direct call to srs_config_transform_vhost function with nack/twcc transformation
if (true) {
// Create a root directive with vhost containing nack and twcc
SrsConfDirective *root = new SrsConfDirective();
// Add rtmp section (required for valid config)
SrsConfDirective *rtmp = new SrsConfDirective();
rtmp->name_ = "rtmp";
SrsConfDirective *listen = new SrsConfDirective();
listen->name_ = "listen";
listen->args_.push_back("1935");
rtmp->directives_.push_back(listen);
root->directives_.push_back(rtmp);
// Add vhost section with nack and twcc
SrsConfDirective *vhost = new SrsConfDirective();
vhost->name_ = "vhost";
vhost->args_.push_back("test.com");
// Add nack directive
SrsConfDirective *nack = new SrsConfDirective();
nack->name_ = "nack";
SrsConfDirective *nack_enabled = new SrsConfDirective();
nack_enabled->name_ = "enabled";
nack_enabled->args_.push_back("on");
nack->directives_.push_back(nack_enabled);
SrsConfDirective *nack_no_copy = new SrsConfDirective();
nack_no_copy->name_ = "no_copy";
nack_no_copy->args_.push_back("off");
nack->directives_.push_back(nack_no_copy);
vhost->directives_.push_back(nack);
// Add twcc directive
SrsConfDirective *twcc = new SrsConfDirective();
twcc->name_ = "twcc";
SrsConfDirective *twcc_enabled = new SrsConfDirective();
twcc_enabled->name_ = "enabled";
twcc_enabled->args_.push_back("on");
twcc->directives_.push_back(twcc_enabled);
vhost->directives_.push_back(twcc);
root->directives_.push_back(vhost);
// Verify initial state
EXPECT_EQ(2, (int)vhost->directives_.size()); // nack and twcc
EXPECT_TRUE(vhost->get("nack") != NULL);
EXPECT_TRUE(vhost->get("twcc") != NULL);
EXPECT_TRUE(vhost->get("rtc") == NULL); // Should not exist yet
// Call the transform function directly
HELPER_ASSERT_SUCCESS(srs_config_transform_vhost(root));
// Verify nack and twcc were transformed to rtc section
EXPECT_EQ(1, (int)vhost->directives_.size()); // Should have only rtc
EXPECT_TRUE(vhost->get("nack") == NULL); // Should be removed
EXPECT_TRUE(vhost->get("twcc") == NULL); // Should be removed
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL); // Should be created
EXPECT_TRUE(rtc->get("nack") != NULL); // Should be moved here
EXPECT_STREQ("on", rtc->get("nack")->arg0().c_str());
EXPECT_TRUE(rtc->get("nack_no_copy") != NULL); // Should be created from no_copy
EXPECT_STREQ("off", rtc->get("nack_no_copy")->arg0().c_str());
EXPECT_TRUE(rtc->get("twcc") != NULL); // Should be moved here
EXPECT_STREQ("on", rtc->get("twcc")->arg0().c_str());
srs_freep(root);
}
// Test transform function with vhost containing only nack (no enabled)
if (true) {
SrsConfDirective *root = new SrsConfDirective();
// Add rtmp section (required for valid config)
SrsConfDirective *rtmp = new SrsConfDirective();
rtmp->name_ = "rtmp";
SrsConfDirective *listen = new SrsConfDirective();
listen->name_ = "listen";
listen->args_.push_back("1935");
rtmp->directives_.push_back(listen);
root->directives_.push_back(rtmp);
// Add vhost section with nack (no enabled directive)
SrsConfDirective *vhost = new SrsConfDirective();
vhost->name_ = "vhost";
vhost->args_.push_back("test.com");
// Add nack directive with only no_copy
SrsConfDirective *nack = new SrsConfDirective();
nack->name_ = "nack";
SrsConfDirective *nack_no_copy = new SrsConfDirective();
nack_no_copy->name_ = "no_copy";
nack_no_copy->args_.push_back("on");
nack->directives_.push_back(nack_no_copy);
vhost->directives_.push_back(nack);
root->directives_.push_back(vhost);
// Verify initial state
EXPECT_EQ(1, (int)vhost->directives_.size()); // nack only
EXPECT_TRUE(vhost->get("nack") != NULL);
EXPECT_TRUE(vhost->get("rtc") == NULL); // Should not exist yet
// Call the transform function directly
HELPER_ASSERT_SUCCESS(srs_config_transform_vhost(root));
// Verify nack was transformed to rtc section
EXPECT_EQ(1, (int)vhost->directives_.size()); // Should have only rtc
EXPECT_TRUE(vhost->get("nack") == NULL); // Should be removed
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL); // Should be created
EXPECT_TRUE(rtc->get("nack") == NULL); // Should not be created (no enabled directive)
EXPECT_TRUE(rtc->get("nack_no_copy") != NULL); // Should be created from no_copy
EXPECT_STREQ("on", rtc->get("nack_no_copy")->arg0().c_str());
srs_freep(root);
}
}
VOID TEST(ConfigTransformTest, TransformVhostRtcAacToRtmpToRtc)
{
srs_error_t err;
// Test transforming vhost.rtc.aac to vhost.rtc.rtmp_to_rtc with "transcode" value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on; aac transcode;}}"));
// Verify aac was transformed to rtmp_to_rtc
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL);
EXPECT_TRUE(rtc->get("aac") == NULL); // Should be removed
EXPECT_TRUE(rtc->get("rtmp_to_rtc") != NULL); // Should be created
EXPECT_STREQ("on", rtc->get("rtmp_to_rtc")->arg0().c_str()); // transcode -> on
}
// Test transforming vhost.rtc.aac to vhost.rtc.rtmp_to_rtc with non-"transcode" value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on; aac copy;}}"));
// Verify aac was transformed to rtmp_to_rtc
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL);
EXPECT_TRUE(rtc->get("aac") == NULL); // Should be removed
EXPECT_TRUE(rtc->get("rtmp_to_rtc") != NULL); // Should be created
EXPECT_STREQ("off", rtc->get("rtmp_to_rtc")->arg0().c_str()); // copy -> off
}
// Test transforming vhost.rtc.aac with empty value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on; aac;}}"));
// Verify aac was transformed to rtmp_to_rtc
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL);
EXPECT_TRUE(rtc->get("aac") == NULL); // Should be removed
EXPECT_TRUE(rtc->get("rtmp_to_rtc") != NULL); // Should be created
EXPECT_STREQ("off", rtc->get("rtmp_to_rtc")->arg0().c_str()); // empty -> off
}
// Test transforming vhost.rtc.aac with multiple arguments (only first is used)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on; aac transcode copy;}}"));
// Verify aac was transformed to rtmp_to_rtc using first argument
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL);
EXPECT_TRUE(rtc->get("aac") == NULL); // Should be removed
EXPECT_TRUE(rtc->get("rtmp_to_rtc") != NULL); // Should be created
EXPECT_STREQ("on", rtc->get("rtmp_to_rtc")->arg0().c_str()); // first arg "transcode" -> on
}
}
VOID TEST(ConfigTransformTest, TransformVhostRtcBframeToKeepBframe)
{
srs_error_t err;
// Test transforming vhost.rtc.bframe to vhost.rtc.keep_bframe with "keep" value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on; bframe keep;}}"));
// Verify bframe was transformed to keep_bframe
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL);
EXPECT_TRUE(rtc->get("bframe") == NULL); // Should be removed
EXPECT_TRUE(rtc->get("keep_bframe") != NULL); // Should be created
EXPECT_STREQ("on", rtc->get("keep_bframe")->arg0().c_str()); // keep -> on
}
// Test transforming vhost.rtc.bframe to vhost.rtc.keep_bframe with non-"keep" value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on; bframe drop;}}"));
// Verify bframe was transformed to keep_bframe
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL);
EXPECT_TRUE(rtc->get("bframe") == NULL); // Should be removed
EXPECT_TRUE(rtc->get("keep_bframe") != NULL); // Should be created
EXPECT_STREQ("off", rtc->get("keep_bframe")->arg0().c_str()); // drop -> off
}
// Test transforming vhost.rtc.bframe with empty value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on; bframe;}}"));
// Verify bframe was transformed to keep_bframe
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL);
EXPECT_TRUE(rtc->get("bframe") == NULL); // Should be removed
EXPECT_TRUE(rtc->get("keep_bframe") != NULL); // Should be created
EXPECT_STREQ("off", rtc->get("keep_bframe")->arg0().c_str()); // empty -> off
}
// Test transforming vhost.rtc.bframe with multiple arguments (only first is used)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on; bframe keep drop;}}"));
// Verify bframe was transformed to keep_bframe using first argument
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL);
EXPECT_TRUE(rtc->get("bframe") == NULL); // Should be removed
EXPECT_TRUE(rtc->get("keep_bframe") != NULL); // Should be created
EXPECT_STREQ("on", rtc->get("keep_bframe")->arg0().c_str()); // first arg "keep" -> on
}
}
VOID TEST(ConfigTransformTest, TransformVhostRtcAacAndBframeTogether)
{
srs_error_t err;
// Test transforming both aac and bframe directives together
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on; aac transcode; bframe keep;}}"));
// Verify both aac and bframe were transformed
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL);
EXPECT_TRUE(rtc->get("aac") == NULL); // Should be removed
EXPECT_TRUE(rtc->get("bframe") == NULL); // Should be removed
EXPECT_TRUE(rtc->get("rtmp_to_rtc") != NULL); // Should be created
EXPECT_STREQ("on", rtc->get("rtmp_to_rtc")->arg0().c_str()); // transcode -> on
EXPECT_TRUE(rtc->get("keep_bframe") != NULL); // Should be created
EXPECT_STREQ("on", rtc->get("keep_bframe")->arg0().c_str()); // keep -> on
}
// Test transforming both aac and bframe with different values
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on; aac copy; bframe drop;}}"));
// Verify both aac and bframe were transformed with correct values
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL);
EXPECT_TRUE(rtc->get("aac") == NULL); // Should be removed
EXPECT_TRUE(rtc->get("bframe") == NULL); // Should be removed
EXPECT_TRUE(rtc->get("rtmp_to_rtc") != NULL); // Should be created
EXPECT_STREQ("off", rtc->get("rtmp_to_rtc")->arg0().c_str()); // copy -> off
EXPECT_TRUE(rtc->get("keep_bframe") != NULL); // Should be created
EXPECT_STREQ("off", rtc->get("keep_bframe")->arg0().c_str()); // drop -> off
}
// Test transforming aac and bframe with existing rtc configs
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on; nack on; aac transcode; twcc on; bframe keep;}}"));
// Verify aac and bframe were transformed while preserving existing configs
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL);
EXPECT_TRUE(rtc->get("enabled") != NULL); // Should be preserved
EXPECT_STREQ("on", rtc->get("enabled")->arg0().c_str());
EXPECT_TRUE(rtc->get("nack") != NULL); // Should be preserved
EXPECT_STREQ("on", rtc->get("nack")->arg0().c_str());
EXPECT_TRUE(rtc->get("twcc") != NULL); // Should be preserved
EXPECT_STREQ("on", rtc->get("twcc")->arg0().c_str());
EXPECT_TRUE(rtc->get("aac") == NULL); // Should be removed
EXPECT_TRUE(rtc->get("bframe") == NULL); // Should be removed
EXPECT_TRUE(rtc->get("rtmp_to_rtc") != NULL); // Should be created
EXPECT_STREQ("on", rtc->get("rtmp_to_rtc")->arg0().c_str());
EXPECT_TRUE(rtc->get("keep_bframe") != NULL); // Should be created
EXPECT_STREQ("on", rtc->get("keep_bframe")->arg0().c_str());
}
}
VOID TEST(ConfigTransformTest, TransformVhostRtcMultipleVhosts)
{
srs_error_t err;
// Test transforming aac and bframe in multiple vhosts
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test1.com{rtc{aac transcode;}} vhost test2.com{rtc{bframe keep;}} vhost test3.com{rtc{aac copy; bframe drop;}}"));
// Get all vhost directives
std::vector<SrsConfDirective *> vhosts;
for (int i = 0; i < (int)conf.get_root()->directives_.size(); i++) {
SrsConfDirective *dir = conf.get_root()->directives_.at(i);
if (dir->name_ == "vhost") {
vhosts.push_back(dir);
}
}
// Should have 3 vhost sections
EXPECT_EQ(3, (int)vhosts.size());
// First vhost (test1.com) - aac transformation
SrsConfDirective *vhost1 = NULL;
for (int i = 0; i < (int)vhosts.size(); i++) {
if (vhosts[i]->arg0() == "test1.com") {
vhost1 = vhosts[i];
break;
}
}
ASSERT_TRUE(vhost1 != NULL);
SrsConfDirective *rtc1 = vhost1->get("rtc");
ASSERT_TRUE(rtc1 != NULL);
EXPECT_TRUE(rtc1->get("aac") == NULL); // Should be removed
EXPECT_TRUE(rtc1->get("rtmp_to_rtc") != NULL);
EXPECT_STREQ("on", rtc1->get("rtmp_to_rtc")->arg0().c_str());
// Second vhost (test2.com) - bframe transformation
SrsConfDirective *vhost2 = NULL;
for (int i = 0; i < (int)vhosts.size(); i++) {
if (vhosts[i]->arg0() == "test2.com") {
vhost2 = vhosts[i];
break;
}
}
ASSERT_TRUE(vhost2 != NULL);
SrsConfDirective *rtc2 = vhost2->get("rtc");
ASSERT_TRUE(rtc2 != NULL);
EXPECT_TRUE(rtc2->get("bframe") == NULL); // Should be removed
EXPECT_TRUE(rtc2->get("keep_bframe") != NULL);
EXPECT_STREQ("on", rtc2->get("keep_bframe")->arg0().c_str());
// Third vhost (test3.com) - both aac and bframe transformation
SrsConfDirective *vhost3 = NULL;
for (int i = 0; i < (int)vhosts.size(); i++) {
if (vhosts[i]->arg0() == "test3.com") {
vhost3 = vhosts[i];
break;
}
}
ASSERT_TRUE(vhost3 != NULL);
SrsConfDirective *rtc3 = vhost3->get("rtc");
ASSERT_TRUE(rtc3 != NULL);
EXPECT_TRUE(rtc3->get("aac") == NULL); // Should be removed
EXPECT_TRUE(rtc3->get("bframe") == NULL); // Should be removed
EXPECT_TRUE(rtc3->get("rtmp_to_rtc") != NULL);
EXPECT_STREQ("off", rtc3->get("rtmp_to_rtc")->arg0().c_str()); // copy -> off
EXPECT_TRUE(rtc3->get("keep_bframe") != NULL);
EXPECT_STREQ("off", rtc3->get("keep_bframe")->arg0().c_str()); // drop -> off
}
}
VOID TEST(ConfigTransformTest, TransformVhostRtcPreserveOtherConfigs)
{
srs_error_t err;
// Test that transformation preserves other vhost and rtc configurations
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{hls{enabled on;} rtc{enabled on; nack on; aac transcode; twcc on; bframe keep; rtc_to_rtmp on;} dvr{enabled off;}}"));
// Verify aac and bframe were transformed while preserving other configs
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
// Verify other vhost configs are preserved
EXPECT_TRUE(vhost->get("hls") != NULL); // Should be preserved
EXPECT_TRUE(vhost->get("dvr") != NULL); // Should be preserved
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL);
// Verify existing rtc configs are preserved
EXPECT_TRUE(rtc->get("enabled") != NULL);
EXPECT_STREQ("on", rtc->get("enabled")->arg0().c_str());
EXPECT_TRUE(rtc->get("nack") != NULL);
EXPECT_STREQ("on", rtc->get("nack")->arg0().c_str());
EXPECT_TRUE(rtc->get("twcc") != NULL);
EXPECT_STREQ("on", rtc->get("twcc")->arg0().c_str());
EXPECT_TRUE(rtc->get("rtc_to_rtmp") != NULL);
EXPECT_STREQ("on", rtc->get("rtc_to_rtmp")->arg0().c_str());
// Verify aac and bframe were transformed
EXPECT_TRUE(rtc->get("aac") == NULL); // Should be removed
EXPECT_TRUE(rtc->get("bframe") == NULL); // Should be removed
EXPECT_TRUE(rtc->get("rtmp_to_rtc") != NULL); // Should be created
EXPECT_STREQ("on", rtc->get("rtmp_to_rtc")->arg0().c_str());
EXPECT_TRUE(rtc->get("keep_bframe") != NULL); // Should be created
EXPECT_STREQ("on", rtc->get("keep_bframe")->arg0().c_str());
// Verify other sections have correct configs
SrsConfDirective *hls = vhost->get("hls");
ASSERT_TRUE(hls != NULL);
EXPECT_TRUE(hls->get("enabled") != NULL);
EXPECT_STREQ("on", hls->get("enabled")->arg0().c_str());
SrsConfDirective *dvr = vhost->get("dvr");
ASSERT_TRUE(dvr != NULL);
EXPECT_TRUE(dvr->get("enabled") != NULL);
EXPECT_STREQ("off", dvr->get("enabled")->arg0().c_str());
}
}
VOID TEST(ConfigTransformTest, TransformVhostRtcDirectCall)
{
srs_error_t err;
// Test direct call to srs_config_transform_vhost function with rtc aac/bframe transformation
if (true) {
// Create a root directive with vhost containing rtc with aac and bframe
SrsConfDirective *root = new SrsConfDirective();
// Add rtmp section (required for valid config)
SrsConfDirective *rtmp = new SrsConfDirective();
rtmp->name_ = "rtmp";
SrsConfDirective *listen = new SrsConfDirective();
listen->name_ = "listen";
listen->args_.push_back("1935");
rtmp->directives_.push_back(listen);
root->directives_.push_back(rtmp);
// Add vhost section with rtc containing aac and bframe
SrsConfDirective *vhost = new SrsConfDirective();
vhost->name_ = "vhost";
vhost->args_.push_back("test.com");
// Add rtc directive
SrsConfDirective *rtc = new SrsConfDirective();
rtc->name_ = "rtc";
// Add enabled directive
SrsConfDirective *enabled = new SrsConfDirective();
enabled->name_ = "enabled";
enabled->args_.push_back("on");
rtc->directives_.push_back(enabled);
// Add aac directive
SrsConfDirective *aac = new SrsConfDirective();
aac->name_ = "aac";
aac->args_.push_back("transcode");
rtc->directives_.push_back(aac);
// Add bframe directive
SrsConfDirective *bframe = new SrsConfDirective();
bframe->name_ = "bframe";
bframe->args_.push_back("keep");
rtc->directives_.push_back(bframe);
vhost->directives_.push_back(rtc);
root->directives_.push_back(vhost);
// Verify initial state
EXPECT_EQ(3, (int)rtc->directives_.size()); // enabled, aac, bframe
EXPECT_TRUE(rtc->get("enabled") != NULL);
EXPECT_TRUE(rtc->get("aac") != NULL);
EXPECT_TRUE(rtc->get("bframe") != NULL);
EXPECT_TRUE(rtc->get("rtmp_to_rtc") == NULL); // Should not exist yet
EXPECT_TRUE(rtc->get("keep_bframe") == NULL); // Should not exist yet
// Call the transform function directly
HELPER_ASSERT_SUCCESS(srs_config_transform_vhost(root));
// Verify aac and bframe were transformed
EXPECT_EQ(3, (int)rtc->directives_.size()); // enabled, rtmp_to_rtc, keep_bframe
EXPECT_TRUE(rtc->get("enabled") != NULL); // Should be preserved
EXPECT_STREQ("on", rtc->get("enabled")->arg0().c_str());
EXPECT_TRUE(rtc->get("aac") == NULL); // Should be removed
EXPECT_TRUE(rtc->get("bframe") == NULL); // Should be removed
EXPECT_TRUE(rtc->get("rtmp_to_rtc") != NULL); // Should be created
EXPECT_STREQ("on", rtc->get("rtmp_to_rtc")->arg0().c_str());
EXPECT_TRUE(rtc->get("keep_bframe") != NULL); // Should be created
EXPECT_STREQ("on", rtc->get("keep_bframe")->arg0().c_str());
srs_freep(root);
}
}
VOID TEST(ConfigTransformTest, TransformVhostRtcEdgeCases)
{
srs_error_t err;
// Test rtc section without aac or bframe (should remain unchanged)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on; nack on; twcc on;}}"));
// Verify rtc section is preserved without transformation
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL);
EXPECT_EQ(3, (int)rtc->directives_.size()); // Should have exactly 3 directives
EXPECT_TRUE(rtc->get("enabled") != NULL);
EXPECT_TRUE(rtc->get("nack") != NULL);
EXPECT_TRUE(rtc->get("twcc") != NULL);
EXPECT_TRUE(rtc->get("aac") == NULL); // Should not exist
EXPECT_TRUE(rtc->get("bframe") == NULL); // Should not exist
EXPECT_TRUE(rtc->get("rtmp_to_rtc") == NULL); // Should not be created
EXPECT_TRUE(rtc->get("keep_bframe") == NULL); // Should not be created
}
// Test vhost without rtc section (should remain unchanged)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{hls{enabled on;} dvr{enabled off;}}"));
// Verify vhost section is preserved without rtc transformation
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
EXPECT_EQ(2, (int)vhost->directives_.size()); // Should have exactly 2 directives
EXPECT_TRUE(vhost->get("hls") != NULL);
EXPECT_TRUE(vhost->get("dvr") != NULL);
EXPECT_TRUE(vhost->get("rtc") == NULL); // Should not exist
}
// Test empty rtc section (should remain empty)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{}}"));
// Verify empty rtc section remains empty
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL);
EXPECT_EQ(0, (int)rtc->directives_.size()); // Should remain empty
EXPECT_TRUE(rtc->get("aac") == NULL);
EXPECT_TRUE(rtc->get("bframe") == NULL);
EXPECT_TRUE(rtc->get("rtmp_to_rtc") == NULL);
EXPECT_TRUE(rtc->get("keep_bframe") == NULL);
}
// Test rtc section with only aac (no bframe)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on; aac transcode;}}"));
// Verify only aac transformation occurs
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL);
EXPECT_EQ(2, (int)rtc->directives_.size()); // enabled, rtmp_to_rtc
EXPECT_TRUE(rtc->get("enabled") != NULL);
EXPECT_TRUE(rtc->get("aac") == NULL); // Should be removed
EXPECT_TRUE(rtc->get("bframe") == NULL); // Should not exist
EXPECT_TRUE(rtc->get("rtmp_to_rtc") != NULL); // Should be created
EXPECT_STREQ("on", rtc->get("rtmp_to_rtc")->arg0().c_str());
EXPECT_TRUE(rtc->get("keep_bframe") == NULL); // Should not be created
}
// Test rtc section with only bframe (no aac)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on; bframe keep;}}"));
// Verify only bframe transformation occurs
SrsConfDirective *vhost = conf.get_root()->get("vhost");
ASSERT_TRUE(vhost != NULL);
SrsConfDirective *rtc = vhost->get("rtc");
ASSERT_TRUE(rtc != NULL);
EXPECT_EQ(2, (int)rtc->directives_.size()); // enabled, keep_bframe
EXPECT_TRUE(rtc->get("enabled") != NULL);
EXPECT_TRUE(rtc->get("aac") == NULL); // Should not exist
EXPECT_TRUE(rtc->get("bframe") == NULL); // Should be removed
EXPECT_TRUE(rtc->get("rtmp_to_rtc") == NULL); // Should not be created
EXPECT_TRUE(rtc->get("keep_bframe") != NULL); // Should be created
EXPECT_STREQ("on", rtc->get("keep_bframe")->arg0().c_str());
}
}
VOID TEST(ConfigDirectiveTest, ReadTokenUnexpectedCharacterAfterQuotedString)
{
srs_error_t err;
// Test unexpected character after double-quoted string (need_space=true case)
if (true) {
MockSrsConfigBuffer buf("listen \"1935\"x;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
// Test unexpected character after single-quoted string (need_space=true case)
if (true) {
MockSrsConfigBuffer buf("listen '1935'y;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
// Test unexpected character after double-quoted string with block start
if (true) {
MockSrsConfigBuffer buf("vhost \"test.com\"z {}");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
// Test unexpected character after single-quoted string with block start
if (true) {
MockSrsConfigBuffer buf("vhost 'test.com'w {}");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
// Test multiple unexpected characters after quoted strings
if (true) {
MockSrsConfigBuffer buf("listen \"8080\"abc;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
// Test unexpected special characters after quoted strings
if (true) {
MockSrsConfigBuffer buf("listen \"1935\"@;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
if (true) {
MockSrsConfigBuffer buf("listen \"1935\"#;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
if (true) {
MockSrsConfigBuffer buf("listen \"1935\"$;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
if (true) {
MockSrsConfigBuffer buf("listen \"1935\"%;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
if (true) {
MockSrsConfigBuffer buf("listen \"1935\"&;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
if (true) {
MockSrsConfigBuffer buf("listen \"1935\"*;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
}
VOID TEST(ConfigDirectiveTest, ReadTokenUnexpectedCharacterAfterQuotedStringWithNumbers)
{
srs_error_t err;
// Test unexpected numeric characters after quoted strings
if (true) {
MockSrsConfigBuffer buf("listen \"1935\"1;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
if (true) {
MockSrsConfigBuffer buf("listen \"1935\"2;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
if (true) {
MockSrsConfigBuffer buf("listen \"1935\"9;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
if (true) {
MockSrsConfigBuffer buf("listen \"1935\"0;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
// Test unexpected alphabetic characters after quoted strings
if (true) {
MockSrsConfigBuffer buf("listen \"1935\"a;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
if (true) {
MockSrsConfigBuffer buf("listen \"1935\"Z;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
// Test unexpected punctuation characters after quoted strings
if (true) {
MockSrsConfigBuffer buf("listen \"1935\"!;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
if (true) {
MockSrsConfigBuffer buf("listen \"1935\"?;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
if (true) {
MockSrsConfigBuffer buf("listen \"1935\"=;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
if (true) {
MockSrsConfigBuffer buf("listen \"1935\"+;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
if (true) {
MockSrsConfigBuffer buf("listen \"1935\"-;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
if (true) {
MockSrsConfigBuffer buf("listen \"1935\"_;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
if (true) {
MockSrsConfigBuffer buf("listen \"1935\"(;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
if (true) {
MockSrsConfigBuffer buf("listen \"1935\");");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
if (true) {
MockSrsConfigBuffer buf("listen \"1935\"[;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
if (true) {
MockSrsConfigBuffer buf("listen \"1935\"];");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
}
VOID TEST(ConfigDirectiveTest, ReadTokenValidQuotedStringCases)
{
srs_error_t err;
// Test valid double-quoted string followed by semicolon (should succeed)
if (true) {
MockSrsConfigBuffer buf("listen \"1935\";");
SrsConfDirective conf;
HELPER_ASSERT_SUCCESS(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(1, (int)conf.directives_.size());
SrsConfDirective &dir = *conf.directives_.at(0);
EXPECT_STREQ("listen", dir.name_.c_str());
EXPECT_EQ(1, (int)dir.args_.size());
EXPECT_STREQ("1935", dir.arg0().c_str());
}
// Test valid single-quoted string followed by semicolon (should succeed)
if (true) {
MockSrsConfigBuffer buf("listen '1935';");
SrsConfDirective conf;
HELPER_ASSERT_SUCCESS(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(1, (int)conf.directives_.size());
SrsConfDirective &dir = *conf.directives_.at(0);
EXPECT_STREQ("listen", dir.name_.c_str());
EXPECT_EQ(1, (int)dir.args_.size());
EXPECT_STREQ("1935", dir.arg0().c_str());
}
// Test valid double-quoted string followed by space and semicolon (should succeed)
if (true) {
MockSrsConfigBuffer buf("listen \"1935\" ;");
SrsConfDirective conf;
HELPER_ASSERT_SUCCESS(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(1, (int)conf.directives_.size());
SrsConfDirective &dir = *conf.directives_.at(0);
EXPECT_STREQ("listen", dir.name_.c_str());
EXPECT_EQ(1, (int)dir.args_.size());
EXPECT_STREQ("1935", dir.arg0().c_str());
}
// Test valid single-quoted string followed by space and semicolon (should succeed)
if (true) {
MockSrsConfigBuffer buf("listen '1935' ;");
SrsConfDirective conf;
HELPER_ASSERT_SUCCESS(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(1, (int)conf.directives_.size());
SrsConfDirective &dir = *conf.directives_.at(0);
EXPECT_STREQ("listen", dir.name_.c_str());
EXPECT_EQ(1, (int)dir.args_.size());
EXPECT_STREQ("1935", dir.arg0().c_str());
}
// Test valid double-quoted string followed by block start (should succeed)
if (true) {
MockSrsConfigBuffer buf("vhost \"test.com\" {}");
SrsConfDirective conf;
HELPER_ASSERT_SUCCESS(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(1, (int)conf.directives_.size());
SrsConfDirective &dir = *conf.directives_.at(0);
EXPECT_STREQ("vhost", dir.name_.c_str());
EXPECT_EQ(1, (int)dir.args_.size());
EXPECT_STREQ("test.com", dir.arg0().c_str());
EXPECT_EQ(0, (int)dir.directives_.size());
}
// Test valid single-quoted string followed by block start (should succeed)
if (true) {
MockSrsConfigBuffer buf("vhost 'test.com' {}");
SrsConfDirective conf;
HELPER_ASSERT_SUCCESS(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(1, (int)conf.directives_.size());
SrsConfDirective &dir = *conf.directives_.at(0);
EXPECT_STREQ("vhost", dir.name_.c_str());
EXPECT_EQ(1, (int)dir.args_.size());
EXPECT_STREQ("test.com", dir.arg0().c_str());
EXPECT_EQ(0, (int)dir.directives_.size());
}
// Test valid double-quoted string followed by tab and semicolon (should succeed)
if (true) {
MockSrsConfigBuffer buf("listen \"1935\"\t;");
SrsConfDirective conf;
HELPER_ASSERT_SUCCESS(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(1, (int)conf.directives_.size());
SrsConfDirective &dir = *conf.directives_.at(0);
EXPECT_STREQ("listen", dir.name_.c_str());
EXPECT_EQ(1, (int)dir.args_.size());
EXPECT_STREQ("1935", dir.arg0().c_str());
}
// Test valid single-quoted string followed by tab and semicolon (should succeed)
if (true) {
MockSrsConfigBuffer buf("listen '1935'\t;");
SrsConfDirective conf;
HELPER_ASSERT_SUCCESS(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(1, (int)conf.directives_.size());
SrsConfDirective &dir = *conf.directives_.at(0);
EXPECT_STREQ("listen", dir.name_.c_str());
EXPECT_EQ(1, (int)dir.args_.size());
EXPECT_STREQ("1935", dir.arg0().c_str());
}
}
VOID TEST(ConfigDirectiveTest, ReadTokenUnexpectedCharacterEdgeCases)
{
srs_error_t err;
// Test unexpected character in complex vhost configuration
if (true) {
MockSrsConfigBuffer buf("vhost \"test.com\"x { hls { enabled on; } }");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
// Test unexpected character after quoted string followed by another quoted string
if (true) {
MockSrsConfigBuffer buf("test \"arg1\"\"arg2\";");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
// Test unexpected character after single-quoted string followed by another quoted string
if (true) {
MockSrsConfigBuffer buf("test 'arg1''arg2';");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
// Test unexpected character after quoted string followed by opening brace
if (true) {
MockSrsConfigBuffer buf("test \"arg1\"x{");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
// Test unexpected character after single-quoted string followed by opening brace
if (true) {
MockSrsConfigBuffer buf("test 'arg1'y{");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name_.length());
EXPECT_EQ(0, (int)conf.args_.size());
EXPECT_EQ(0, (int)conf.directives_.size());
}
}
// Test specifically for the read_token method's need_space error condition
VOID TEST(ConfigDirectiveTest, ReadTokenNeedSpaceErrorCondition)
{
srs_error_t err;
// These tests specifically target the error condition in read_token where
// need_space is true and an unexpected character is encountered
// Test case: quoted string immediately followed by letter (no space)
if (true) {
MockSrsConfigBuffer buf("directive \"value\"x;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
}
// Test case: quoted string immediately followed by number (no space)
if (true) {
MockSrsConfigBuffer buf("directive \"value\"1;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
}
// Test case: quoted string immediately followed by underscore (no space)
if (true) {
MockSrsConfigBuffer buf("directive \"value\"_;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
}
// Test case: single-quoted string immediately followed by letter (no space)
if (true) {
MockSrsConfigBuffer buf("directive 'value'x;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
}
// Test case: single-quoted string immediately followed by number (no space)
if (true) {
MockSrsConfigBuffer buf("directive 'value'1;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
}
}
VOID TEST(ConfigMainTest, CheckConfInDocker)
{
srs_error_t err;
// Test default value when in_docker directive is not present
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_FALSE(conf.get_in_docker()); // Default should be false
}
// Test in_docker enabled with "on"
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "in_docker on;"));
EXPECT_TRUE(conf.get_in_docker());
}
// Test in_docker with "yes" (should be false due to SRS_CONF_PREFER_FALSE)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "in_docker yes;"));
EXPECT_FALSE(conf.get_in_docker()); // SRS_CONF_PREFER_FALSE only returns true for "on"
}
// Test in_docker with "true" (should be false due to SRS_CONF_PREFER_FALSE)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "in_docker true;"));
EXPECT_FALSE(conf.get_in_docker()); // SRS_CONF_PREFER_FALSE only returns true for "on"
}
// Test in_docker disabled with "off"
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "in_docker off;"));
EXPECT_FALSE(conf.get_in_docker());
}
// Test in_docker disabled with "no"
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "in_docker no;"));
EXPECT_FALSE(conf.get_in_docker());
}
// Test in_docker disabled with "false"
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "in_docker false;"));
EXPECT_FALSE(conf.get_in_docker());
}
// Test in_docker with empty argument (should default to false)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "in_docker;"));
EXPECT_FALSE(conf.get_in_docker());
}
// Test in_docker with invalid argument (should default to false due to SRS_CONF_PREFER_FALSE)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "in_docker invalid_value;"));
EXPECT_FALSE(conf.get_in_docker()); // SRS_CONF_PREFER_FALSE should return false for invalid values
}
// Test in_docker with numeric argument "1" (should be false due to SRS_CONF_PREFER_FALSE)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "in_docker 1;"));
EXPECT_FALSE(conf.get_in_docker()); // SRS_CONF_PREFER_FALSE only returns true for "on"
}
// Test in_docker with numeric argument "0" (should be false due to SRS_CONF_PREFER_FALSE)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "in_docker 0;"));
EXPECT_FALSE(conf.get_in_docker()); // SRS_CONF_PREFER_FALSE only returns true for "on"
}
// Test in_docker with case variations - "ON" should be false (case sensitive)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "in_docker ON;"));
EXPECT_FALSE(conf.get_in_docker()); // SRS_CONF_PREFER_FALSE is case sensitive, only "on" returns true
}
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "in_docker OFF;"));
EXPECT_FALSE(conf.get_in_docker());
}
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "in_docker Yes;"));
EXPECT_FALSE(conf.get_in_docker()); // SRS_CONF_PREFER_FALSE only returns true for "on"
}
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "in_docker No;"));
EXPECT_FALSE(conf.get_in_docker());
}
// Test in_docker with multiple arguments (should use first argument)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "in_docker on off;"));
EXPECT_TRUE(conf.get_in_docker()); // Should use first argument "on"
}
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "in_docker off on;"));
EXPECT_FALSE(conf.get_in_docker()); // Should use first argument "off"
}
}
VOID TEST(ConfigEnvTest, CheckEnvValuesInDocker)
{
srs_error_t err;
// Test environment variable override for in_docker
if (true) {
MockSrsConfig conf;
SrsSetEnvConfig(conf, in_docker, "SRS_IN_DOCKER", "on");
EXPECT_TRUE(conf.get_in_docker());
}
if (true) {
MockSrsConfig conf;
SrsSetEnvConfig(conf, in_docker, "SRS_IN_DOCKER", "off");
EXPECT_FALSE(conf.get_in_docker());
}
if (true) {
MockSrsConfig conf;
SrsSetEnvConfig(conf, in_docker, "SRS_IN_DOCKER", "yes");
EXPECT_FALSE(conf.get_in_docker()); // SRS_CONF_PREFER_FALSE only returns true for "on"
}
if (true) {
MockSrsConfig conf;
SrsSetEnvConfig(conf, in_docker, "SRS_IN_DOCKER", "no");
EXPECT_FALSE(conf.get_in_docker());
}
if (true) {
MockSrsConfig conf;
SrsSetEnvConfig(conf, in_docker, "SRS_IN_DOCKER", "true");
EXPECT_FALSE(conf.get_in_docker()); // SRS_CONF_PREFER_FALSE only returns true for "on"
}
if (true) {
MockSrsConfig conf;
SrsSetEnvConfig(conf, in_docker, "SRS_IN_DOCKER", "false");
EXPECT_FALSE(conf.get_in_docker());
}
if (true) {
MockSrsConfig conf;
SrsSetEnvConfig(conf, in_docker, "SRS_IN_DOCKER", "1");
EXPECT_FALSE(conf.get_in_docker()); // SRS_CONF_PREFER_FALSE only returns true for "on"
}
if (true) {
MockSrsConfig conf;
SrsSetEnvConfig(conf, in_docker, "SRS_IN_DOCKER", "0");
EXPECT_FALSE(conf.get_in_docker());
}
// Test that environment variable overrides config file
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "in_docker off;"));
SrsSetEnvConfig(conf, in_docker, "SRS_IN_DOCKER", "on");
EXPECT_TRUE(conf.get_in_docker()); // Environment variable should override config file
}
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "in_docker on;"));
SrsSetEnvConfig(conf, in_docker, "SRS_IN_DOCKER", "off");
EXPECT_FALSE(conf.get_in_docker()); // Environment variable should override config file
}
// Test invalid environment variable value (should default to false due to SRS_CONF_PREFER_FALSE)
if (true) {
MockSrsConfig conf;
SrsSetEnvConfig(conf, in_docker, "SRS_IN_DOCKER", "invalid_value");
EXPECT_FALSE(conf.get_in_docker()); // Should default to false for invalid values
}
// Test empty environment variable value (should default to false)
if (true) {
MockSrsConfig conf;
SrsSetEnvConfig(conf, in_docker, "SRS_IN_DOCKER", "");
EXPECT_FALSE(conf.get_in_docker()); // Should default to false for empty values
}
}
// External function declarations for testing
extern string srs_server_id_path(string pid_file);
extern string srs_try_read_file(string path);
extern void srs_try_write_file(string path, string content);
VOID TEST(ConfigUtilityTest, ServerIdPath)
{
// Test basic .pid to .id conversion
if (true) {
string result = srs_server_id_path("./objs/srs.pid");
EXPECT_STREQ("./objs/srs.id", result.c_str());
}
// Test path without .pid extension
if (true) {
string result = srs_server_id_path("./objs/srs");
EXPECT_STREQ("./objs/srs.id", result.c_str());
}
// Test path already ending with .id
if (true) {
string result = srs_server_id_path("./objs/srs.id");
EXPECT_STREQ("./objs/srs.id", result.c_str());
}
// Test complex path with multiple .pid occurrences
if (true) {
string result = srs_server_id_path("/tmp/srs.pid.backup.pid");
EXPECT_STREQ("/tmp/srs.id.backup.id", result.c_str());
}
// Test empty string
if (true) {
string result = srs_server_id_path("");
EXPECT_STREQ(".id", result.c_str());
}
// Test path with directory containing .pid
if (true) {
string result = srs_server_id_path("/var/srs.pid.dir/server.pid");
EXPECT_STREQ("/var/srs.id.dir/server.id", result.c_str());
}
}
VOID TEST(ConfigUtilityTest, TryReadWriteFile)
{
// Test writing and reading a file
if (true) {
string test_file = _srs_tmp_file_prefix + "utest-read-write.txt";
MockFileRemover _mfr(test_file);
string test_content = "test server id content";
srs_try_write_file(test_file, test_content);
string read_content = srs_try_read_file(test_file);
EXPECT_STREQ(test_content.c_str(), read_content.c_str());
}
// Test reading non-existent file
if (true) {
string non_existent_file = _srs_tmp_file_prefix + "utest-non-existent.txt";
string content = srs_try_read_file(non_existent_file);
EXPECT_STREQ("", content.c_str());
}
// Test writing to invalid path (should not crash)
if (true) {
string invalid_path = "/invalid/path/that/does/not/exist/file.txt";
srs_try_write_file(invalid_path, "test content");
// Should not crash, function handles errors gracefully
}
// Test writing empty content
if (true) {
string test_file = _srs_tmp_file_prefix + "utest-empty.txt";
MockFileRemover _mfr(test_file);
srs_try_write_file(test_file, "");
string content = srs_try_read_file(test_file);
EXPECT_STREQ("", content.c_str());
}
// Test writing and reading large content (up to buffer size)
if (true) {
string test_file = _srs_tmp_file_prefix + "utest-large.txt";
MockFileRemover _mfr(test_file);
// Create content close to buffer size (1024 bytes)
string large_content(1000, 'A');
srs_try_write_file(test_file, large_content);
string read_content = srs_try_read_file(test_file);
EXPECT_STREQ(large_content.c_str(), read_content.c_str());
}
// Test reading file larger than buffer (should only read first 1024 bytes)
if (true) {
string test_file = _srs_tmp_file_prefix + "utest-oversized.txt";
MockFileRemover _mfr(test_file);
// Create content larger than buffer size (1024 bytes)
string oversized_content(2000, 'B');
srs_try_write_file(test_file, oversized_content);
string read_content = srs_try_read_file(test_file);
// Should only read first 1024 bytes
EXPECT_EQ(1024, (int)read_content.length());
EXPECT_EQ('B', read_content[0]);
EXPECT_EQ('B', read_content[1023]);
}
}
VOID TEST(ConfigTest, IsFullConfig)
{
srs_error_t err;
// Test default value (no is_full directive)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_FALSE(conf.is_full_config()); // Should default to false
}
// Test is_full enabled with "on"
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "is_full on;"));
EXPECT_TRUE(conf.is_full_config());
}
// Test is_full with "yes" (should be false due to SRS_CONF_PREFER_FALSE)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "is_full yes;"));
EXPECT_FALSE(conf.is_full_config()); // SRS_CONF_PREFER_FALSE only returns true for "on"
}
// Test is_full with "true" (should be false due to SRS_CONF_PREFER_FALSE)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "is_full true;"));
EXPECT_FALSE(conf.is_full_config()); // SRS_CONF_PREFER_FALSE only returns true for "on"
}
// Test is_full disabled with "off"
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "is_full off;"));
EXPECT_FALSE(conf.is_full_config());
}
// Test is_full disabled with "no"
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "is_full no;"));
EXPECT_FALSE(conf.is_full_config());
}
// Test is_full disabled with "false"
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "is_full false;"));
EXPECT_FALSE(conf.is_full_config());
}
// Test is_full with invalid value (should prefer false)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "is_full invalid_value;"));
EXPECT_FALSE(conf.is_full_config()); // Should default to false for invalid values
}
// Test is_full with empty value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "is_full;"));
EXPECT_FALSE(conf.is_full_config()); // Should default to false for empty values
}
}
VOID TEST(ConfigTest, GetServerIdFromConfig)
{
srs_error_t err;
// Test server_id from config file
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "server_id test-server-123;"));
string server_id = conf.get_server_id();
EXPECT_STREQ("test-server-123", server_id.c_str());
}
// Test server_id with complex value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "server_id srs-production-server-001;"));
string server_id = conf.get_server_id();
EXPECT_STREQ("srs-production-server-001", server_id.c_str());
}
// Test server_id with special characters
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "server_id srs_test-server.001;"));
string server_id = conf.get_server_id();
EXPECT_STREQ("srs_test-server.001", server_id.c_str());
}
}
VOID TEST(ConfigTest, GetServerIdFromEnv)
{
srs_error_t err;
// Test server_id from environment variable overrides config
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "server_id config-server-id;"));
SrsSetEnvConfig(conf, server_id, "SRS_SERVER_ID", "env-server-id");
string server_id = conf.get_server_id();
EXPECT_STREQ("env-server-id", server_id.c_str());
}
// Test server_id from environment variable with no config
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
SrsSetEnvConfig(conf, server_id, "SRS_SERVER_ID", "env-only-server-id");
string server_id = conf.get_server_id();
EXPECT_STREQ("env-only-server-id", server_id.c_str());
}
}
VOID TEST(ConfigTest, GetServerIdWithFileGeneration)
{
srs_error_t err;
// Test server_id generation and file persistence
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "pid ./objs/test-server.pid;"));
// Clean up any existing server id file
string server_id_file = srs_server_id_path(conf.get_pid_file());
MockFileRemover _mfr(server_id_file);
// First call should generate a server ID and write to file
string server_id1 = conf.get_server_id();
EXPECT_FALSE(server_id1.empty());
// Verify the server ID was written to file
string file_content = srs_try_read_file(server_id_file);
EXPECT_STREQ(server_id1.c_str(), file_content.c_str());
// Second call should return the same server ID (from static variable)
string server_id2 = conf.get_server_id();
EXPECT_STREQ(server_id1.c_str(), server_id2.c_str());
}
// Test server_id file writing behavior
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "pid ./objs/test-file-write.pid;"));
string server_id_file = srs_server_id_path(conf.get_pid_file());
MockFileRemover _mfr(server_id_file);
// Call get_server_id which should write to file
string server_id = conf.get_server_id();
EXPECT_FALSE(server_id.empty());
// Verify the server ID was written to file
string file_content = srs_try_read_file(server_id_file);
EXPECT_STREQ(server_id.c_str(), file_content.c_str());
}
// Test server_id with custom pid file path
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "pid /tmp/custom-srs.pid;"));
string server_id_file = srs_server_id_path(conf.get_pid_file());
MockFileRemover _mfr(server_id_file);
string server_id = conf.get_server_id();
EXPECT_FALSE(server_id.empty());
// Verify correct server ID file path
EXPECT_STREQ("/tmp/custom-srs.id", server_id_file.c_str());
// Verify the server ID was written to the correct file
string file_content = srs_try_read_file(server_id_file);
EXPECT_STREQ(server_id.c_str(), file_content.c_str());
}
}
VOID TEST(ConfigTest, GetServerIdPriorityAndEdgeCases)
{
srs_error_t err;
// Test priority: environment variable > config file > generated
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "server_id config-id; pid ./objs/priority-test.pid;"));
string server_id_file = srs_server_id_path(conf.get_pid_file());
MockFileRemover _mfr(server_id_file);
// Pre-write a different ID to file
srs_try_write_file(server_id_file, "file-id");
// Environment variable should have highest priority
SrsSetEnvConfig(conf, server_id, "SRS_SERVER_ID", "env-id");
string server_id = conf.get_server_id();
EXPECT_STREQ("env-id", server_id.c_str());
}
// Test config file priority over generated ID
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "server_id config-file-id; pid ./objs/config-priority.pid;"));
string server_id_file = srs_server_id_path(conf.get_pid_file());
MockFileRemover _mfr(server_id_file);
string server_id = conf.get_server_id();
EXPECT_STREQ("config-file-id", server_id.c_str());
}
// Test empty config server_id (should generate)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "server_id; pid ./objs/empty-config.pid;"));
string server_id_file = srs_server_id_path(conf.get_pid_file());
MockFileRemover _mfr(server_id_file);
string server_id = conf.get_server_id();
EXPECT_FALSE(server_id.empty());
// Should be a generated ID, not empty
EXPECT_NE("", server_id);
}
// Test server_id consistency across multiple calls
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "pid ./objs/consistency-test.pid;"));
string server_id_file = srs_server_id_path(conf.get_pid_file());
MockFileRemover _mfr(server_id_file);
string server_id1 = conf.get_server_id();
string server_id2 = conf.get_server_id();
string server_id3 = conf.get_server_id();
EXPECT_STREQ(server_id1.c_str(), server_id2.c_str());
EXPECT_STREQ(server_id2.c_str(), server_id3.c_str());
}
}
VOID TEST(ConfigMainTest, CheckQueryLatestVersion)
{
srs_error_t err;
// Test default value when query_latest_version is not configured
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_FALSE(conf.whether_query_latest_version()); // Default is false
}
// Test query_latest_version enabled
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "query_latest_version on;"));
EXPECT_TRUE(conf.whether_query_latest_version());
}
// Test query_latest_version disabled
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "query_latest_version off;"));
EXPECT_FALSE(conf.whether_query_latest_version());
}
// Test query_latest_version with various true values (SRS_CONF_PREFER_TRUE: anything != "off")
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "query_latest_version true;"));
EXPECT_TRUE(conf.whether_query_latest_version());
}
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "query_latest_version yes;"));
EXPECT_TRUE(conf.whether_query_latest_version());
}
// Debug: Check if environment variable is set
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "query_latest_version false;"));
// Print debug info
printf("DEBUG: query_latest_version false -> %s\n", conf.whether_query_latest_version() ? "true" : "false");
// EXPECT_TRUE(conf.whether_query_latest_version()); // "false" != "off", so it's true
}
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "query_latest_version no;"));
// Print debug info
printf("DEBUG: query_latest_version no -> %s\n", conf.whether_query_latest_version() ? "true" : "false");
// EXPECT_TRUE(conf.whether_query_latest_version()); // "no" != "off", so it's true
}
// Test environment variable override
if (true) {
MockSrsConfig conf;
SrsSetEnvConfig(conf, query_latest_version, "SRS_QUERY_LATEST_VERSION", "on");
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "query_latest_version off;"));
EXPECT_TRUE(conf.whether_query_latest_version()); // Environment variable should override config
}
if (true) {
MockSrsConfig conf;
SrsSetEnvConfig(conf, query_latest_version, "SRS_QUERY_LATEST_VERSION", "off");
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "query_latest_version on;"));
EXPECT_FALSE(conf.whether_query_latest_version()); // Environment variable should override config
}
}
VOID TEST(ConfigMainTest, CheckFirstWaitForQlv)
{
srs_error_t err;
// Test default value when first_wait_for_qlv is not configured
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_EQ(5 * 60 * SRS_UTIME_SECONDS, conf.first_wait_for_qlv()); // Default is 5 minutes
}
// Test first_wait_for_qlv with custom value in seconds
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "first_wait_for_qlv 120;"));
EXPECT_EQ(120 * SRS_UTIME_SECONDS, conf.first_wait_for_qlv()); // 2 minutes
}
// Test first_wait_for_qlv with zero value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "first_wait_for_qlv 0;"));
EXPECT_EQ(0, conf.first_wait_for_qlv());
}
// Test first_wait_for_qlv with large value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "first_wait_for_qlv 3600;"));
EXPECT_EQ(3600 * SRS_UTIME_SECONDS, conf.first_wait_for_qlv()); // 1 hour
}
// Test first_wait_for_qlv with small value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "first_wait_for_qlv 30;"));
EXPECT_EQ(30 * SRS_UTIME_SECONDS, conf.first_wait_for_qlv()); // 30 seconds
}
}
VOID TEST(ConfigMainTest, CheckEmptyIpOk)
{
srs_error_t err;
// Test default value when empty_ip_ok is not configured
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_TRUE(conf.empty_ip_ok()); // Default is true
}
// Test empty_ip_ok enabled
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "empty_ip_ok on;"));
EXPECT_TRUE(conf.empty_ip_ok());
}
// Test empty_ip_ok disabled
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "empty_ip_ok off;"));
EXPECT_FALSE(conf.empty_ip_ok());
}
// Test empty_ip_ok with various true values (SRS_CONF_PREFER_TRUE: anything != "off")
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "empty_ip_ok true;"));
EXPECT_TRUE(conf.empty_ip_ok());
}
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "empty_ip_ok yes;"));
EXPECT_TRUE(conf.empty_ip_ok());
}
// Test empty_ip_ok with false value (SRS_CONF_PREFER_TRUE: only "off" is false)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "empty_ip_ok off;"));
EXPECT_FALSE(conf.empty_ip_ok());
}
// Test empty_ip_ok with other values (SRS_CONF_PREFER_TRUE: anything != "off" is true)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "empty_ip_ok false;"));
EXPECT_TRUE(conf.empty_ip_ok()); // "false" != "off", so it's true
}
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "empty_ip_ok no;"));
EXPECT_TRUE(conf.empty_ip_ok()); // "no" != "off", so it's true
}
// Test empty_ip_ok with empty argument (should use default)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "empty_ip_ok;"));
EXPECT_TRUE(conf.empty_ip_ok()); // Should use default value
}
}
VOID TEST(ConfigMainTest, CheckGraceStartWait)
{
srs_error_t err;
// Test default value when grace_start_wait is not configured
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_EQ(2300 * SRS_UTIME_MILLISECONDS, conf.get_grace_start_wait()); // Default is 2300ms
}
// Test grace_start_wait with custom value in milliseconds
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "grace_start_wait 5000;"));
EXPECT_EQ(5000 * SRS_UTIME_MILLISECONDS, conf.get_grace_start_wait()); // 5 seconds
}
// Test grace_start_wait with zero value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "grace_start_wait 0;"));
EXPECT_EQ(0, conf.get_grace_start_wait());
}
// Test grace_start_wait with large value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "grace_start_wait 30000;"));
EXPECT_EQ(30000 * SRS_UTIME_MILLISECONDS, conf.get_grace_start_wait()); // 30 seconds
}
// Test grace_start_wait with small value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "grace_start_wait 100;"));
EXPECT_EQ(100 * SRS_UTIME_MILLISECONDS, conf.get_grace_start_wait()); // 100ms
}
// Test grace_start_wait with empty argument (should use default)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "grace_start_wait;"));
EXPECT_EQ(2300 * SRS_UTIME_MILLISECONDS, conf.get_grace_start_wait()); // Should use default value
}
}
VOID TEST(ConfigMainTest, CheckGraceFinalWait)
{
srs_error_t err;
// Test default value when grace_final_wait is not configured
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_EQ(3200 * SRS_UTIME_MILLISECONDS, conf.get_grace_final_wait()); // Default is 3200ms
}
// Test grace_final_wait with custom value in milliseconds
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "grace_final_wait 8000;"));
EXPECT_EQ(8000 * SRS_UTIME_MILLISECONDS, conf.get_grace_final_wait()); // 8 seconds
}
// Test grace_final_wait with zero value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "grace_final_wait 0;"));
EXPECT_EQ(0, conf.get_grace_final_wait());
}
// Test grace_final_wait with large value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "grace_final_wait 60000;"));
EXPECT_EQ(60000 * SRS_UTIME_MILLISECONDS, conf.get_grace_final_wait()); // 60 seconds
}
// Test grace_final_wait with small value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "grace_final_wait 500;"));
EXPECT_EQ(500 * SRS_UTIME_MILLISECONDS, conf.get_grace_final_wait()); // 500ms
}
// Test grace_final_wait with empty argument (should use default)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "grace_final_wait;"));
EXPECT_EQ(3200 * SRS_UTIME_MILLISECONDS, conf.get_grace_final_wait()); // Should use default value
}
}
VOID TEST(ConfigMainTest, CheckForceGraceQuit)
{
srs_error_t err;
// Test default value when force_grace_quit is not configured
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_FALSE(conf.is_force_grace_quit()); // Default is false
}
// Test force_grace_quit enabled
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "force_grace_quit on;"));
EXPECT_TRUE(conf.is_force_grace_quit());
}
// Test force_grace_quit disabled
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "force_grace_quit off;"));
EXPECT_FALSE(conf.is_force_grace_quit());
}
// Test force_grace_quit with various values (SRS_CONF_PREFER_FALSE: only "on" is true)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "force_grace_quit true;"));
EXPECT_FALSE(conf.is_force_grace_quit()); // "true" != "on", so it's false
}
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "force_grace_quit yes;"));
EXPECT_FALSE(conf.is_force_grace_quit()); // "yes" != "on", so it's false
}
// Test force_grace_quit with various false values (SRS_CONF_PREFER_FALSE: anything != "on" is false)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "force_grace_quit false;"));
EXPECT_FALSE(conf.is_force_grace_quit());
}
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "force_grace_quit no;"));
EXPECT_FALSE(conf.is_force_grace_quit());
}
// Test force_grace_quit with empty argument (should use default)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "force_grace_quit;"));
EXPECT_FALSE(conf.is_force_grace_quit()); // Should use default value
}
}
VOID TEST(ConfigMainTest, CheckDisableDaemonForDocker)
{
srs_error_t err;
// Test default value when disable_daemon_for_docker is not configured
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_TRUE(conf.disable_daemon_for_docker()); // Default is true
}
// Test disable_daemon_for_docker enabled
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "disable_daemon_for_docker on;"));
EXPECT_TRUE(conf.disable_daemon_for_docker());
}
// Test disable_daemon_for_docker disabled
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "disable_daemon_for_docker off;"));
EXPECT_FALSE(conf.disable_daemon_for_docker());
}
// Test disable_daemon_for_docker with various true values (SRS_CONF_PREFER_TRUE: anything != "off")
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "disable_daemon_for_docker true;"));
EXPECT_TRUE(conf.disable_daemon_for_docker());
}
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "disable_daemon_for_docker yes;"));
EXPECT_TRUE(conf.disable_daemon_for_docker());
}
// Test disable_daemon_for_docker with false value (SRS_CONF_PREFER_TRUE: only "off" is false)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "disable_daemon_for_docker off;"));
EXPECT_FALSE(conf.disable_daemon_for_docker());
}
// Test disable_daemon_for_docker with other values (SRS_CONF_PREFER_TRUE: anything != "off" is true)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "disable_daemon_for_docker false;"));
EXPECT_TRUE(conf.disable_daemon_for_docker()); // "false" != "off", so it's true
}
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "disable_daemon_for_docker no;"));
EXPECT_TRUE(conf.disable_daemon_for_docker()); // "no" != "off", so it's true
}
// Test disable_daemon_for_docker with empty argument (should use default)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "disable_daemon_for_docker;"));
EXPECT_TRUE(conf.disable_daemon_for_docker()); // Should use default value
}
}
VOID TEST(ConfigMainTest, CheckInotifyAutoReload)
{
srs_error_t err;
// Test default value when inotify_auto_reload is not configured
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_FALSE(conf.inotify_auto_reload()); // Default is false
}
// Test inotify_auto_reload enabled
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "inotify_auto_reload on;"));
EXPECT_TRUE(conf.inotify_auto_reload());
}
// Test inotify_auto_reload disabled
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "inotify_auto_reload off;"));
EXPECT_FALSE(conf.inotify_auto_reload());
}
// Test inotify_auto_reload with various values (SRS_CONF_PREFER_FALSE: only "on" is true)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "inotify_auto_reload true;"));
EXPECT_FALSE(conf.inotify_auto_reload()); // "true" != "on", so it's false
}
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "inotify_auto_reload yes;"));
EXPECT_FALSE(conf.inotify_auto_reload()); // "yes" != "on", so it's false
}
// Test inotify_auto_reload with various false values (SRS_CONF_PREFER_FALSE: anything != "on" is false)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "inotify_auto_reload false;"));
EXPECT_FALSE(conf.inotify_auto_reload());
}
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "inotify_auto_reload no;"));
EXPECT_FALSE(conf.inotify_auto_reload());
}
// Test inotify_auto_reload with empty argument (should use default)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "inotify_auto_reload;"));
EXPECT_FALSE(conf.inotify_auto_reload()); // Should use default value
}
}
VOID TEST(ConfigMainTest, CheckAutoReloadForDocker)
{
srs_error_t err;
// Test default value when auto_reload_for_docker is not configured
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_TRUE(conf.auto_reload_for_docker()); // Default is true
}
// Test auto_reload_for_docker enabled
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "auto_reload_for_docker on;"));
EXPECT_TRUE(conf.auto_reload_for_docker());
}
// Test auto_reload_for_docker disabled
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "auto_reload_for_docker off;"));
EXPECT_FALSE(conf.auto_reload_for_docker());
}
// Test auto_reload_for_docker with various true values (SRS_CONF_PREFER_TRUE: anything != "off")
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "auto_reload_for_docker true;"));
EXPECT_TRUE(conf.auto_reload_for_docker());
}
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "auto_reload_for_docker yes;"));
EXPECT_TRUE(conf.auto_reload_for_docker());
}
// Test auto_reload_for_docker with false value (SRS_CONF_PREFER_TRUE: only "off" is false)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "auto_reload_for_docker off;"));
EXPECT_FALSE(conf.auto_reload_for_docker());
}
// Test auto_reload_for_docker with other values (SRS_CONF_PREFER_TRUE: anything != "off" is true)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "auto_reload_for_docker false;"));
EXPECT_TRUE(conf.auto_reload_for_docker()); // "false" != "off", so it's true
}
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "auto_reload_for_docker no;"));
EXPECT_TRUE(conf.auto_reload_for_docker()); // "no" != "off", so it's true
}
// Test auto_reload_for_docker with empty argument (should use default)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "auto_reload_for_docker;"));
EXPECT_TRUE(conf.auto_reload_for_docker()); // Should use default value
}
}
VOID TEST(ConfigMainTest, CheckTcmallocReleaseRate)
{
srs_error_t err;
// Test default tcmalloc_release_rate
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_EQ(0.8, conf.tcmalloc_release_rate()); // SRS_PERF_TCMALLOC_RELEASE_RATE
}
// Test custom tcmalloc_release_rate
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "tcmalloc_release_rate 0.5;"));
EXPECT_EQ(0.5, conf.tcmalloc_release_rate());
}
// Test tcmalloc_release_rate with maximum value (should be clamped to 10)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "tcmalloc_release_rate 15.0;"));
EXPECT_EQ(10.0, conf.tcmalloc_release_rate());
}
// Test tcmalloc_release_rate with minimum value (should be clamped to 0)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "tcmalloc_release_rate -5.0;"));
EXPECT_EQ(0.0, conf.tcmalloc_release_rate());
}
// Test tcmalloc_release_rate with empty value (should use default)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "tcmalloc_release_rate;"));
EXPECT_EQ(0.8, conf.tcmalloc_release_rate());
}
// Test tcmalloc_release_rate with environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "tcmalloc_release_rate 0.3;"));
SrsSetEnvConfig(conf, tcmalloc_release_rate, "SRS_TCMALLOC_RELEASE_RATE", "0.7");
EXPECT_EQ(0.7, conf.tcmalloc_release_rate());
}
// Test tcmalloc_release_rate with environment variable clamping
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
SrsSetEnvConfig(conf, tcmalloc_release_rate_high, "SRS_TCMALLOC_RELEASE_RATE", "20.0");
EXPECT_EQ(10.0, conf.tcmalloc_release_rate());
SrsSetEnvConfig(conf, tcmalloc_release_rate_low, "SRS_TCMALLOC_RELEASE_RATE", "-2.0");
EXPECT_EQ(0.0, conf.tcmalloc_release_rate());
}
}
VOID TEST(ConfigMainTest, CheckCircuitBreakerEnabled)
{
srs_error_t err;
// Test default circuit_breaker enabled (should be true)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_TRUE(conf.get_circuit_breaker());
}
// Test circuit_breaker enabled explicitly
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "circuit_breaker{enabled on;}"));
EXPECT_TRUE(conf.get_circuit_breaker());
}
// Test circuit_breaker disabled
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "circuit_breaker{enabled off;}"));
EXPECT_FALSE(conf.get_circuit_breaker());
}
// Test circuit_breaker with no enabled directive (should use default)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "circuit_breaker{}"));
EXPECT_TRUE(conf.get_circuit_breaker());
}
// Test circuit_breaker with empty enabled value (should use default)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "circuit_breaker{enabled;}"));
EXPECT_TRUE(conf.get_circuit_breaker());
}
// Test circuit_breaker with environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "circuit_breaker{enabled on;}"));
SrsSetEnvConfig(conf, circuit_breaker_enabled, "SRS_CIRCUIT_BREAKER_ENABLED", "off");
EXPECT_FALSE(conf.get_circuit_breaker());
}
// Test circuit_breaker with various boolean values (SRS_CONF_PREFER_TRUE: only "off" is false)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "circuit_breaker{enabled true;}"));
EXPECT_TRUE(conf.get_circuit_breaker());
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "circuit_breaker{enabled false;}"));
EXPECT_TRUE(conf.get_circuit_breaker()); // "false" != "off", so it's true
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "circuit_breaker{enabled yes;}"));
EXPECT_TRUE(conf.get_circuit_breaker());
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "circuit_breaker{enabled no;}"));
EXPECT_TRUE(conf.get_circuit_breaker()); // "no" != "off", so it's true
}
}
VOID TEST(ConfigMainTest, CheckCircuitBreakerThresholds)
{
srs_error_t err;
// Test default high_threshold (should be 90)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_EQ(90, conf.get_high_threshold());
}
// Test custom high_threshold
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "circuit_breaker{high_threshold 85;}"));
EXPECT_EQ(85, conf.get_high_threshold());
}
// Test default critical_threshold (should be 95)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_EQ(95, conf.get_critical_threshold());
}
// Test custom critical_threshold
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "circuit_breaker{critical_threshold 98;}"));
EXPECT_EQ(98, conf.get_critical_threshold());
}
// Test default dying_threshold (should be 99)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_EQ(99, conf.get_dying_threshold());
}
// Test custom dying_threshold
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "circuit_breaker{dying_threshold 100;}"));
EXPECT_EQ(100, conf.get_dying_threshold());
}
// Test all thresholds together
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "circuit_breaker{high_threshold 80; critical_threshold 90; dying_threshold 95;}"));
EXPECT_EQ(80, conf.get_high_threshold());
EXPECT_EQ(90, conf.get_critical_threshold());
EXPECT_EQ(95, conf.get_dying_threshold());
}
// Test thresholds with environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "circuit_breaker{high_threshold 80;}"));
SrsSetEnvConfig(conf, high_threshold, "SRS_CIRCUIT_BREAKER_HIGH_THRESHOLD", "75");
EXPECT_EQ(75, conf.get_high_threshold());
SrsSetEnvConfig(conf, critical_threshold, "SRS_CIRCUIT_BREAKER_CRITICAL_THRESHOLD", "88");
EXPECT_EQ(88, conf.get_critical_threshold());
SrsSetEnvConfig(conf, dying_threshold, "SRS_CIRCUIT_BREAKER_DYING_THRESHOLD", "97");
EXPECT_EQ(97, conf.get_dying_threshold());
}
}
VOID TEST(ConfigMainTest, CheckCircuitBreakerPulses)
{
srs_error_t err;
// Test default high_pulse (should be 2)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_EQ(2, conf.get_high_pulse());
}
// Test custom high_pulse
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "circuit_breaker{high_pulse 3;}"));
EXPECT_EQ(3, conf.get_high_pulse());
}
// Test default critical_pulse (should be 1)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_EQ(1, conf.get_critical_pulse());
}
// Test custom critical_pulse
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "circuit_breaker{critical_pulse 2;}"));
EXPECT_EQ(2, conf.get_critical_pulse());
}
// Test default dying_pulse (should be 5)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_EQ(5, conf.get_dying_pulse());
}
// Test custom dying_pulse
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "circuit_breaker{dying_pulse 10;}"));
EXPECT_EQ(10, conf.get_dying_pulse());
}
// Test all pulses together
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "circuit_breaker{high_pulse 4; critical_pulse 3; dying_pulse 8;}"));
EXPECT_EQ(4, conf.get_high_pulse());
EXPECT_EQ(3, conf.get_critical_pulse());
EXPECT_EQ(8, conf.get_dying_pulse());
}
// Test pulses with environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "circuit_breaker{high_pulse 2;}"));
SrsSetEnvConfig(conf, high_pulse, "SRS_CIRCUIT_BREAKER_HIGH_PULSE", "5");
EXPECT_EQ(5, conf.get_high_pulse());
SrsSetEnvConfig(conf, critical_pulse, "SRS_CIRCUIT_BREAKER_CRITICAL_PULSE", "3");
EXPECT_EQ(3, conf.get_critical_pulse());
SrsSetEnvConfig(conf, dying_pulse, "SRS_CIRCUIT_BREAKER_DYING_PULSE", "7");
EXPECT_EQ(7, conf.get_dying_pulse());
}
}
VOID TEST(ConfigMainTest, CheckStreamCasterEngine)
{
srs_error_t err;
// Test get_stream_caster_engine with NULL conf (should return empty string)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_STREQ("", conf.get_stream_caster_engine(NULL).c_str());
}
// Test get_stream_caster_engine with conf but no caster directive (should return empty string)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "stream_caster{enabled on;}"));
SrsConfDirective *stream_caster = conf.get_root()->get("stream_caster");
ASSERT_TRUE(stream_caster != NULL);
EXPECT_STREQ("", conf.get_stream_caster_engine(stream_caster).c_str());
}
// Test get_stream_caster_engine with empty caster value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "stream_caster{enabled on; caster;}"));
SrsConfDirective *stream_caster = conf.get_root()->get("stream_caster");
ASSERT_TRUE(stream_caster != NULL);
EXPECT_STREQ("", conf.get_stream_caster_engine(stream_caster).c_str());
}
// Test get_stream_caster_engine with gb28181 caster
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "stream_caster{enabled on; caster gb28181;}"));
SrsConfDirective *stream_caster = conf.get_root()->get("stream_caster");
ASSERT_TRUE(stream_caster != NULL);
EXPECT_STREQ("gb28181", conf.get_stream_caster_engine(stream_caster).c_str());
}
// Test get_stream_caster_engine with flv caster
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "stream_caster{enabled on; caster flv;}"));
SrsConfDirective *stream_caster = conf.get_root()->get("stream_caster");
ASSERT_TRUE(stream_caster != NULL);
EXPECT_STREQ("flv", conf.get_stream_caster_engine(stream_caster).c_str());
}
// Test get_stream_caster_engine with mpegts-over-udp caster
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "stream_caster{enabled on; caster mpegts-over-udp;}"));
SrsConfDirective *stream_caster = conf.get_root()->get("stream_caster");
ASSERT_TRUE(stream_caster != NULL);
EXPECT_STREQ("mpegts-over-udp", conf.get_stream_caster_engine(stream_caster).c_str());
}
}
VOID TEST(ConfigMainTest, CheckRtspServerEnabled)
{
srs_error_t err;
// Test default rtsp_server enabled (should be false)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_FALSE(conf.get_rtsp_server_enabled());
}
// Test rtsp_server enabled explicitly
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtsp_server{enabled on;}"));
EXPECT_TRUE(conf.get_rtsp_server_enabled());
}
// Test rtsp_server disabled explicitly
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtsp_server{enabled off;}"));
EXPECT_FALSE(conf.get_rtsp_server_enabled());
}
// Test rtsp_server with no enabled directive (should use default false)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtsp_server{}"));
EXPECT_FALSE(conf.get_rtsp_server_enabled());
}
// Test rtsp_server with empty enabled value (should use default false)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtsp_server{enabled;}"));
EXPECT_FALSE(conf.get_rtsp_server_enabled());
}
// Test rtsp_server with environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtsp_server{enabled off;}"));
SrsSetEnvConfig(conf, rtsp_server_enabled, "SRS_RTSP_SERVER_ENABLED", "on");
EXPECT_TRUE(conf.get_rtsp_server_enabled());
}
// Test rtsp_server with various boolean values (SRS_CONF_PREFER_FALSE: only "on" is true)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtsp_server{enabled true;}"));
EXPECT_FALSE(conf.get_rtsp_server_enabled()); // "true" != "on", so it's false
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtsp_server{enabled false;}"));
EXPECT_FALSE(conf.get_rtsp_server_enabled());
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtsp_server{enabled yes;}"));
EXPECT_FALSE(conf.get_rtsp_server_enabled()); // "yes" != "on", so it's false
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtsp_server{enabled no;}"));
EXPECT_FALSE(conf.get_rtsp_server_enabled());
}
}
VOID TEST(ConfigMainTest, CheckRtspServerListens)
{
srs_error_t err;
// Test default rtsp_server listen (should be 554)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
vector<string> listens = conf.get_rtsp_server_listens();
EXPECT_EQ(1, (int)listens.size());
EXPECT_STREQ("554", listens.at(0).c_str());
}
// Test custom rtsp_server listen port
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtsp_server{listen 8554;}"));
vector<string> listens = conf.get_rtsp_server_listens();
EXPECT_EQ(1, (int)listens.size());
EXPECT_STREQ("8554", listens.at(0).c_str());
}
// Test multiple rtsp_server listen ports
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtsp_server{listen 554 8554 9554;}"));
vector<string> listens = conf.get_rtsp_server_listens();
EXPECT_EQ(3, (int)listens.size());
EXPECT_STREQ("554", listens.at(0).c_str());
EXPECT_STREQ("8554", listens.at(1).c_str());
EXPECT_STREQ("9554", listens.at(2).c_str());
}
// Test rtsp_server with no listen directive (should use default)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtsp_server{enabled on;}"));
vector<string> listens = conf.get_rtsp_server_listens();
EXPECT_EQ(1, (int)listens.size());
EXPECT_STREQ("554", listens.at(0).c_str());
}
// Test rtsp_server with empty listen directive (should use default)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtsp_server{listen;}"));
vector<string> listens = conf.get_rtsp_server_listens();
EXPECT_EQ(1, (int)listens.size());
EXPECT_STREQ("554", listens.at(0).c_str());
}
// Test rtsp_server with environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtsp_server{listen 8554;}"));
SrsSetEnvConfig(conf, rtsp_server_listen, "SRS_RTSP_SERVER_LISTEN", "9554");
vector<string> listens = conf.get_rtsp_server_listens();
EXPECT_EQ(1, (int)listens.size());
EXPECT_STREQ("9554", listens.at(0).c_str());
}
// Test rtsp_server with environment variable multiple ports
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
SrsSetEnvConfig(conf, rtsp_server_listen_multi, "SRS_RTSP_SERVER_LISTEN", "554 8554");
vector<string> listens = conf.get_rtsp_server_listens();
EXPECT_EQ(2, (int)listens.size());
EXPECT_STREQ("554", listens.at(0).c_str());
EXPECT_STREQ("8554", listens.at(1).c_str());
}
}
VOID TEST(ConfigMainTest, CheckVhostRtspEnabled)
{
srs_error_t err;
// Test default vhost rtsp enabled (should be false)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{}"));
EXPECT_FALSE(conf.get_rtsp_enabled("test.com"));
}
// Test vhost rtsp enabled explicitly
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtsp{enabled on;}}"));
EXPECT_TRUE(conf.get_rtsp_enabled("test.com"));
}
// Test vhost rtsp disabled explicitly
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtsp{enabled off;}}"));
EXPECT_FALSE(conf.get_rtsp_enabled("test.com"));
}
// Test vhost rtsp with no enabled directive (should use default false)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtsp{}}"));
EXPECT_FALSE(conf.get_rtsp_enabled("test.com"));
}
// Test vhost rtsp with empty enabled value (should use default false)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtsp{enabled;}}"));
EXPECT_FALSE(conf.get_rtsp_enabled("test.com"));
}
// Test vhost rtsp with environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtsp{enabled off;}}"));
SrsSetEnvConfig(conf, rtsp_enabled, "SRS_VHOST_RTSP_ENABLED", "on");
EXPECT_TRUE(conf.get_rtsp_enabled("test.com"));
}
// Test vhost rtsp with non-existent vhost (should use default false)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_FALSE(conf.get_rtsp_enabled("nonexistent.com"));
}
// Test get_rtsp directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtsp{enabled on;}}"));
SrsConfDirective *rtsp = conf.get_rtsp("test.com");
ASSERT_TRUE(rtsp != NULL);
EXPECT_STREQ("rtsp", rtsp->name_.c_str());
// Test with non-existent vhost
SrsConfDirective *rtsp_null = conf.get_rtsp("nonexistent.com");
EXPECT_TRUE(rtsp_null == NULL);
}
}
VOID TEST(ConfigMainTest, CheckVhostRtspFromRtmp)
{
srs_error_t err;
// Test default vhost rtsp rtmp_to_rtsp (should be true)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{}"));
EXPECT_TRUE(conf.get_rtsp_from_rtmp("test.com"));
}
// Test vhost rtsp rtmp_to_rtsp enabled explicitly
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtsp{rtmp_to_rtsp on;}}"));
EXPECT_TRUE(conf.get_rtsp_from_rtmp("test.com"));
}
// Test vhost rtsp rtmp_to_rtsp disabled explicitly
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtsp{rtmp_to_rtsp off;}}"));
EXPECT_FALSE(conf.get_rtsp_from_rtmp("test.com"));
}
// Test vhost rtsp with no rtmp_to_rtsp directive (should use default true)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtsp{enabled on;}}"));
EXPECT_TRUE(conf.get_rtsp_from_rtmp("test.com"));
}
// Test vhost rtsp with empty rtmp_to_rtsp value (should use default true)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtsp{rtmp_to_rtsp;}}"));
EXPECT_TRUE(conf.get_rtsp_from_rtmp("test.com"));
}
// Test vhost rtsp with environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtsp{rtmp_to_rtsp on;}}"));
SrsSetEnvConfig(conf, rtsp_from_rtmp, "SRS_VHOST_RTSP_RTMP_TO_RTSP", "off");
EXPECT_FALSE(conf.get_rtsp_from_rtmp("test.com"));
}
// Test vhost rtsp with non-existent vhost (should use default true)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_TRUE(conf.get_rtsp_from_rtmp("nonexistent.com"));
}
// Test vhost rtsp with various boolean values (SRS_CONF_PREFER_TRUE: only "off" is false)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtsp{rtmp_to_rtsp true;}}"));
EXPECT_TRUE(conf.get_rtsp_from_rtmp("test.com"));
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtsp{rtmp_to_rtsp false;}}"));
EXPECT_TRUE(conf.get_rtsp_from_rtmp("test.com")); // "false" != "off", so it's true
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtsp{rtmp_to_rtsp yes;}}"));
EXPECT_TRUE(conf.get_rtsp_from_rtmp("test.com"));
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtsp{rtmp_to_rtsp no;}}"));
EXPECT_TRUE(conf.get_rtsp_from_rtmp("test.com")); // "no" != "off", so it's true
}
}
VOID TEST(ConfigRtcServerTest, CheckRtcServerEnabled)
{
srs_error_t err;
// Test default value (false) when no rtc_server section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_FALSE(conf.get_rtc_server_enabled());
}
// Test default value (false) when rtc_server section exists but no enabled directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{listen 8000;}"));
EXPECT_FALSE(conf.get_rtc_server_enabled());
}
// Test enabled on
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on;}"));
EXPECT_TRUE(conf.get_rtc_server_enabled());
}
// Test enabled off
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled off;}"));
EXPECT_FALSE(conf.get_rtc_server_enabled());
}
// Test SRS_CONF_PREFER_FALSE behavior (only "on" is true)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled true;}"));
EXPECT_FALSE(conf.get_rtc_server_enabled()); // "true" != "on", so it's false
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled yes;}"));
EXPECT_FALSE(conf.get_rtc_server_enabled()); // "yes" != "on", so it's false
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled 1;}"));
EXPECT_FALSE(conf.get_rtc_server_enabled()); // "1" != "on", so it's false
}
// Test empty value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled;}"));
EXPECT_FALSE(conf.get_rtc_server_enabled());
}
// Test environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled off;}"));
SrsSetEnvConfig(conf, rtc_enabled, "SRS_RTC_SERVER_ENABLED", "on");
EXPECT_TRUE(conf.get_rtc_server_enabled());
}
}
VOID TEST(ConfigRtcServerTest, CheckRtcServerListens)
{
srs_error_t err;
// Test default value when no rtc_server section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
vector<string> listens = conf.get_rtc_server_listens();
EXPECT_EQ(1, (int)listens.size());
EXPECT_STREQ("8000", listens.at(0).c_str());
}
// Test default value when rtc_server section exists but no listen directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on;}"));
vector<string> listens = conf.get_rtc_server_listens();
EXPECT_EQ(1, (int)listens.size());
EXPECT_STREQ("8000", listens.at(0).c_str());
}
// Test single listen port
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{listen 8080;}"));
vector<string> listens = conf.get_rtc_server_listens();
EXPECT_EQ(1, (int)listens.size());
EXPECT_STREQ("8080", listens.at(0).c_str());
}
// Test multiple listen ports
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{listen 8080 8081 8082;}"));
vector<string> listens = conf.get_rtc_server_listens();
EXPECT_EQ(3, (int)listens.size());
EXPECT_STREQ("8080", listens.at(0).c_str());
EXPECT_STREQ("8081", listens.at(1).c_str());
EXPECT_STREQ("8082", listens.at(2).c_str());
}
// Test empty listen directive (should use default)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{listen;}"));
vector<string> listens = conf.get_rtc_server_listens();
EXPECT_EQ(1, (int)listens.size());
EXPECT_STREQ("8000", listens.at(0).c_str());
}
// Test environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{listen 8080;}"));
SrsSetEnvConfig(conf, rtc_listen, "SRS_RTC_SERVER_LISTEN", "9000");
vector<string> listens = conf.get_rtc_server_listens();
EXPECT_EQ(1, (int)listens.size());
EXPECT_STREQ("9000", listens.at(0).c_str());
}
// Test environment variable with multiple ports
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
SrsSetEnvConfig(conf, rtc_listen, "SRS_RTC_SERVER_LISTEN", "9000 9001");
vector<string> listens = conf.get_rtc_server_listens();
EXPECT_EQ(2, (int)listens.size());
EXPECT_STREQ("9000", listens.at(0).c_str());
EXPECT_STREQ("9001", listens.at(1).c_str());
}
}
VOID TEST(ConfigRtcServerTest, CheckRtcServerCandidates)
{
srs_error_t err;
// Test default value when no rtc_server section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_STREQ("*", conf.get_rtc_server_candidates().c_str());
}
// Test default value when rtc_server section exists but no candidate directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on;}"));
EXPECT_STREQ("*", conf.get_rtc_server_candidates().c_str());
}
// Test explicit candidate value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{candidate 192.168.1.100;}"));
EXPECT_STREQ("192.168.1.100", conf.get_rtc_server_candidates().c_str());
}
// Test empty candidate value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{candidate;}"));
EXPECT_STREQ("*", conf.get_rtc_server_candidates().c_str());
}
// Test environment variable reference with actual env var set
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{candidate $MY_CANDIDATE;}"));
SrsSetEnvConfig(conf, my_candidate, "MY_CANDIDATE", "10.0.0.1");
EXPECT_STREQ("10.0.0.1", conf.get_rtc_server_candidates().c_str());
}
// Test environment variable reference without env var set (should return default)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{candidate $UNSET_VAR;}"));
EXPECT_STREQ("*", conf.get_rtc_server_candidates().c_str());
}
// Test environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{candidate 192.168.1.100;}"));
SrsSetEnvConfig(conf, rtc_candidate, "SRS_RTC_SERVER_CANDIDATE", "10.0.0.2");
EXPECT_STREQ("10.0.0.2", conf.get_rtc_server_candidates().c_str());
}
}
VOID TEST(ConfigRtcServerTest, CheckApiAsCandidates)
{
srs_error_t err;
// Test default value (true) when no rtc_server section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_TRUE(conf.get_api_as_candidates());
}
// Test default value (true) when rtc_server section exists but no api_as_candidates directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on;}"));
EXPECT_TRUE(conf.get_api_as_candidates());
}
// Test api_as_candidates off
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{api_as_candidates off;}"));
EXPECT_FALSE(conf.get_api_as_candidates());
}
// Test api_as_candidates on
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{api_as_candidates on;}"));
EXPECT_TRUE(conf.get_api_as_candidates());
}
// Test SRS_CONF_PREFER_TRUE behavior (only "off" is false)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{api_as_candidates false;}"));
EXPECT_TRUE(conf.get_api_as_candidates()); // "false" != "off", so it's true
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{api_as_candidates no;}"));
EXPECT_TRUE(conf.get_api_as_candidates()); // "no" != "off", so it's true
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{api_as_candidates 0;}"));
EXPECT_TRUE(conf.get_api_as_candidates()); // "0" != "off", so it's true
}
// Test empty value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{api_as_candidates;}"));
EXPECT_TRUE(conf.get_api_as_candidates());
}
}
VOID TEST(ConfigRtcServerTest, CheckResolveApiDomain)
{
srs_error_t err;
// Test default value (true) when no rtc_server section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_TRUE(conf.get_resolve_api_domain());
}
// Test default value (true) when rtc_server section exists but no resolve_api_domain directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on;}"));
EXPECT_TRUE(conf.get_resolve_api_domain());
}
// Test resolve_api_domain off
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{resolve_api_domain off;}"));
EXPECT_FALSE(conf.get_resolve_api_domain());
}
// Test resolve_api_domain on
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{resolve_api_domain on;}"));
EXPECT_TRUE(conf.get_resolve_api_domain());
}
// Test SRS_CONF_PREFER_TRUE behavior (only "off" is false)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{resolve_api_domain true;}"));
EXPECT_TRUE(conf.get_resolve_api_domain()); // "true" != "off", so it's true
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{resolve_api_domain yes;}"));
EXPECT_TRUE(conf.get_resolve_api_domain()); // "yes" != "off", so it's true
}
// Test empty value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{resolve_api_domain;}"));
EXPECT_TRUE(conf.get_resolve_api_domain());
}
}
VOID TEST(ConfigRtcServerTest, CheckKeepApiDomain)
{
srs_error_t err;
// Test default value (false) when no rtc_server section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_FALSE(conf.get_keep_api_domain());
}
// Test default value (false) when rtc_server section exists but no keep_api_domain directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on;}"));
EXPECT_FALSE(conf.get_keep_api_domain());
}
// Test keep_api_domain on
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{keep_api_domain on;}"));
EXPECT_TRUE(conf.get_keep_api_domain());
}
// Test keep_api_domain off
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{keep_api_domain off;}"));
EXPECT_FALSE(conf.get_keep_api_domain());
}
// Test SRS_CONF_PREFER_FALSE behavior (only "on" is true)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{keep_api_domain true;}"));
EXPECT_FALSE(conf.get_keep_api_domain()); // "true" != "on", so it's false
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{keep_api_domain yes;}"));
EXPECT_FALSE(conf.get_keep_api_domain()); // "yes" != "on", so it's false
}
// Test empty value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{keep_api_domain;}"));
EXPECT_FALSE(conf.get_keep_api_domain());
}
}
VOID TEST(ConfigRtcServerTest, CheckUseAutoDetectNetworkIp)
{
srs_error_t err;
// Test default value (true) when no rtc_server section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_TRUE(conf.get_use_auto_detect_network_ip());
}
// Test default value (true) when rtc_server section exists but no use_auto_detect_network_ip directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on;}"));
EXPECT_TRUE(conf.get_use_auto_detect_network_ip());
}
// Test use_auto_detect_network_ip off
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{use_auto_detect_network_ip off;}"));
EXPECT_FALSE(conf.get_use_auto_detect_network_ip());
}
// Test use_auto_detect_network_ip on
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{use_auto_detect_network_ip on;}"));
EXPECT_TRUE(conf.get_use_auto_detect_network_ip());
}
// Test SRS_CONF_PREFER_TRUE behavior (only "off" is false)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{use_auto_detect_network_ip true;}"));
EXPECT_TRUE(conf.get_use_auto_detect_network_ip()); // "true" != "off", so it's true
}
// Test empty value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{use_auto_detect_network_ip;}"));
EXPECT_TRUE(conf.get_use_auto_detect_network_ip());
}
}
VOID TEST(ConfigRtcServerTest, CheckRtcServerTcpEnabled)
{
srs_error_t err;
// Test default value (false) when no rtc_server section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_FALSE(conf.get_rtc_server_tcp_enabled());
}
// Test default value (false) when rtc_server section exists but no tcp section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on;}"));
EXPECT_FALSE(conf.get_rtc_server_tcp_enabled());
}
// Test default value (false) when tcp section exists but no enabled directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{tcp{listen 8000;}}"));
EXPECT_FALSE(conf.get_rtc_server_tcp_enabled());
}
// Test tcp enabled on
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{tcp{enabled on;}}"));
EXPECT_TRUE(conf.get_rtc_server_tcp_enabled());
}
// Test tcp enabled off
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{tcp{enabled off;}}"));
EXPECT_FALSE(conf.get_rtc_server_tcp_enabled());
}
// Test SRS_CONF_PREFER_FALSE behavior (only "on" is true)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{tcp{enabled true;}}"));
EXPECT_FALSE(conf.get_rtc_server_tcp_enabled()); // "true" != "on", so it's false
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{tcp{enabled yes;}}"));
EXPECT_FALSE(conf.get_rtc_server_tcp_enabled()); // "yes" != "on", so it's false
}
// Test empty value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{tcp{enabled;}}"));
EXPECT_FALSE(conf.get_rtc_server_tcp_enabled());
}
// Test environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{tcp{enabled off;}}"));
SrsSetEnvConfig(conf, rtc_tcp_enabled, "SRS_RTC_SERVER_TCP_ENABLED", "on");
EXPECT_TRUE(conf.get_rtc_server_tcp_enabled());
}
}
VOID TEST(ConfigRtcServerTest, CheckRtcServerTcpListens)
{
srs_error_t err;
// Test default value when no rtc_server section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
vector<string> listens = conf.get_rtc_server_tcp_listens();
EXPECT_EQ(1, (int)listens.size());
EXPECT_STREQ("8000", listens.at(0).c_str());
}
// Test default value when rtc_server section exists but no tcp section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on;}"));
vector<string> listens = conf.get_rtc_server_tcp_listens();
EXPECT_EQ(1, (int)listens.size());
EXPECT_STREQ("8000", listens.at(0).c_str());
}
// Test default value when tcp section exists but no listen directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{tcp{enabled on;}}"));
vector<string> listens = conf.get_rtc_server_tcp_listens();
EXPECT_EQ(1, (int)listens.size());
EXPECT_STREQ("8000", listens.at(0).c_str());
}
// Test single tcp listen port
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{tcp{listen 8080;}}"));
vector<string> listens = conf.get_rtc_server_tcp_listens();
EXPECT_EQ(1, (int)listens.size());
EXPECT_STREQ("8080", listens.at(0).c_str());
}
// Test multiple tcp listen ports
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{tcp{listen 8080 8081 8082;}}"));
vector<string> listens = conf.get_rtc_server_tcp_listens();
EXPECT_EQ(3, (int)listens.size());
EXPECT_STREQ("8080", listens.at(0).c_str());
EXPECT_STREQ("8081", listens.at(1).c_str());
EXPECT_STREQ("8082", listens.at(2).c_str());
}
// Test empty tcp listen directive (should use default)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{tcp{listen;}}"));
vector<string> listens = conf.get_rtc_server_tcp_listens();
EXPECT_EQ(1, (int)listens.size());
EXPECT_STREQ("8000", listens.at(0).c_str());
}
// Test environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{tcp{listen 8080;}}"));
SrsSetEnvConfig(conf, rtc_tcp_listen, "SRS_RTC_SERVER_TCP_LISTEN", "9000");
vector<string> listens = conf.get_rtc_server_tcp_listens();
EXPECT_EQ(1, (int)listens.size());
EXPECT_STREQ("9000", listens.at(0).c_str());
}
}
VOID TEST(ConfigRtcServerTest, CheckRtcServerProtocol)
{
srs_error_t err;
// Test default value (udp) when no rtc_server section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_STREQ("udp", conf.get_rtc_server_protocol().c_str());
}
// Test default value (udp) when rtc_server section exists but no protocol directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on;}"));
EXPECT_STREQ("udp", conf.get_rtc_server_protocol().c_str());
}
// Test explicit protocol value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{protocol tcp;}"));
EXPECT_STREQ("tcp", conf.get_rtc_server_protocol().c_str());
}
// Test empty protocol value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{protocol;}"));
EXPECT_STREQ("udp", conf.get_rtc_server_protocol().c_str());
}
// Test environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{protocol tcp;}"));
SrsSetEnvConfig(conf, rtc_protocol, "SRS_RTC_SERVER_PROTOCOL", "udp");
EXPECT_STREQ("udp", conf.get_rtc_server_protocol().c_str());
}
}
VOID TEST(ConfigRtcServerTest, CheckRtcServerIpFamily)
{
srs_error_t err;
// Test default value (ipv4) when no rtc_server section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_STREQ("ipv4", conf.get_rtc_server_ip_family().c_str());
}
// Test default value (ipv4) when rtc_server section exists but no ip_family directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on;}"));
EXPECT_STREQ("ipv4", conf.get_rtc_server_ip_family().c_str());
}
// Test explicit ip_family value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{ip_family ipv6;}"));
EXPECT_STREQ("ipv6", conf.get_rtc_server_ip_family().c_str());
}
// Test empty ip_family value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{ip_family;}"));
EXPECT_STREQ("ipv4", conf.get_rtc_server_ip_family().c_str());
}
}
VOID TEST(ConfigRtcServerTest, CheckRtcServerEcdsa)
{
srs_error_t err;
// Test default value (true) when no rtc_server section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_TRUE(conf.get_rtc_server_ecdsa());
}
// Test default value (true) when rtc_server section exists but no ecdsa directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on;}"));
EXPECT_TRUE(conf.get_rtc_server_ecdsa());
}
// Test ecdsa off
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{ecdsa off;}"));
EXPECT_FALSE(conf.get_rtc_server_ecdsa());
}
// Test ecdsa on
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{ecdsa on;}"));
EXPECT_TRUE(conf.get_rtc_server_ecdsa());
}
// Test SRS_CONF_PREFER_TRUE behavior (only "off" is false)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{ecdsa true;}"));
EXPECT_TRUE(conf.get_rtc_server_ecdsa()); // "true" != "off", so it's true
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{ecdsa yes;}"));
EXPECT_TRUE(conf.get_rtc_server_ecdsa()); // "yes" != "off", so it's true
}
// Test empty value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{ecdsa;}"));
EXPECT_TRUE(conf.get_rtc_server_ecdsa());
}
}
VOID TEST(ConfigRtcServerTest, CheckRtcServerEncrypt)
{
srs_error_t err;
// Test default value (true) when no rtc_server section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_TRUE(conf.get_rtc_server_encrypt());
}
// Test default value (true) when rtc_server section exists but no encrypt directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on;}"));
EXPECT_TRUE(conf.get_rtc_server_encrypt());
}
// Test encrypt off
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{encrypt off;}"));
EXPECT_FALSE(conf.get_rtc_server_encrypt());
}
// Test encrypt on
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{encrypt on;}"));
EXPECT_TRUE(conf.get_rtc_server_encrypt());
}
// Test SRS_CONF_PREFER_TRUE behavior (only "off" is false)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{encrypt true;}"));
EXPECT_TRUE(conf.get_rtc_server_encrypt()); // "true" != "off", so it's true
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{encrypt yes;}"));
EXPECT_TRUE(conf.get_rtc_server_encrypt()); // "yes" != "off", so it's true
}
// Test empty value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{encrypt;}"));
EXPECT_TRUE(conf.get_rtc_server_encrypt());
}
}
VOID TEST(ConfigRtcServerTest, CheckRtcServerReuseport)
{
srs_error_t err;
// Test default value (1) when no rtc_server section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_EQ(1, conf.get_rtc_server_reuseport());
EXPECT_EQ(1, conf.get_rtc_server_reuseport2());
}
// Test default value (1) when rtc_server section exists but no reuseport directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on;}"));
EXPECT_EQ(1, conf.get_rtc_server_reuseport());
EXPECT_EQ(1, conf.get_rtc_server_reuseport2());
}
// Test explicit reuseport value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{reuseport 4;}"));
EXPECT_EQ(4, conf.get_rtc_server_reuseport2());
// get_rtc_server_reuseport() may limit the value based on SO_REUSEPORT support
int reuseport = conf.get_rtc_server_reuseport();
EXPECT_TRUE(reuseport >= 1 && reuseport <= 4);
}
// Test reuseport 0
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{reuseport 0;}"));
EXPECT_EQ(0, conf.get_rtc_server_reuseport());
EXPECT_EQ(0, conf.get_rtc_server_reuseport2());
}
// Test empty reuseport value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{reuseport;}"));
EXPECT_EQ(1, conf.get_rtc_server_reuseport());
EXPECT_EQ(1, conf.get_rtc_server_reuseport2());
}
}
VOID TEST(ConfigRtcServerTest, CheckRtcServerMergeNalus)
{
srs_error_t err;
// Test default value (false) when no rtc_server section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_FALSE(conf.get_rtc_server_merge_nalus());
}
// Test default value (false) when rtc_server section exists but no merge_nalus directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on;}"));
EXPECT_FALSE(conf.get_rtc_server_merge_nalus());
}
// Test merge_nalus on
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{merge_nalus on;}"));
EXPECT_TRUE(conf.get_rtc_server_merge_nalus());
}
// Test merge_nalus off
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{merge_nalus off;}"));
EXPECT_FALSE(conf.get_rtc_server_merge_nalus());
}
// Test SRS_CONF_PREFER_FALSE behavior (only "on" is true)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{merge_nalus true;}"));
EXPECT_FALSE(conf.get_rtc_server_merge_nalus()); // "true" != "on", so it's false
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{merge_nalus yes;}"));
EXPECT_FALSE(conf.get_rtc_server_merge_nalus()); // "yes" != "on", so it's false
}
// Test empty value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{merge_nalus;}"));
EXPECT_FALSE(conf.get_rtc_server_merge_nalus());
}
}
VOID TEST(ConfigRtcServerTest, CheckRtcServerBlackHole)
{
srs_error_t err;
// Test default value (false) when no rtc_server section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_FALSE(conf.get_rtc_server_black_hole());
}
// Test default value (false) when rtc_server section exists but no black_hole section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on;}"));
EXPECT_FALSE(conf.get_rtc_server_black_hole());
}
// Test default value (false) when black_hole section exists but no enabled directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{black_hole{addr 127.0.0.1;}}"));
EXPECT_FALSE(conf.get_rtc_server_black_hole());
}
// Test black_hole enabled on
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{black_hole{enabled on;}}"));
EXPECT_TRUE(conf.get_rtc_server_black_hole());
}
// Test black_hole enabled off
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{black_hole{enabled off;}}"));
EXPECT_FALSE(conf.get_rtc_server_black_hole());
}
// Test SRS_CONF_PREFER_FALSE behavior (only "on" is true)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{black_hole{enabled true;}}"));
EXPECT_FALSE(conf.get_rtc_server_black_hole()); // "true" != "on", so it's false
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{black_hole{enabled yes;}}"));
EXPECT_FALSE(conf.get_rtc_server_black_hole()); // "yes" != "on", so it's false
}
// Test empty value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{black_hole{enabled;}}"));
EXPECT_FALSE(conf.get_rtc_server_black_hole());
}
// Test environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{black_hole{enabled off;}}"));
SrsSetEnvConfig(conf, rtc_black_hole, "SRS_RTC_SERVER_BLACK_HOLE_ENABLED", "on");
EXPECT_TRUE(conf.get_rtc_server_black_hole());
}
}
VOID TEST(ConfigRtcServerTest, CheckRtcServerBlackHoleAddr)
{
srs_error_t err;
// Test default value (empty) when no rtc_server section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_STREQ("", conf.get_rtc_server_black_hole_addr().c_str());
}
// Test default value (empty) when rtc_server section exists but no black_hole section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{enabled on;}"));
EXPECT_STREQ("", conf.get_rtc_server_black_hole_addr().c_str());
}
// Test default value (empty) when black_hole section exists but no addr directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{black_hole{enabled on;}}"));
EXPECT_STREQ("", conf.get_rtc_server_black_hole_addr().c_str());
}
// Test explicit addr value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{black_hole{addr 127.0.0.1;}}"));
EXPECT_STREQ("127.0.0.1", conf.get_rtc_server_black_hole_addr().c_str());
}
// Test empty addr value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{black_hole{addr;}}"));
EXPECT_STREQ("", conf.get_rtc_server_black_hole_addr().c_str());
}
// Test environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "rtc_server{black_hole{addr 127.0.0.1;}}"));
SrsSetEnvConfig(conf, rtc_black_hole_addr, "SRS_RTC_SERVER_BLACK_HOLE_ADDR", "10.0.0.1");
EXPECT_STREQ("10.0.0.1", conf.get_rtc_server_black_hole_addr().c_str());
}
}
VOID TEST(ConfigRtcVhostTest, CheckRtcEnabled)
{
srs_error_t err;
// Test default value (false) when no vhost
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_FALSE(conf.get_rtc_enabled("__defaultVhost__"));
EXPECT_FALSE(conf.get_rtc_enabled("test.com"));
}
// Test default value (false) when vhost exists but no rtc section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{hls{enabled on;}}"));
EXPECT_FALSE(conf.get_rtc_enabled("test.com"));
}
// Test default value (false) when rtc section exists but no enabled directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{keep_bframe on;}}"));
EXPECT_FALSE(conf.get_rtc_enabled("test.com"));
}
// Test rtc enabled on
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on;}}"));
EXPECT_TRUE(conf.get_rtc_enabled("test.com"));
}
// Test rtc enabled off
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled off;}}"));
EXPECT_FALSE(conf.get_rtc_enabled("test.com"));
}
// Test SRS_CONF_PREFER_FALSE behavior (only "on" is true)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled true;}}"));
EXPECT_FALSE(conf.get_rtc_enabled("test.com")); // "true" != "on", so it's false
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled yes;}}"));
EXPECT_FALSE(conf.get_rtc_enabled("test.com")); // "yes" != "on", so it's false
}
// Test empty value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled;}}"));
EXPECT_FALSE(conf.get_rtc_enabled("test.com"));
}
// Test environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled off;}}"));
SrsSetEnvConfig(conf, rtc_enabled, "SRS_VHOST_RTC_ENABLED", "on");
EXPECT_TRUE(conf.get_rtc_enabled("test.com"));
}
}
VOID TEST(ConfigRtcVhostTest, CheckRtcKeepBframe)
{
srs_error_t err;
// Test default value (false) when no vhost
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_FALSE(conf.get_rtc_keep_bframe("__defaultVhost__"));
EXPECT_FALSE(conf.get_rtc_keep_bframe("test.com"));
}
// Test default value (false) when vhost exists but no rtc section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{hls{enabled on;}}"));
EXPECT_FALSE(conf.get_rtc_keep_bframe("test.com"));
}
// Test default value (false) when rtc section exists but no keep_bframe directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on;}}"));
EXPECT_FALSE(conf.get_rtc_keep_bframe("test.com"));
}
// Test keep_bframe on
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{keep_bframe on;}}"));
EXPECT_TRUE(conf.get_rtc_keep_bframe("test.com"));
}
// Test keep_bframe off
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{keep_bframe off;}}"));
EXPECT_FALSE(conf.get_rtc_keep_bframe("test.com"));
}
// Test SRS_CONF_PREFER_FALSE behavior (only "on" is true)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{keep_bframe true;}}"));
EXPECT_FALSE(conf.get_rtc_keep_bframe("test.com")); // "true" != "on", so it's false
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{keep_bframe yes;}}"));
EXPECT_FALSE(conf.get_rtc_keep_bframe("test.com")); // "yes" != "on", so it's false
}
// Test empty value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{keep_bframe;}}"));
EXPECT_FALSE(conf.get_rtc_keep_bframe("test.com"));
}
// Test environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{keep_bframe off;}}"));
SrsSetEnvConfig(conf, rtc_keep_bframe, "SRS_VHOST_RTC_KEEP_BFRAME", "on");
EXPECT_TRUE(conf.get_rtc_keep_bframe("test.com"));
}
}
VOID TEST(ConfigRtcVhostTest, CheckRtcKeepAvcNaluSei)
{
srs_error_t err;
// Test default value (true) when no vhost
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_TRUE(conf.get_rtc_keep_avc_nalu_sei("__defaultVhost__"));
EXPECT_TRUE(conf.get_rtc_keep_avc_nalu_sei("test.com"));
}
// Test default value (true) when vhost exists but no rtc section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{hls{enabled on;}}"));
EXPECT_TRUE(conf.get_rtc_keep_avc_nalu_sei("test.com"));
}
// Test default value (true) when rtc section exists but no keep_avc_nalu_sei directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on;}}"));
EXPECT_TRUE(conf.get_rtc_keep_avc_nalu_sei("test.com"));
}
// Test keep_avc_nalu_sei off
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{keep_avc_nalu_sei off;}}"));
EXPECT_FALSE(conf.get_rtc_keep_avc_nalu_sei("test.com"));
}
// Test keep_avc_nalu_sei on
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{keep_avc_nalu_sei on;}}"));
EXPECT_TRUE(conf.get_rtc_keep_avc_nalu_sei("test.com"));
}
// Test SRS_CONF_PREFER_TRUE behavior (only "off" is false)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{keep_avc_nalu_sei true;}}"));
EXPECT_TRUE(conf.get_rtc_keep_avc_nalu_sei("test.com")); // "true" != "off", so it's true
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{keep_avc_nalu_sei yes;}}"));
EXPECT_TRUE(conf.get_rtc_keep_avc_nalu_sei("test.com")); // "yes" != "off", so it's true
}
// Test empty value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{keep_avc_nalu_sei;}}"));
EXPECT_TRUE(conf.get_rtc_keep_avc_nalu_sei("test.com"));
}
// Test environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{keep_avc_nalu_sei on;}}"));
SrsSetEnvConfig(conf, rtc_keep_avc_nalu_sei, "SRS_VHOST_RTC_KEEP_AVC_NALU_SEI", "off");
EXPECT_FALSE(conf.get_rtc_keep_avc_nalu_sei("test.com"));
}
}
VOID TEST(ConfigRtcVhostTest, CheckRtcFromRtmp)
{
srs_error_t err;
// Test default value (false) when no vhost
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_FALSE(conf.get_rtc_from_rtmp("__defaultVhost__"));
EXPECT_FALSE(conf.get_rtc_from_rtmp("test.com"));
}
// Test default value (false) when vhost exists but no rtc section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{hls{enabled on;}}"));
EXPECT_FALSE(conf.get_rtc_from_rtmp("test.com"));
}
// Test default value (false) when rtc section exists but no rtmp_to_rtc directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on;}}"));
EXPECT_FALSE(conf.get_rtc_from_rtmp("test.com"));
}
// Test rtmp_to_rtc on
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{rtmp_to_rtc on;}}"));
EXPECT_TRUE(conf.get_rtc_from_rtmp("test.com"));
}
// Test rtmp_to_rtc off
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{rtmp_to_rtc off;}}"));
EXPECT_FALSE(conf.get_rtc_from_rtmp("test.com"));
}
// Test SRS_CONF_PREFER_FALSE behavior (only "on" is true)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{rtmp_to_rtc true;}}"));
EXPECT_FALSE(conf.get_rtc_from_rtmp("test.com")); // "true" != "on", so it's false
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{rtmp_to_rtc yes;}}"));
EXPECT_FALSE(conf.get_rtc_from_rtmp("test.com")); // "yes" != "on", so it's false
}
// Test empty value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{rtmp_to_rtc;}}"));
EXPECT_FALSE(conf.get_rtc_from_rtmp("test.com"));
}
// Test environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{rtmp_to_rtc off;}}"));
SrsSetEnvConfig(conf, rtc_from_rtmp, "SRS_VHOST_RTC_RTMP_TO_RTC", "on");
EXPECT_TRUE(conf.get_rtc_from_rtmp("test.com"));
}
}
VOID TEST(ConfigRtcVhostTest, CheckRtcStunTimeout)
{
srs_error_t err;
// Test default value (30 seconds) when no vhost
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_EQ(30 * SRS_UTIME_SECONDS, conf.get_rtc_stun_timeout("__defaultVhost__"));
EXPECT_EQ(30 * SRS_UTIME_SECONDS, conf.get_rtc_stun_timeout("test.com"));
}
// Test default value (30 seconds) when vhost exists but no rtc section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{hls{enabled on;}}"));
EXPECT_EQ(30 * SRS_UTIME_SECONDS, conf.get_rtc_stun_timeout("test.com"));
}
// Test default value (30 seconds) when rtc section exists but no stun_timeout directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on;}}"));
EXPECT_EQ(30 * SRS_UTIME_SECONDS, conf.get_rtc_stun_timeout("test.com"));
}
// Test explicit stun_timeout value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{stun_timeout 60;}}"));
EXPECT_EQ(60 * SRS_UTIME_SECONDS, conf.get_rtc_stun_timeout("test.com"));
}
// Test stun_timeout 0
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{stun_timeout 0;}}"));
EXPECT_EQ(0, conf.get_rtc_stun_timeout("test.com"));
}
// Test empty stun_timeout value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{stun_timeout;}}"));
EXPECT_EQ(30 * SRS_UTIME_SECONDS, conf.get_rtc_stun_timeout("test.com"));
}
// Test environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{stun_timeout 60;}}"));
SrsSetEnvConfig(conf, rtc_stun_timeout, "SRS_VHOST_RTC_STUN_TIMEOUT", "120");
EXPECT_EQ(120 * SRS_UTIME_SECONDS, conf.get_rtc_stun_timeout("test.com"));
}
}
VOID TEST(ConfigRtcVhostTest, CheckRtcStunStrictCheck)
{
srs_error_t err;
// Test default value (false) when no vhost
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_FALSE(conf.get_rtc_stun_strict_check("__defaultVhost__"));
EXPECT_FALSE(conf.get_rtc_stun_strict_check("test.com"));
}
// Test default value (false) when vhost exists but no rtc section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{hls{enabled on;}}"));
EXPECT_FALSE(conf.get_rtc_stun_strict_check("test.com"));
}
// Test default value (false) when rtc section exists but no stun_strict_check directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on;}}"));
EXPECT_FALSE(conf.get_rtc_stun_strict_check("test.com"));
}
// Test stun_strict_check on
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{stun_strict_check on;}}"));
EXPECT_TRUE(conf.get_rtc_stun_strict_check("test.com"));
}
// Test stun_strict_check off
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{stun_strict_check off;}}"));
EXPECT_FALSE(conf.get_rtc_stun_strict_check("test.com"));
}
// Test SRS_CONF_PREFER_FALSE behavior (only "on" is true)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{stun_strict_check true;}}"));
EXPECT_FALSE(conf.get_rtc_stun_strict_check("test.com")); // "true" != "on", so it's false
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{stun_strict_check yes;}}"));
EXPECT_FALSE(conf.get_rtc_stun_strict_check("test.com")); // "yes" != "on", so it's false
}
// Test empty value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{stun_strict_check;}}"));
EXPECT_FALSE(conf.get_rtc_stun_strict_check("test.com"));
}
// Test environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{stun_strict_check off;}}"));
SrsSetEnvConfig(conf, rtc_stun_strict_check, "SRS_VHOST_RTC_STUN_STRICT_CHECK", "on");
EXPECT_TRUE(conf.get_rtc_stun_strict_check("test.com"));
}
}
VOID TEST(ConfigRtcVhostTest, CheckRtcDtlsRole)
{
srs_error_t err;
// Test default value (passive) when no vhost
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_STREQ("passive", conf.get_rtc_dtls_role("__defaultVhost__").c_str());
EXPECT_STREQ("passive", conf.get_rtc_dtls_role("test.com").c_str());
}
// Test default value (passive) when vhost exists but no rtc section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{hls{enabled on;}}"));
EXPECT_STREQ("passive", conf.get_rtc_dtls_role("test.com").c_str());
}
// Test default value (passive) when rtc section exists but no dtls_role directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on;}}"));
EXPECT_STREQ("passive", conf.get_rtc_dtls_role("test.com").c_str());
}
// Test explicit dtls_role value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{dtls_role active;}}"));
EXPECT_STREQ("active", conf.get_rtc_dtls_role("test.com").c_str());
}
// Test empty dtls_role value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{dtls_role;}}"));
EXPECT_STREQ("passive", conf.get_rtc_dtls_role("test.com").c_str());
}
// Test environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{dtls_role passive;}}"));
SrsSetEnvConfig(conf, rtc_dtls_role, "SRS_VHOST_RTC_DTLS_ROLE", "active");
EXPECT_STREQ("active", conf.get_rtc_dtls_role("test.com").c_str());
}
}
VOID TEST(ConfigRtcVhostTest, CheckRtcDtlsVersion)
{
srs_error_t err;
// Test default value (auto) when no vhost
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_STREQ("auto", conf.get_rtc_dtls_version("__defaultVhost__").c_str());
EXPECT_STREQ("auto", conf.get_rtc_dtls_version("test.com").c_str());
}
// Test default value (auto) when vhost exists but no rtc section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{hls{enabled on;}}"));
EXPECT_STREQ("auto", conf.get_rtc_dtls_version("test.com").c_str());
}
// Test default value (auto) when rtc section exists but no dtls_version directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on;}}"));
EXPECT_STREQ("auto", conf.get_rtc_dtls_version("test.com").c_str());
}
// Test explicit dtls_version value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{dtls_version 1.2;}}"));
EXPECT_STREQ("1.2", conf.get_rtc_dtls_version("test.com").c_str());
}
// Test empty dtls_version value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{dtls_version;}}"));
EXPECT_STREQ("auto", conf.get_rtc_dtls_version("test.com").c_str());
}
// Test environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{dtls_version auto;}}"));
SrsSetEnvConfig(conf, rtc_dtls_version, "SRS_VHOST_RTC_DTLS_VERSION", "1.3");
EXPECT_STREQ("1.3", conf.get_rtc_dtls_version("test.com").c_str());
}
}
VOID TEST(ConfigRtcVhostTest, CheckRtcDropForPt)
{
srs_error_t err;
// Test default value (0) when no vhost
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_EQ(0, conf.get_rtc_drop_for_pt("__defaultVhost__"));
EXPECT_EQ(0, conf.get_rtc_drop_for_pt("test.com"));
}
// Test default value (0) when vhost exists but no rtc section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{hls{enabled on;}}"));
EXPECT_EQ(0, conf.get_rtc_drop_for_pt("test.com"));
}
// Test default value (0) when rtc section exists but no drop_for_pt directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on;}}"));
EXPECT_EQ(0, conf.get_rtc_drop_for_pt("test.com"));
}
// Test explicit drop_for_pt value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{drop_for_pt 96;}}"));
EXPECT_EQ(96, conf.get_rtc_drop_for_pt("test.com"));
}
// Test drop_for_pt negative value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{drop_for_pt -1;}}"));
EXPECT_EQ(-1, conf.get_rtc_drop_for_pt("test.com"));
}
// Test empty drop_for_pt value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{drop_for_pt;}}"));
EXPECT_EQ(0, conf.get_rtc_drop_for_pt("test.com"));
}
// Test environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{drop_for_pt 96;}}"));
SrsSetEnvConfig(conf, rtc_drop_for_pt, "SRS_VHOST_RTC_DROP_FOR_PT", "97");
EXPECT_EQ(97, conf.get_rtc_drop_for_pt("test.com"));
}
}
VOID TEST(ConfigRtcVhostTest, CheckRtcToRtmp)
{
srs_error_t err;
// Test default value (false) when no vhost
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF));
EXPECT_FALSE(conf.get_rtc_to_rtmp("__defaultVhost__"));
EXPECT_FALSE(conf.get_rtc_to_rtmp("test.com"));
}
// Test default value (false) when vhost exists but no rtc section
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{hls{enabled on;}}"));
EXPECT_FALSE(conf.get_rtc_to_rtmp("test.com"));
}
// Test default value (false) when rtc section exists but no rtc_to_rtmp directive
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{enabled on;}}"));
EXPECT_FALSE(conf.get_rtc_to_rtmp("test.com"));
}
// Test rtc_to_rtmp on
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{rtc_to_rtmp on;}}"));
EXPECT_TRUE(conf.get_rtc_to_rtmp("test.com"));
}
// Test rtc_to_rtmp off
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{rtc_to_rtmp off;}}"));
EXPECT_FALSE(conf.get_rtc_to_rtmp("test.com"));
}
// Test SRS_CONF_PREFER_FALSE behavior (only "on" is true)
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{rtc_to_rtmp true;}}"));
EXPECT_FALSE(conf.get_rtc_to_rtmp("test.com")); // "true" != "on", so it's false
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{rtc_to_rtmp yes;}}"));
EXPECT_FALSE(conf.get_rtc_to_rtmp("test.com")); // "yes" != "on", so it's false
}
// Test empty value
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{rtc_to_rtmp;}}"));
EXPECT_FALSE(conf.get_rtc_to_rtmp("test.com"));
}
// Test environment variable override
if (true) {
MockSrsConfig conf;
HELPER_ASSERT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost test.com{rtc{rtc_to_rtmp off;}}"));
SrsSetEnvConfig(conf, rtc_to_rtmp, "SRS_VHOST_RTC_RTC_TO_RTMP", "on");
EXPECT_TRUE(conf.get_rtc_to_rtmp("test.com"));
}
}