1package ProFTPD::Tests::Modules::mod_ifversion; 2 3use lib qw(t/lib); 4use base qw(ProFTPD::TestSuite::Child); 5use strict; 6 7use File::Spec; 8use IO::Handle; 9 10use ProFTPD::TestSuite::FTP; 11use ProFTPD::TestSuite::Utils qw(:auth :config :running :test :testsuite); 12 13$| = 1; 14 15my $order = 0; 16 17my $TESTS = { 18 ifversion_eq => { 19 order => ++$order, 20 test_class => [qw(forking)], 21 }, 22 23 ifversion_eq2 => { 24 order => ++$order, 25 test_class => [qw(forking)], 26 }, 27 28 ifversion_ne => { 29 order => ++$order, 30 test_class => [qw(forking)], 31 }, 32 33 ifversion_gt => { 34 order => ++$order, 35 test_class => [qw(forking)], 36 }, 37 38 ifversion_ge => { 39 order => ++$order, 40 test_class => [qw(forking)], 41 }, 42 43 ifversion_lt => { 44 order => ++$order, 45 test_class => [qw(forking)], 46 }, 47 48 ifversion_le => { 49 order => ++$order, 50 test_class => [qw(forking)], 51 }, 52 53 ifversion_regex => { 54 order => ++$order, 55 test_class => [qw(forking)], 56 }, 57 58 ifversion_regex_eq => { 59 order => ++$order, 60 test_class => [qw(forking)], 61 }, 62 63 ifversion_skip_section => { 64 order => ++$order, 65 test_class => [qw(forking)], 66 }, 67 68 ifversion_major_only => { 69 order => ++$order, 70 test_class => [qw(forking)], 71 }, 72 73 ifversion_major_minor_only => { 74 order => ++$order, 75 test_class => [qw(forking)], 76 }, 77 78}; 79 80sub new { 81 return shift()->SUPER::new(@_); 82} 83 84sub list_tests { 85 return testsuite_get_runnable_tests($TESTS); 86} 87 88sub get_server_version { 89 my $proftpd_bin = ProFTPD::TestSuite::Utils::get_proftpd_bin(); 90 91 my @res = `$proftpd_bin -v`; 92 if ($? != 0) { 93 return undef; 94 } 95 96 my $res = $res[0]; 97 chomp($res); 98 99 if ($res =~ /^ProFTPD Version (\S+)$/) { 100 return $1; 101 } 102 103 return undef; 104} 105 106sub ifversion_eq { 107 my $self = shift; 108 my $tmpdir = $self->{tmpdir}; 109 110 my $config_file = "$tmpdir/ifversion.conf"; 111 my $pid_file = File::Spec->rel2abs("$tmpdir/ifversion.pid"); 112 my $scoreboard_file = File::Spec->rel2abs("$tmpdir/ifversion.scoreboard"); 113 114 my $log_file = File::Spec->rel2abs('tests.log'); 115 116 my $config = { 117 PidFile => $pid_file, 118 ScoreboardFile => $scoreboard_file, 119 SystemLog => $log_file, 120 121 IfModules => { 122 'mod_delay.c' => { 123 DelayEngine => 'off', 124 }, 125 }, 126 }; 127 128 my ($port, $config_user, $config_group) = config_write($config_file, $config); 129 130 if (open(my $fh, ">> $config_file")) { 131 my $version = get_server_version(); 132 133 print $fh <<EOC; 134<IfVersion = $version> 135 Foo bar 136</IfVersion> 137EOC 138 unless (close($fh)) { 139 die("Can't write $config_file: $!"); 140 } 141 142 } else { 143 die("Can't open $config_file: $!"); 144 } 145 146 server_start($config_file); 147 148 eval { server_stop($pid_file) }; 149 unless ($@) { 150 die("Server started unexpectedly"); 151 } 152 153 unlink($log_file); 154} 155 156sub ifversion_eq2 { 157 my $self = shift; 158 my $tmpdir = $self->{tmpdir}; 159 160 my $config_file = "$tmpdir/ifversion.conf"; 161 my $pid_file = File::Spec->rel2abs("$tmpdir/ifversion.pid"); 162 my $scoreboard_file = File::Spec->rel2abs("$tmpdir/ifversion.scoreboard"); 163 164 my $log_file = File::Spec->rel2abs('tests.log'); 165 166 my $config = { 167 PidFile => $pid_file, 168 ScoreboardFile => $scoreboard_file, 169 SystemLog => $log_file, 170 171 IfModules => { 172 'mod_delay.c' => { 173 DelayEngine => 'off', 174 }, 175 }, 176 }; 177 178 my ($port, $config_user, $config_group) = config_write($config_file, $config); 179 180 if (open(my $fh, ">> $config_file")) { 181 my $version = get_server_version(); 182 183 print $fh <<EOC; 184<IfVersion == $version> 185 Foo bar 186</IfVersion> 187EOC 188 unless (close($fh)) { 189 die("Can't write $config_file: $!"); 190 } 191 192 } else { 193 die("Can't open $config_file: $!"); 194 } 195 196 server_start($config_file); 197 198 eval { server_stop($pid_file) }; 199 unless ($@) { 200 die("Server started unexpectedly"); 201 } 202 203 unlink($log_file); 204} 205 206sub ifversion_ne { 207 my $self = shift; 208 my $tmpdir = $self->{tmpdir}; 209 210 my $config_file = "$tmpdir/ifversion.conf"; 211 my $pid_file = File::Spec->rel2abs("$tmpdir/ifversion.pid"); 212 my $scoreboard_file = File::Spec->rel2abs("$tmpdir/ifversion.scoreboard"); 213 214 my $log_file = File::Spec->rel2abs('tests.log'); 215 216 my $config = { 217 PidFile => $pid_file, 218 ScoreboardFile => $scoreboard_file, 219 SystemLog => $log_file, 220 221 IfModules => { 222 'mod_delay.c' => { 223 DelayEngine => 'off', 224 }, 225 }, 226 }; 227 228 my ($port, $config_user, $config_group) = config_write($config_file, $config); 229 230 if (open(my $fh, ">> $config_file")) { 231 232 # Pick a version that cannot be used by mod_ifversion 233 my $version = "1.2.2"; 234 235 print $fh <<EOC; 236<IfVersion != $version> 237 Foo bar 238</IfVersion> 239EOC 240 unless (close($fh)) { 241 die("Can't write $config_file: $!"); 242 } 243 244 } else { 245 die("Can't open $config_file: $!"); 246 } 247 248 server_start($config_file); 249 250 eval { server_stop($pid_file) }; 251 unless ($@) { 252 die("Server started unexpectedly"); 253 } 254 255 unlink($log_file); 256} 257 258sub ifversion_gt { 259 my $self = shift; 260 my $tmpdir = $self->{tmpdir}; 261 262 my $config_file = "$tmpdir/ifversion.conf"; 263 my $pid_file = File::Spec->rel2abs("$tmpdir/ifversion.pid"); 264 my $scoreboard_file = File::Spec->rel2abs("$tmpdir/ifversion.scoreboard"); 265 266 my $log_file = File::Spec->rel2abs('tests.log'); 267 268 my $config = { 269 PidFile => $pid_file, 270 ScoreboardFile => $scoreboard_file, 271 SystemLog => $log_file, 272 273 IfModules => { 274 'mod_delay.c' => { 275 DelayEngine => 'off', 276 }, 277 }, 278 }; 279 280 my ($port, $config_user, $config_group) = config_write($config_file, $config); 281 282 if (open(my $fh, ">> $config_file")) { 283 284 # Pick a version that cannot be used by mod_ifversion 285 my $version = "1.2.2"; 286 287 print $fh <<EOC; 288<IfVersion > $version> 289 Foo bar 290</IfVersion> 291EOC 292 unless (close($fh)) { 293 die("Can't write $config_file: $!"); 294 } 295 296 } else { 297 die("Can't open $config_file: $!"); 298 } 299 300 server_start($config_file); 301 302 eval { server_stop($pid_file) }; 303 unless ($@) { 304 die("Server started unexpectedly"); 305 } 306 307 unlink($log_file); 308} 309 310sub ifversion_ge { 311 my $self = shift; 312 my $tmpdir = $self->{tmpdir}; 313 314 my $config_file = "$tmpdir/ifversion.conf"; 315 my $pid_file = File::Spec->rel2abs("$tmpdir/ifversion.pid"); 316 my $scoreboard_file = File::Spec->rel2abs("$tmpdir/ifversion.scoreboard"); 317 318 my $log_file = File::Spec->rel2abs('tests.log'); 319 320 my $config = { 321 PidFile => $pid_file, 322 ScoreboardFile => $scoreboard_file, 323 SystemLog => $log_file, 324 325 IfModules => { 326 'mod_delay.c' => { 327 DelayEngine => 'off', 328 }, 329 }, 330 }; 331 332 my ($port, $config_user, $config_group) = config_write($config_file, $config); 333 334 if (open(my $fh, ">> $config_file")) { 335 my $version = get_server_version(); 336 337 print $fh <<EOC; 338<IfVersion >= $version> 339 Foo bar 340</IfVersion> 341EOC 342 unless (close($fh)) { 343 die("Can't write $config_file: $!"); 344 } 345 346 } else { 347 die("Can't open $config_file: $!"); 348 } 349 350 server_start($config_file); 351 352 eval { server_stop($pid_file) }; 353 unless ($@) { 354 die("Server started unexpectedly"); 355 } 356 357 unlink($log_file); 358} 359 360sub ifversion_lt { 361 my $self = shift; 362 my $tmpdir = $self->{tmpdir}; 363 364 my $config_file = "$tmpdir/ifversion.conf"; 365 my $pid_file = File::Spec->rel2abs("$tmpdir/ifversion.pid"); 366 my $scoreboard_file = File::Spec->rel2abs("$tmpdir/ifversion.scoreboard"); 367 368 my $log_file = File::Spec->rel2abs('tests.log'); 369 370 my $config = { 371 PidFile => $pid_file, 372 ScoreboardFile => $scoreboard_file, 373 SystemLog => $log_file, 374 375 IfModules => { 376 'mod_delay.c' => { 377 DelayEngine => 'off', 378 }, 379 }, 380 }; 381 382 my ($port, $config_user, $config_group) = config_write($config_file, $config); 383 384 if (open(my $fh, ">> $config_file")) { 385 386 # Pick an absurdly high version 387 my $version = "10.11.12z"; 388 389 print $fh <<EOC; 390<IfVersion < $version> 391 Foo bar 392</IfVersion> 393EOC 394 unless (close($fh)) { 395 die("Can't write $config_file: $!"); 396 } 397 398 } else { 399 die("Can't open $config_file: $!"); 400 } 401 402 server_start($config_file); 403 404 eval { server_stop($pid_file) }; 405 unless ($@) { 406 die("Server started unexpectedly"); 407 } 408 409 unlink($log_file); 410} 411 412sub ifversion_le { 413 my $self = shift; 414 my $tmpdir = $self->{tmpdir}; 415 416 my $config_file = "$tmpdir/ifversion.conf"; 417 my $pid_file = File::Spec->rel2abs("$tmpdir/ifversion.pid"); 418 my $scoreboard_file = File::Spec->rel2abs("$tmpdir/ifversion.scoreboard"); 419 420 my $log_file = File::Spec->rel2abs('tests.log'); 421 422 my $config = { 423 PidFile => $pid_file, 424 ScoreboardFile => $scoreboard_file, 425 SystemLog => $log_file, 426 427 IfModules => { 428 'mod_delay.c' => { 429 DelayEngine => 'off', 430 }, 431 }, 432 }; 433 434 my ($port, $config_user, $config_group) = config_write($config_file, $config); 435 436 if (open(my $fh, ">> $config_file")) { 437 my $version = get_server_version(); 438 439 print $fh <<EOC; 440<IfVersion <= $version> 441 Foo bar 442</IfVersion> 443EOC 444 unless (close($fh)) { 445 die("Can't write $config_file: $!"); 446 } 447 448 } else { 449 die("Can't open $config_file: $!"); 450 } 451 452 server_start($config_file); 453 454 eval { server_stop($pid_file) }; 455 unless ($@) { 456 die("Server started unexpectedly"); 457 } 458 459 unlink($log_file); 460} 461 462sub ifversion_regex { 463 my $self = shift; 464 my $tmpdir = $self->{tmpdir}; 465 466 my $config_file = "$tmpdir/ifversion.conf"; 467 my $pid_file = File::Spec->rel2abs("$tmpdir/ifversion.pid"); 468 my $scoreboard_file = File::Spec->rel2abs("$tmpdir/ifversion.scoreboard"); 469 470 my $log_file = File::Spec->rel2abs('tests.log'); 471 472 my $config = { 473 PidFile => $pid_file, 474 ScoreboardFile => $scoreboard_file, 475 SystemLog => $log_file, 476 477 IfModules => { 478 'mod_delay.c' => { 479 DelayEngine => 'off', 480 }, 481 }, 482 }; 483 484 my ($port, $config_user, $config_group) = config_write($config_file, $config); 485 486 if (open(my $fh, ">> $config_file")) { 487 my $version = get_server_version(); 488 489 print $fh <<EOC; 490<IfVersion ~ \\.*> 491 Foo bar 492</IfVersion> 493EOC 494 unless (close($fh)) { 495 die("Can't write $config_file: $!"); 496 } 497 498 } else { 499 die("Can't open $config_file: $!"); 500 } 501 502 server_start($config_file); 503 504 eval { server_stop($pid_file) }; 505 unless ($@) { 506 die("Server started unexpectedly"); 507 } 508 509 unlink($log_file); 510} 511 512sub ifversion_regex_eq { 513 my $self = shift; 514 my $tmpdir = $self->{tmpdir}; 515 516 my $config_file = "$tmpdir/ifversion.conf"; 517 my $pid_file = File::Spec->rel2abs("$tmpdir/ifversion.pid"); 518 my $scoreboard_file = File::Spec->rel2abs("$tmpdir/ifversion.scoreboard"); 519 520 my $log_file = File::Spec->rel2abs('tests.log'); 521 522 my $config = { 523 PidFile => $pid_file, 524 ScoreboardFile => $scoreboard_file, 525 SystemLog => $log_file, 526 527 IfModules => { 528 'mod_delay.c' => { 529 DelayEngine => 'off', 530 }, 531 }, 532 }; 533 534 my ($port, $config_user, $config_group) = config_write($config_file, $config); 535 536 if (open(my $fh, ">> $config_file")) { 537 my $version = get_server_version(); 538 539 print $fh <<EOC; 540<IfVersion = /\\./> 541 Foo bar 542</IfVersion> 543EOC 544 unless (close($fh)) { 545 die("Can't write $config_file: $!"); 546 } 547 548 } else { 549 die("Can't open $config_file: $!"); 550 } 551 552 server_start($config_file); 553 554 eval { server_stop($pid_file) }; 555 unless ($@) { 556 die("Server started unexpectedly"); 557 } 558 559 unlink($log_file); 560} 561 562sub ifversion_skip_section { 563 my $self = shift; 564 my $tmpdir = $self->{tmpdir}; 565 566 my $config_file = "$tmpdir/ifversion.conf"; 567 my $pid_file = File::Spec->rel2abs("$tmpdir/ifversion.pid"); 568 my $scoreboard_file = File::Spec->rel2abs("$tmpdir/ifversion.scoreboard"); 569 570 my $log_file = File::Spec->rel2abs('tests.log'); 571 572 my $config = { 573 PidFile => $pid_file, 574 ScoreboardFile => $scoreboard_file, 575 SystemLog => $log_file, 576 577 IfModules => { 578 'mod_delay.c' => { 579 DelayEngine => 'off', 580 }, 581 }, 582 }; 583 584 my ($port, $config_user, $config_group) = config_write($config_file, $config); 585 586 if (open(my $fh, ">> $config_file")) { 587 my $version = get_server_version(); 588 589 print $fh <<EOC; 590<IfVersion != $version> 591 Foo bar 592 Baz quxx 593</IfVersion> 594EOC 595 unless (close($fh)) { 596 die("Can't write $config_file: $!"); 597 } 598 599 } else { 600 die("Can't open $config_file: $!"); 601 } 602 603 server_start($config_file); 604 605 # Give the server time to start up 606 sleep(2); 607 608 server_stop($pid_file); 609 610 unlink($log_file); 611} 612 613sub ifversion_major_only { 614 my $self = shift; 615 my $tmpdir = $self->{tmpdir}; 616 617 my $config_file = "$tmpdir/ifversion.conf"; 618 my $pid_file = File::Spec->rel2abs("$tmpdir/ifversion.pid"); 619 my $scoreboard_file = File::Spec->rel2abs("$tmpdir/ifversion.scoreboard"); 620 621 my $log_file = File::Spec->rel2abs('tests.log'); 622 623 my $config = { 624 PidFile => $pid_file, 625 ScoreboardFile => $scoreboard_file, 626 SystemLog => $log_file, 627 628 IfModules => { 629 'mod_delay.c' => { 630 DelayEngine => 'off', 631 }, 632 }, 633 }; 634 635 my ($port, $config_user, $config_group) = config_write($config_file, $config); 636 637 if (open(my $fh, ">> $config_file")) { 638 my $version = get_server_version(); 639 640 print $fh <<EOC; 641<IfVersion < 10> 642 Foo bar 643</IfVersion> 644EOC 645 unless (close($fh)) { 646 die("Can't write $config_file: $!"); 647 } 648 649 } else { 650 die("Can't open $config_file: $!"); 651 } 652 653 server_start($config_file); 654 655 eval { server_stop($pid_file) }; 656 unless ($@) { 657 die("Server started unexpectedly"); 658 } 659 660 unlink($log_file); 661} 662 663sub ifversion_major_minor_only { 664 my $self = shift; 665 my $tmpdir = $self->{tmpdir}; 666 667 my $config_file = "$tmpdir/ifversion.conf"; 668 my $pid_file = File::Spec->rel2abs("$tmpdir/ifversion.pid"); 669 my $scoreboard_file = File::Spec->rel2abs("$tmpdir/ifversion.scoreboard"); 670 671 my $log_file = File::Spec->rel2abs('tests.log'); 672 673 my $config = { 674 PidFile => $pid_file, 675 ScoreboardFile => $scoreboard_file, 676 SystemLog => $log_file, 677 678 IfModules => { 679 'mod_delay.c' => { 680 DelayEngine => 'off', 681 }, 682 }, 683 }; 684 685 my ($port, $config_user, $config_group) = config_write($config_file, $config); 686 687 if (open(my $fh, ">> $config_file")) { 688 my $version = get_server_version(); 689 690 print $fh <<EOC; 691<IfVersion < 10.11> 692 Foo bar 693</IfVersion> 694EOC 695 unless (close($fh)) { 696 die("Can't write $config_file: $!"); 697 } 698 699 } else { 700 die("Can't open $config_file: $!"); 701 } 702 703 server_start($config_file); 704 705 eval { server_stop($pid_file) }; 706 unless ($@) { 707 die("Server started unexpectedly"); 708 } 709 710 unlink($log_file); 711} 712 7131; 714