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