winlin

finish basic utest for config

@@ -170,21 +170,22 @@ int SrsConfDirective::parse_conf(_srs_internal::SrsConfigBuffer* buffer, SrsDire @@ -170,21 +170,22 @@ int SrsConfDirective::parse_conf(_srs_internal::SrsConfigBuffer* buffer, SrsDire
170 } 170 }
171 if (ret == ERROR_SYSTEM_CONFIG_BLOCK_END) { 171 if (ret == ERROR_SYSTEM_CONFIG_BLOCK_END) {
172 if (type != parse_block) { 172 if (type != parse_block) {
173 - srs_error("line %d: unexpected \"}\"", buffer->line + 1); 173 + srs_error("line %d: unexpected \"}\", ret=%d", buffer->line + 1, ret);
174 return ret; 174 return ret;
175 } 175 }
176 return ERROR_SUCCESS; 176 return ERROR_SUCCESS;
177 } 177 }
178 if (ret == ERROR_SYSTEM_CONFIG_EOF) { 178 if (ret == ERROR_SYSTEM_CONFIG_EOF) {
179 if (type == parse_block) { 179 if (type == parse_block) {
180 - srs_error("line %d: unexpected end of file, expecting \"}\"", conf_line + 1); 180 + srs_error("line %d: unexpected end of file, expecting \"}\", ret=%d", conf_line + 1, ret);
181 return ret; 181 return ret;
182 } 182 }
183 return ERROR_SUCCESS; 183 return ERROR_SUCCESS;
184 } 184 }
185 185
186 if (args.empty()) { 186 if (args.empty()) {
187 - srs_error("line %d: empty directive.", conf_line + 1); 187 + ret = ERROR_SYSTEM_CONFIG_INVALID;
  188 + srs_error("line %d: empty directive. ret=%d", conf_line + 1, ret);
188 return ret; 189 return ret;
189 } 190 }
190 191
@@ -116,6 +116,8 @@ namespace _srs_internal @@ -116,6 +116,8 @@ namespace _srs_internal
116 * SrsConfDirective: name="ffmpeg", arg0="/bin/ffmpeg", child-directives=[] 116 * SrsConfDirective: name="ffmpeg", arg0="/bin/ffmpeg", child-directives=[]
117 * ] 117 * ]
118 * ] 118 * ]
  119 +* @remark, allow empty directive, for example: "dir0 {}"
  120 +* @remark, don't allow empty name, for example: ";" or "{dir0 arg0;}
