Mercurial > hg > nginx-tests
annotate lib/Test/Nginx/SMTP.pm @ 45:d68b85def521
Tests: use 127.0.0.1 instead of localhost.
Name 'localhost' is ambiguous if ipv6 present on system.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Sun, 02 Nov 2008 15:01:41 +0300 |
parents | daa295331acd |
children | b5b4271554b0 |
rev | line source |
---|---|
14
d4b74207a627
Tests: refactor common functions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
12
diff
changeset
|
1 package Test::Nginx::SMTP; |
5
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
2 |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
3 # (C) Maxim Dounin |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
4 |
14
d4b74207a627
Tests: refactor common functions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
12
diff
changeset
|
5 # Module for nginx smtp tests. |
5
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
6 |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
7 ############################################################################### |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
8 |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
9 use warnings; |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
10 use strict; |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
11 |
14
d4b74207a627
Tests: refactor common functions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
12
diff
changeset
|
12 use Test::More qw//; |
5
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
13 use IO::Socket; |
7
9eb509695651
Tests: drop our own CRLF constant, use Socket's one instead.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6
diff
changeset
|
14 use Socket qw/ CRLF /; |
5
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
15 |
14
d4b74207a627
Tests: refactor common functions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
12
diff
changeset
|
16 use Test::Nginx; |
5
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
17 |
14
d4b74207a627
Tests: refactor common functions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
12
diff
changeset
|
18 use base qw/ IO::Socket::INET /; |
12
d19146b30334
Tests: move write_file() into _common.pm.
Maxim Dounin <mdounin@mdounin.ru>
parents:
8
diff
changeset
|
19 |
14
d4b74207a627
Tests: refactor common functions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
12
diff
changeset
|
20 sub new { |
d4b74207a627
Tests: refactor common functions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
12
diff
changeset
|
21 my $class = shift; |
5
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
22 |
14
d4b74207a627
Tests: refactor common functions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
12
diff
changeset
|
23 my $self = return $class->SUPER::new( |
5
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
24 Proto => "tcp", |
45
d68b85def521
Tests: use 127.0.0.1 instead of localhost.
Maxim Dounin <mdounin@mdounin.ru>
parents:
44
diff
changeset
|
25 PeerAddr => "127.0.0.1:8025", |
5
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
26 @_ |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
27 ) |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
28 or die "Can't connect to nginx: $!\n"; |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
29 |
14
d4b74207a627
Tests: refactor common functions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
12
diff
changeset
|
30 $self->autoflush(1); |
5
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
31 |
14
d4b74207a627
Tests: refactor common functions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
12
diff
changeset
|
32 return $self; |
5
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
33 } |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
34 |
14
d4b74207a627
Tests: refactor common functions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
12
diff
changeset
|
35 sub send { |
d4b74207a627
Tests: refactor common functions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
12
diff
changeset
|
36 my ($self, $cmd) = @_; |
5
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
37 log_out($cmd); |
14
d4b74207a627
Tests: refactor common functions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
12
diff
changeset
|
38 $self->print($cmd . CRLF); |
5
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
39 } |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
40 |
14
d4b74207a627
Tests: refactor common functions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
12
diff
changeset
|
41 sub read { |
d4b74207a627
Tests: refactor common functions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
12
diff
changeset
|
42 my ($self) = @_; |
5
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
43 eval { |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
44 alarm(2); |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
45 local $SIG{ALRM} = sub { die "alarm\n" }; |
14
d4b74207a627
Tests: refactor common functions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
12
diff
changeset
|
46 while (<$self>) { |
5
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
47 log_in($_); |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
48 next if m/^\d\d\d-/; |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
49 last; |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
50 } |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
51 alarm(0); |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
52 }; |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
53 alarm(0); |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
54 if ($@) { |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
55 return undef; |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
56 } |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
57 return $_; |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
58 } |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
59 |
14
d4b74207a627
Tests: refactor common functions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
12
diff
changeset
|
60 sub check { |
d4b74207a627
Tests: refactor common functions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
12
diff
changeset
|
61 my ($self, $regex, $name) = @_; |
d4b74207a627
Tests: refactor common functions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
12
diff
changeset
|
62 Test::More::like($self->read(), $regex, $name); |
5
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
63 } |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
64 |
14
d4b74207a627
Tests: refactor common functions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
12
diff
changeset
|
65 sub ok { |
d4b74207a627
Tests: refactor common functions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
12
diff
changeset
|
66 my $self = shift; |
d4b74207a627
Tests: refactor common functions.
Maxim Dounin <mdounin@mdounin.ru>
parents:
12
diff
changeset
|
67 $self->check(qr/^2\d\d /, @_); |
5
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
68 } |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
69 |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
70 ############################################################################### |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
71 |
26
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
72 sub smtp_test_daemon { |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
73 my $server = IO::Socket::INET->new( |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
74 Proto => 'tcp', |
44
daa295331acd
Tests: don't bind backend daemons to *, use 127.0.0.1 instead.
Maxim Dounin <mdounin@mdounin.ru>
parents:
26
diff
changeset
|
75 LocalAddr => '127.0.0.1:8026', |
26
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
76 Listen => 5, |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
77 Reuse => 1 |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
78 ) |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
79 or die "Can't create listening socket: $!\n"; |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
80 |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
81 while (my $client = $server->accept()) { |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
82 $client->autoflush(1); |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
83 print $client "220 fake esmtp server ready" . CRLF; |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
84 |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
85 while (<$client>) { |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
86 if (/^quit/i) { |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
87 print $client '221 quit ok' . CRLF; |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
88 } elsif (/^(ehlo|helo)/i) { |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
89 print $client '250 hello ok' . CRLF; |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
90 } elsif (/^rset/i) { |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
91 print $client '250 rset ok' . CRLF; |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
92 } elsif (/^mail from:[^@]+$/i) { |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
93 print $client '500 mail from error' . CRLF; |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
94 } elsif (/^mail from:/i) { |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
95 print $client '250 mail from ok' . CRLF; |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
96 } elsif (/^rcpt to:[^@]+$/i) { |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
97 print $client '500 rcpt to error' . CRLF; |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
98 } elsif (/^rcpt to:/i) { |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
99 print $client '250 rcpt to ok' . CRLF; |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
100 } else { |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
101 print $client "500 unknown command" . CRLF; |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
102 } |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
103 } |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
104 |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
105 close $client; |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
106 } |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
107 } |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
108 |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
109 ############################################################################### |
0880e0fafde4
Tests: implement smtp test backend and use it.
Maxim Dounin <mdounin@mdounin.ru>
parents:
14
diff
changeset
|
110 |
5
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
111 1; |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
112 |
4d75bdb05ecf
Tests: some generic code and ssi tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
113 ############################################################################### |