From 86ad39f00101abfa0a4dd7f1a1b846d746dd992d Mon Sep 17 00:00:00 2001 From: winlin Date: Sun, 20 Jul 2014 15:53:19 +0800 Subject: [PATCH] finish basic utest for config --- trunk/src/app/srs_app_config.cpp | 7 +- trunk/src/app/srs_app_config.hpp | 2 + trunk/src/core/srs_core.hpp | 2 +- trunk/src/utest/srs_utest_config.cpp | 273 +++++++++++++++++++++++++++ 4 files changed, 280 insertions(+), 4 deletions(-) diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index a9d94f5bb..92e6ef221 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -170,21 +170,22 @@ int SrsConfDirective::parse_conf(_srs_internal::SrsConfigBuffer* buffer, SrsDire } if (ret == ERROR_SYSTEM_CONFIG_BLOCK_END) { if (type != parse_block) { - srs_error("line %d: unexpected \"}\"", buffer->line + 1); + srs_error("line %d: unexpected \"}\", ret=%d", buffer->line + 1, ret); return ret; } return ERROR_SUCCESS; } if (ret == ERROR_SYSTEM_CONFIG_EOF) { if (type == parse_block) { - srs_error("line %d: unexpected end of file, expecting \"}\"", conf_line + 1); + srs_error("line %d: unexpected end of file, expecting \"}\", ret=%d", conf_line + 1, ret); return ret; } return ERROR_SUCCESS; } if (args.empty()) { - srs_error("line %d: empty directive.", conf_line + 1); + ret = ERROR_SYSTEM_CONFIG_INVALID; + srs_error("line %d: empty directive. ret=%d", conf_line + 1, ret); return ret; } diff --git a/trunk/src/app/srs_app_config.hpp b/trunk/src/app/srs_app_config.hpp index 9a0d32657..29712cca2 100644 --- a/trunk/src/app/srs_app_config.hpp +++ b/trunk/src/app/srs_app_config.hpp @@ -116,6 +116,8 @@ namespace _srs_internal * SrsConfDirective: name="ffmpeg", arg0="/bin/ffmpeg", child-directives=[] * ] * ] +* @remark, allow empty directive, for example: "dir0 {}" +* @remark, don't allow empty name, for example: ";" or "{dir0 arg0;} */ class SrsConfDirective { diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index 3997b82fa..15046495e 100644 --- a/trunk/src/core/srs_core.hpp +++ b/trunk/src/core/srs_core.hpp @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // current release version #define VERSION_MAJOR "0" #define VERSION_MINOR "9" -#define VERSION_REVISION "163" +#define VERSION_REVISION "164" #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION // server info. #define RTMP_SIG_SRS_KEY "SRS" diff --git a/trunk/src/utest/srs_utest_config.cpp b/trunk/src/utest/srs_utest_config.cpp index dff53c9c5..b44932211 100644 --- a/trunk/src/utest/srs_utest_config.cpp +++ b/trunk/src/utest/srs_utest_config.cpp @@ -390,3 +390,276 @@ VOID TEST(ConfigDirectiveTest, ParseNameArg2_Dir0Arg0_Dir0Arg0) EXPECT_STREQ("ddir_arg0", ddir0.arg0().c_str()); EXPECT_EQ(0, (int)ddir0.directives.size()); } + +VOID TEST(ConfigDirectiveTest, Parse2SingleDirs) +{ + MockSrsConfigBuffer buf("dir0 arg0;dir1 arg1;"); + SrsConfDirective conf; + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf)); + EXPECT_EQ(0, (int)conf.name.length()); + EXPECT_EQ(0, (int)conf.args.size()); + EXPECT_EQ(2, (int)conf.directives.size()); + + SrsConfDirective& dir0 = *conf.directives.at(0); + EXPECT_STREQ("dir0", dir0.name.c_str()); + EXPECT_EQ(1, (int)dir0.args.size()); + EXPECT_STREQ("arg0", dir0.arg0().c_str()); + EXPECT_EQ(0, (int)dir0.directives.size()); + + SrsConfDirective& dir1 = *conf.directives.at(1); + EXPECT_STREQ("dir1", dir1.name.c_str()); + EXPECT_EQ(1, (int)dir1.args.size()); + EXPECT_STREQ("arg1", dir1.arg0().c_str()); + EXPECT_EQ(0, (int)dir1.directives.size()); +} + +VOID TEST(ConfigDirectiveTest, ParseSingleComplexDirs) +{ + MockSrsConfigBuffer buf("dir0 arg0;dir1 {dir2 arg2;}"); + SrsConfDirective conf; + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf)); + EXPECT_EQ(0, (int)conf.name.length()); + EXPECT_EQ(0, (int)conf.args.size()); + EXPECT_EQ(2, (int)conf.directives.size()); + + SrsConfDirective& dir0 = *conf.directives.at(0); + EXPECT_STREQ("dir0", dir0.name.c_str()); + EXPECT_EQ(1, (int)dir0.args.size()); + EXPECT_STREQ("arg0", dir0.arg0().c_str()); + EXPECT_EQ(0, (int)dir0.directives.size()); + + SrsConfDirective& dir1 = *conf.directives.at(1); + EXPECT_STREQ("dir1", dir1.name.c_str()); + EXPECT_EQ(0, (int)dir1.args.size()); + EXPECT_EQ(1, (int)dir1.directives.size()); + + SrsConfDirective& dir2 = *dir1.directives.at(0); + EXPECT_STREQ("dir2", dir2.name.c_str()); + EXPECT_EQ(1, (int)dir2.args.size()); + EXPECT_STREQ("arg2", dir2.arg0().c_str()); + EXPECT_EQ(0, (int)dir2.directives.size()); +} + +VOID TEST(ConfigDirectiveTest, ParseStringArgs) +{ + MockSrsConfigBuffer buf("dir0 arg0 \"str_arg\" 100;"); + SrsConfDirective conf; + EXPECT_TRUE(ERROR_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& dir0 = *conf.directives.at(0); + EXPECT_STREQ("dir0", dir0.name.c_str()); + EXPECT_EQ(3, (int)dir0.args.size()); + EXPECT_STREQ("arg0", dir0.arg0().c_str()); + EXPECT_STREQ("str_arg", dir0.arg1().c_str()); + EXPECT_STREQ("100", dir0.arg2().c_str()); + EXPECT_EQ(0, (int)dir0.directives.size()); +} + +VOID TEST(ConfigDirectiveTest, ParseStringArgsWithSpace) +{ + MockSrsConfigBuffer buf("dir0 arg0 \"str_arg space\" 100;"); + SrsConfDirective conf; + EXPECT_TRUE(ERROR_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& dir0 = *conf.directives.at(0); + EXPECT_STREQ("dir0", dir0.name.c_str()); + EXPECT_EQ(3, (int)dir0.args.size()); + EXPECT_STREQ("arg0", dir0.arg0().c_str()); + EXPECT_STREQ("str_arg space", dir0.arg1().c_str()); + EXPECT_STREQ("100", dir0.arg2().c_str()); + EXPECT_EQ(0, (int)dir0.directives.size()); +} + +VOID TEST(ConfigDirectiveTest, ParseNumberArgs) +{ + MockSrsConfigBuffer buf("dir0 100 101 102;"); + SrsConfDirective conf; + EXPECT_TRUE(ERROR_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& dir0 = *conf.directives.at(0); + EXPECT_STREQ("dir0", dir0.name.c_str()); + EXPECT_EQ(3, (int)dir0.args.size()); + EXPECT_EQ(100, ::atoi(dir0.arg0().c_str())); + EXPECT_EQ(101, ::atoi(dir0.arg1().c_str())); + EXPECT_EQ(102, ::atoi(dir0.arg2().c_str())); + EXPECT_EQ(0, (int)dir0.directives.size()); +} + +VOID TEST(ConfigDirectiveTest, ParseFloatArgs) +{ + MockSrsConfigBuffer buf("dir0 100.01 101.02 102.03;"); + SrsConfDirective conf; + EXPECT_TRUE(ERROR_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& dir0 = *conf.directives.at(0); + EXPECT_STREQ("dir0", dir0.name.c_str()); + EXPECT_EQ(3, (int)dir0.args.size()); + EXPECT_FLOAT_EQ(100.01, ::atof(dir0.arg0().c_str())); + EXPECT_FLOAT_EQ(101.02, ::atof(dir0.arg1().c_str())); + EXPECT_FLOAT_EQ(102.03, ::atof(dir0.arg2().c_str())); + EXPECT_EQ(0, (int)dir0.directives.size()); +} + +VOID TEST(ConfigDirectiveTest, ParseComments) +{ + MockSrsConfigBuffer buf("#commnets\ndir0 arg0;\n#end-comments"); + SrsConfDirective conf; + EXPECT_TRUE(ERROR_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& dir0 = *conf.directives.at(0); + EXPECT_STREQ("dir0", dir0.name.c_str()); + EXPECT_EQ(1, (int)dir0.args.size()); + EXPECT_STREQ("arg0", dir0.arg0().c_str()); + EXPECT_EQ(0, (int)dir0.directives.size()); +} + +VOID TEST(ConfigDirectiveTest, ParseCommentsInline) +{ + MockSrsConfigBuffer buf("#commnets\ndir0 arg0;#inline comments\n#end-comments"); + SrsConfDirective conf; + EXPECT_TRUE(ERROR_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& dir0 = *conf.directives.at(0); + EXPECT_STREQ("dir0", dir0.name.c_str()); + EXPECT_EQ(1, (int)dir0.args.size()); + EXPECT_STREQ("arg0", dir0.arg0().c_str()); + EXPECT_EQ(0, (int)dir0.directives.size()); +} + +VOID TEST(ConfigDirectiveTest, ParseCommentsInlineWithSpace) +{ + MockSrsConfigBuffer buf(" #commnets\ndir0 arg0; #inline comments\n #end-comments"); + SrsConfDirective conf; + EXPECT_TRUE(ERROR_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& dir0 = *conf.directives.at(0); + EXPECT_STREQ("dir0", dir0.name.c_str()); + EXPECT_EQ(1, (int)dir0.args.size()); + EXPECT_STREQ("arg0", dir0.arg0().c_str()); + EXPECT_EQ(0, (int)dir0.directives.size()); +} + +VOID TEST(ConfigDirectiveTest, ParseCommentsInlinemixed) +{ + MockSrsConfigBuffer buf("#commnets\ndir0 arg0;#inline comments\n#end-comments\ndir1 arg1;"); + SrsConfDirective conf; + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf)); + EXPECT_EQ(0, (int)conf.name.length()); + EXPECT_EQ(0, (int)conf.args.size()); + EXPECT_EQ(2, (int)conf.directives.size()); + + SrsConfDirective& dir0 = *conf.directives.at(0); + EXPECT_STREQ("dir0", dir0.name.c_str()); + EXPECT_EQ(1, (int)dir0.args.size()); + EXPECT_STREQ("arg0", dir0.arg0().c_str()); + EXPECT_EQ(0, (int)dir0.directives.size()); + + SrsConfDirective& dir1 = *conf.directives.at(1); + EXPECT_STREQ("dir1", dir1.name.c_str()); + EXPECT_EQ(1, (int)dir1.args.size()); + EXPECT_STREQ("arg1", dir1.arg0().c_str()); + EXPECT_EQ(0, (int)dir1.directives.size()); +} + +VOID TEST(ConfigDirectiveTest, ParseSpecialChars) +{ + MockSrsConfigBuffer buf("dir0 http://www.ossrs.net/api/v1/versions?level=major;"); + SrsConfDirective conf; + EXPECT_TRUE(ERROR_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& dir0 = *conf.directives.at(0); + EXPECT_STREQ("dir0", dir0.name.c_str()); + EXPECT_EQ(1, (int)dir0.args.size()); + EXPECT_STREQ("http://www.ossrs.net/api/v1/versions?level=major", dir0.arg0().c_str()); + EXPECT_EQ(0, (int)dir0.directives.size()); +} + +VOID TEST(ConfigDirectiveTest, ParseSpecialChars2) +{ + MockSrsConfigBuffer buf("dir0 rtmp://[server]:[port]/[app]/[stream]_[engine];"); + SrsConfDirective conf; + EXPECT_TRUE(ERROR_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& dir0 = *conf.directives.at(0); + EXPECT_STREQ("dir0", dir0.name.c_str()); + EXPECT_EQ(1, (int)dir0.args.size()); + EXPECT_STREQ("rtmp://[server]:[port]/[app]/[stream]_[engine]", dir0.arg0().c_str()); + EXPECT_EQ(0, (int)dir0.directives.size()); +} + +VOID TEST(ConfigDirectiveTest, ParseInvalidNoEndOfDirective) +{ + MockSrsConfigBuffer buf("dir0"); + SrsConfDirective conf; + EXPECT_TRUE(ERROR_SUCCESS != conf.parse(&buf)); +} + +VOID TEST(ConfigDirectiveTest, ParseInvalidNoEndOfSubDirective) +{ + MockSrsConfigBuffer buf("dir0 {"); + SrsConfDirective conf; + EXPECT_TRUE(ERROR_SUCCESS != conf.parse(&buf)); +} + +VOID TEST(ConfigDirectiveTest, ParseInvalidNoStartOfSubDirective) +{ + MockSrsConfigBuffer buf("dir0 }"); + SrsConfDirective conf; + EXPECT_TRUE(ERROR_SUCCESS != conf.parse(&buf)); +} + +VOID TEST(ConfigDirectiveTest, ParseInvalidEmptyName) +{ + MockSrsConfigBuffer buf(";"); + SrsConfDirective conf; + EXPECT_TRUE(ERROR_SUCCESS != conf.parse(&buf)); +} + +VOID TEST(ConfigDirectiveTest, ParseInvalidEmptyName2) +{ + MockSrsConfigBuffer buf("{}"); + SrsConfDirective conf; + EXPECT_TRUE(ERROR_SUCCESS != conf.parse(&buf)); +} + +VOID TEST(ConfigDirectiveTest, ParseInvalidEmptyDirective) +{ + MockSrsConfigBuffer buf("dir0 {}"); + SrsConfDirective conf; + EXPECT_TRUE(ERROR_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& dir0 = *conf.directives.at(0); + EXPECT_STREQ("dir0", dir0.name.c_str()); + EXPECT_EQ(0, (int)dir0.args.size()); + EXPECT_EQ(0, (int)dir0.directives.size()); +}