1package ProFTPD::TestSuite::Child;
2
3use base qw(Test::Unit::TestCase);
4use strict;
5
6use Carp;
7use File::Path qw(mkpath rmtree);
8use POSIX qw(:sys_wait_h);
9
10use ProFTPD::TestSuite::Utils qw(:testsuite);
11
12my $processes = {};
13
14sub sig_chld {
15  my $child;
16
17  while (($child = waitpid(-1, 0)) > 0) {
18    $processes->{$child} = ($? >> 8);
19  }
20
21  $SIG{CHLD} = \&sig_chld;
22}
23
24sub handle_sigchld {
25  my $self = shift;
26  $SIG{CHLD} = \&sig_chld;
27}
28
29sub assert_child_ok {
30  my $self = shift;
31  my $pid = shift;
32
33  my ($pkg, $file, $lineno, $func, @rest) = caller(1);
34
35  $self->assert($processes->{$pid} == 0,
36    "Child test process $pid failed in $func (line $lineno) [see above for possible errors]");
37}
38
39sub assert_transfer_ok {
40  my $self = shift;
41  my $resp_code = shift;
42  my $resp_msg = shift;
43  my $aborted = shift;
44  $aborted = 0 unless $aborted;
45
46  if ($resp_code == 226) {
47    my $expected = "Transfer complete";
48    if ($aborted) {
49      $expected = "Abort successful";
50    }
51
52    if ($expected ne $resp_msg) {
53      croak("Expected response message '$expected', got '$resp_msg'");
54    }
55
56  } elsif ($resp_code == 150) {
57    my $expected = "Opening .*? mode data connection";
58    if ($resp_msg !~ /$expected/) {
59      croak("Expected response message '$expected', got '$resp_msg'");
60    }
61
62  } else {
63    croak("Expected response code 150 or 226, got $resp_code");
64  }
65}
66
67sub set_up {
68  my $self = shift;
69
70  # Create temporary scratch dir
71  $self->{tmpdir} = testsuite_get_tmp_dir();
72}
73
74sub tear_down {
75  my $self = shift;
76
77  # Remove temporary scratch dir
78  if ($self->{tmpdir} &&
79      !$ENV{KEEP_TMPFILES}) {
80    eval { rmtree($self->{tmpdir}) };
81  }
82}
83
841;
85