119 */ 121 */
120 class SrsConfDirective 122 class SrsConfDirective
121 { 123 {
@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 // current release version 31 // current release version
32 #define VERSION_MAJOR "0" 32 #define VERSION_MAJOR "0"
33 #define VERSION_MINOR "9" 33 #define VERSION_MINOR "9"
34 -#define VERSION_REVISION "163" 34 +#define VERSION_REVISION "164"
35 #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION 35 #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION
36 // server info. 36 // server info.
37 #define RTMP_SIG_SRS_KEY "SRS" 37 #define RTMP_SIG_SRS_KEY "SRS"
@@ -390,3 +390,276 @@ VOID TEST(ConfigDirectiveTest, ParseNameArg2_Dir0Arg0_Dir0Arg0) @@ -390,3 +390,276 @@ VOID TEST(ConfigDirectiveTest, ParseNameArg2_Dir0Arg0_Dir0Arg0)
390 EXPECT_STREQ("ddir_arg0", ddir0.arg0().c_str()); 390 EXPECT_STREQ("ddir_arg0", ddir0.arg0().c_str());
391 EXPECT_EQ(0, (int)ddir0.directives.size()); 391 EXPECT_EQ(0, (int)ddir0.directives.size());
392 } 392 }
  393 +
  394 +VOID TEST(ConfigDirectiveTest, Parse2SingleDirs)
  395 +{
  396 + MockSrsConfigBuffer buf("dir0 arg0;dir1 arg1;");
  397 + SrsConfDirective conf;
  398 + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf));
  399 + EXPECT_EQ(0, (int)conf.name.length());
  400 + EXPECT_EQ(0, (int)conf.args.size());
  401 + EXPECT_EQ(2, (int)conf.directives.size());
  402 +
  403 + SrsConfDirective& dir0 = *conf.directives.at(0);
  404 + EXPECT_STREQ("dir0", dir0.name.c_str());
  405 + EXPECT_EQ(1, (int)dir0.args.size());
  406 + EXPECT_STREQ("arg0", dir0.arg0().c_str());
  407 + EXPECT_EQ(0, (int)dir0.directives.size());
  408 +
  409 + SrsConfDirective& dir1 = *conf.directives.at(1);
  410 + EXPECT_STREQ("dir1", dir1.name.c_str());
  411 + EXPECT_EQ(1, (int)dir1.args.size());
  412 + EXPECT_STREQ("arg1", dir1.arg0().c_str());
  413 + EXPECT_EQ(0, (int)dir1.directives.size());
  414 +}
  415 +
  416 +VOID TEST(ConfigDirectiveTest, ParseSingleComplexDirs)
  417 +{
  418 + MockSrsConfigBuffer buf("dir0 arg0;dir1 {dir2 arg2;}");
  419 + SrsConfDirective conf;
  420 + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf));
  421 + EXPECT_EQ(0, (int)conf.name.length());
  422 + EXPECT_EQ(0, (int)conf.args.size());
  423 + EXPECT_EQ(2, (int)conf.directives.size());
  424 +
  425 + SrsConfDirective& dir0 = *conf.directives.at(0);
  426 + EXPECT_STREQ("dir0", dir0.name.c_str());
  427 + EXPECT_EQ(1, (int)dir0.args.size());
  428 + EXPECT_STREQ("arg0", dir0.arg0().c_str());
  429 + EXPECT_EQ(0, (int)dir0.directives.size());
  430 +
  431 + SrsConfDirective& dir1 = *conf.directives.at(1);
  432 + EXPECT_STREQ("dir1", dir1.name.c_str());
  433 + EXPECT_EQ(0, (int)dir1.args.size());
  434 + EXPECT_EQ(1, (int)dir1.directives.size());
  435 +
  436 + SrsConfDirective& dir2 = *dir1.directives.at(0);
  437 + EXPECT_STREQ("dir2", dir2.name.c_str());
  438 + EXPECT_EQ(1, (int)dir2.args.size());
  439 + EXPECT_STREQ("arg2", dir2.arg0().c_str());
  440 + EXPECT_EQ(0, (int)dir2.directives.size());
  441 +}
  442 +
  443 +VOID TEST(ConfigDirectiveTest, ParseStringArgs)
  444 +{
  445 + MockSrsConfigBuffer buf("dir0 arg0 \"str_arg\" 100;");
  446 + SrsConfDirective conf;
  447 + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf));
  448 + EXPECT_EQ(0, (int)conf.name.length());
  449 + EXPECT_EQ(0, (int)conf.args.size());
  450 + EXPECT_EQ(1, (int)conf.directives.size());
  451 +
  452 + SrsConfDirective& dir0 = *conf.directives.at(0);
  453 + EXPECT_STREQ("dir0", dir0.name.c_str());
  454 + EXPECT_EQ(3, (int)dir0.args.size());
  455 + EXPECT_STREQ("arg0", dir0.arg0().c_str());
  456 + EXPECT_STREQ("str_arg", dir0.arg1().c_str());
  457 + EXPECT_STREQ("100", dir0.arg2().c_str());
  458 + EXPECT_EQ(0, (int)dir0.directives.size());
  459 +}
  460 +
  461 +VOID TEST(ConfigDirectiveTest, ParseStringArgsWithSpace)
  462 +{
  463 + MockSrsConfigBuffer buf("dir0 arg0 \"str_arg space\" 100;");
  464 + SrsConfDirective conf;
  465 + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf));
  466 + EXPECT_EQ(0, (int)conf.name.length());
  467 + EXPECT_EQ(0, (int)conf.args.size());
  468 + EXPECT_EQ(1, (int)conf.directives.size());
  469 +
  470 + SrsConfDirective& dir0 = *conf.directives.at(0);
  471 + EXPECT_STREQ("dir0", dir0.name.c_str());
  472 + EXPECT_EQ(3, (int)dir0.args.size());
  473 + EXPECT_STREQ("arg0", dir0.arg0().c_str());
  474 + EXPECT_STREQ("str_arg space", dir0.arg1().c_str());
  475 + EXPECT_STREQ("100", dir0.arg2().c_str());
  476 + EXPECT_EQ(0, (int)dir0.directives.size());
  477 +}
  478 +
  479 +VOID TEST(ConfigDirectiveTest, ParseNumberArgs)
  480 +{
  481 + MockSrsConfigBuffer buf("dir0 100 101 102;");
  482 + SrsConfDirective conf;
  483 + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf));
  484 + EXPECT_EQ(0, (int)conf.name.length());
  485 + EXPECT_EQ(0, (int)conf.args.size());
  486 + EXPECT_EQ(1, (int)conf.directives.size());
  487 +
  488 + SrsConfDirective& dir0 = *conf.directives.at(0);
  489 + EXPECT_STREQ("dir0", dir0.name.c_str());
  490 + EXPECT_EQ(3, (int)dir0.args.size());
  491 + EXPECT_EQ(100, ::atoi(dir0.arg0().c_str()));
  492 + EXPECT_EQ(101, ::atoi(dir0.arg1().c_str()));
  493 + EXPECT_EQ(102, ::atoi(dir0.arg2().c_str()));
  494 + EXPECT_EQ(0, (int)dir0.directives.size());
  495 +}
  496 +
  497 +VOID TEST(ConfigDirectiveTest, ParseFloatArgs)
  498 +{
  499 + MockSrsConfigBuffer buf("dir0 100.01 101.02 102.03;");
  500 + SrsConfDirective conf;
  501 + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf));
  502 + EXPECT_EQ(0, (int)conf.name.length());
  503 + EXPECT_EQ(0, (int)conf.args.size());
  504 + EXPECT_EQ(1, (int)conf.directives.size());
  505 +
  506 + SrsConfDirective& dir0 = *conf.directives.at(0);
  507 + EXPECT_STREQ("dir0", dir0.name.c_str());
  508 + EXPECT_EQ(3, (int)dir0.args.size());
  509 + EXPECT_FLOAT_EQ(100.01, ::atof(dir0.arg0().c_str()));
  510 + EXPECT_FLOAT_EQ(101.02, ::atof(dir0.arg1().c_str()));
  511 + EXPECT_FLOAT_EQ(102.03, ::atof(dir0.arg2().c_str()));
  512 + EXPECT_EQ(0, (int)dir0.directives.size());
  513 +}
  514 +
  515 +VOID TEST(ConfigDirectiveTest, ParseComments)
  516 +{
  517 + MockSrsConfigBuffer buf("#commnets\ndir0 arg0;\n#end-comments");
  518 + SrsConfDirective conf;
  519 + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf));
  520 + EXPECT_EQ(0, (int)conf.name.length());
  521 + EXPECT_EQ(0, (int)conf.args.size());
  522 + EXPECT_EQ(1, (int)conf.directives.size());
  523 +
  524 + SrsConfDirective& dir0 = *conf.directives.at(0);
  525 + EXPECT_STREQ("dir0", dir0.name.c_str());
  526 + EXPECT_EQ(1, (int)dir0.args.size());
  527 + EXPECT_STREQ("arg0", dir0.arg0().c_str());
  528 + EXPECT_EQ(0, (int)dir0.directives.size());
  529 +}
  530 +
  531 +VOID TEST(ConfigDirectiveTest, ParseCommentsInline)
  532 +{
  533 + MockSrsConfigBuffer buf("#commnets\ndir0 arg0;#inline comments\n#end-comments");
  534 + SrsConfDirective conf;
  535 + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf));
  536 + EXPECT_EQ(0, (int)conf.name.length());
  537 + EXPECT_EQ(0, (int)conf.args.size());
  538 + EXPECT_EQ(1, (int)conf.directives.size());
  539 +
  540 + SrsConfDirective& dir0 = *conf.directives.at(0);
  541 + EXPECT_STREQ("dir0", dir0.name.c_str());
  542 + EXPECT_EQ(1, (int)dir0.args.size());
  543 + EXPECT_STREQ("arg0", dir0.arg0().c_str());
  544 + EXPECT_EQ(0, (int)dir0.directives.size());
  545 +}
  546 +
  547 +VOID TEST(ConfigDirectiveTest, ParseCommentsInlineWithSpace)
  548 +{
  549 + MockSrsConfigBuffer buf(" #commnets\ndir0 arg0; #inline comments\n #end-comments");
  550 + SrsConfDirective conf;
  551 + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf));
  552 + EXPECT_EQ(0, (int)conf.name.length());
  553 + EXPECT_EQ(0, (int)conf.args.size());
  554 + EXPECT_EQ(1, (int)conf.directives.size());
  555 +
  556 + SrsConfDirective& dir0 = *conf.directives.at(0);
  557 + EXPECT_STREQ("dir0", dir0.name.c_str());
  558 + EXPECT_EQ(1, (int)dir0.args.size());
  559 + EXPECT_STREQ("arg0", dir0.arg0().c_str());
  560 + EXPECT_EQ(0, (int)dir0.directives.size());
  561 +}
  562 +
  563 +VOID TEST(ConfigDirectiveTest, ParseCommentsInlinemixed)
  564 +{
  565 + MockSrsConfigBuffer buf("#commnets\ndir0 arg0;#inline comments\n#end-comments\ndir1 arg1;");
  566 + SrsConfDirective conf;
  567 + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf));
  568 + EXPECT_EQ(0, (int)conf.name.length());
  569 + EXPECT_EQ(0, (int)conf.args.size());
  570 + EXPECT_EQ(2, (int)conf.directives.size());
  571 +
  572 + SrsConfDirective& dir0 = *conf.directives.at(0);
  573 + EXPECT_STREQ("dir0", dir0.name.c_str());
  574 + EXPECT_EQ(1, (int)dir0.args.size());
  575 + EXPECT_STREQ("arg0", dir0.arg0().c_str());
  576 + EXPECT_EQ(0, (int)dir0.directives.size());
  577 +
  578 + SrsConfDirective& dir1 = *conf.directives.at(1);
  579 + EXPECT_STREQ("dir1", dir1.name.c_str());
  580 + EXPECT_EQ(1, (int)dir1.args.size());
  581 + EXPECT_STREQ("arg1", dir1.arg0().c_str());
  582 + EXPECT_EQ(0, (int)dir1.directives.size());
  583 +}
  584 +
  585 +VOID TEST(ConfigDirectiveTest, ParseSpecialChars)
  586 +{
  587 + MockSrsConfigBuffer buf("dir0 http://www.ossrs.net/api/v1/versions?level=major;");
  588 + SrsConfDirective conf;
  589 + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf));
  590 + EXPECT_EQ(0, (int)conf.name.length());
  591 + EXPECT_EQ(0, (int)conf.args.size());
  592 + EXPECT_EQ(1, (int)conf.directives.size());
  593 +
  594 + SrsConfDirective& dir0 = *conf.directives.at(0);
  595 + EXPECT_STREQ("dir0", dir0.name.c_str());
  596 + EXPECT_EQ(1, (int)dir0.args.size());
  597 + EXPECT_STREQ("http://www.ossrs.net/api/v1/versions?level=major", dir0.arg0().c_str());
  598 + EXPECT_EQ(0, (int)dir0.directives.size());
  599 +}
  600 +
  601 +VOID TEST(ConfigDirectiveTest, ParseSpecialChars2)
  602 +{
  603 + MockSrsConfigBuffer buf("dir0 rtmp://[server]:[port]/[app]/[stream]_[engine];");
  604 + SrsConfDirective conf;
  605 + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf));
  606 + EXPECT_EQ(0, (int)conf.name.length());
  607 + EXPECT_EQ(0, (int)conf.args.size());
  608 + EXPECT_EQ(1, (int)conf.directives.size());
  609 +
  610 + SrsConfDirective& dir0 = *conf.directives.at(0);
  611 + EXPECT_STREQ("dir0", dir0.name.c_str());
  612 + EXPECT_EQ(1, (int)dir0.args.size());
  613 + EXPECT_STREQ("rtmp://[server]:[port]/[app]/[stream]_[engine]", dir0.arg0().c_str());
  614 + EXPECT_EQ(0, (int)dir0.directives.size());
  615 +}
  616 +
  617 +VOID TEST(ConfigDirectiveTest, ParseInvalidNoEndOfDirective)
  618 +{
  619 + MockSrsConfigBuffer buf("dir0");
  620 + SrsConfDirective conf;
  621 + EXPECT_TRUE(ERROR_SUCCESS != conf.parse(&buf));
  622 +}
  623 +
  624 +VOID TEST(ConfigDirectiveTest, ParseInvalidNoEndOfSubDirective)
  625 +{
  626 + MockSrsConfigBuffer buf("dir0 {");
  627 + SrsConfDirective conf;
  628 + EXPECT_TRUE(ERROR_SUCCESS != conf.parse(&buf));
  629 +}
  630 +
  631 +VOID TEST(ConfigDirectiveTest, ParseInvalidNoStartOfSubDirective)
  632 +{
  633 + MockSrsConfigBuffer buf("dir0 }");
  634 + SrsConfDirective conf;
  635 + EXPECT_TRUE(ERROR_SUCCESS != conf.parse(&buf));
  636 +}
  637 +
  638 +VOID TEST(ConfigDirectiveTest, ParseInvalidEmptyName)
  639 +{
  640 + MockSrsConfigBuffer buf(";");
  641 + SrsConfDirective conf;
  642 + EXPECT_TRUE(ERROR_SUCCESS != conf.parse(&buf));
  643 +}
  644 +
  645 +VOID TEST(ConfigDirectiveTest, ParseInvalidEmptyName2)
  646 +{
  647 + MockSrsConfigBuffer buf("{}");
  648 + SrsConfDirective conf;
  649 + EXPECT_TRUE(ERROR_SUCCESS != conf.parse(&buf));
  650 +}
  651 +
  652 +VOID TEST(ConfigDirectiveTest, ParseInvalidEmptyDirective)
  653 +{
  654 + MockSrsConfigBuffer buf("dir0 {}");
  655 + SrsConfDirective conf;
  656 + EXPECT_TRUE(ERROR_SUCCESS == conf.parse(&buf));
  657 + EXPECT_EQ(0, (int)conf.name.length());
  658 + EXPECT_EQ(0, (int)conf.args.size());
  659 + EXPECT_EQ(1, (int)conf.directives.size());
  660 +
  661 + SrsConfDirective& dir0 = *conf.directives.at(0);
  662 + EXPECT_STREQ("dir0", dir0.name.c_str());
  663 + EXPECT_EQ(0, (int)dir0.args.size());
  664 + EXPECT_EQ(0, (int)dir0.directives.size());
  665 +}