comparison mail_resolver.t @ 362:8ca9c75c97d2

Tests: more resolver tests. - Uncompressed answer section. - TTL handling in CNAME + A combined answer. - Case-insensitive lookups. - PTR type checking in RR for address to name resolving.
author Sergey Kandaurov <pluknet@nginx.com>
date Mon, 16 Dec 2013 18:59:16 +0400
parents aac06d3bdc05
children 847ea345becb
comparison
equal deleted inserted replaced
361:aac06d3bdc05 362:8ca9c75c97d2
40 mail { 40 mail {
41 auth_http http://127.0.0.1:8080/mail/auth; 41 auth_http http://127.0.0.1:8080/mail/auth;
42 smtp_auth none; 42 smtp_auth none;
43 server_name locahost; 43 server_name locahost;
44 44
45 # prevent useless resend
46 resolver_timeout 1s;
47
45 server { 48 server {
46 listen 127.0.0.1:8025; 49 listen 127.0.0.1:8025;
47 protocol smtp; 50 protocol smtp;
48 resolver 127.0.0.1:8081 127.0.0.1:8082 127.0.0.1:8083; 51 resolver 127.0.0.1:8081 127.0.0.1:8082 127.0.0.1:8083;
49 } 52 }
57 server { 60 server {
58 listen 127.0.0.1:8028; 61 listen 127.0.0.1:8028;
59 protocol smtp; 62 protocol smtp;
60 resolver 127.0.0.1:8083; 63 resolver 127.0.0.1:8083;
61 64
62 # prevent useless resend
63 resolver_timeout 1s;
64 } 65 }
65 66
66 server { 67 server {
67 listen 127.0.0.1:8029; 68 listen 127.0.0.1:8029;
68 protocol smtp; 69 protocol smtp;
69 resolver 127.0.0.1:8084; 70 resolver 127.0.0.1:8084;
71 }
72
73 server {
74 listen 127.0.0.1:8030;
75 protocol smtp;
76 resolver 127.0.0.1:8085;
77 }
78
79 server {
80 listen 127.0.0.1:8031;
81 protocol smtp;
82 resolver 127.0.0.1:8086;
70 } 83 }
71 } 84 }
72 85
73 http { 86 http {
74 %%TEST_GLOBALS_HTTP%% 87 %%TEST_GLOBALS_HTTP%%
92 } 105 }
93 } 106 }
94 107
95 EOF 108 EOF
96 109
97 $t->run_daemon(\&dns_daemon, 8081, $t); 110 for (8081 .. 8086) {
98 $t->run_daemon(\&dns_daemon, 8082, $t); 111 $t->run_daemon(\&dns_daemon, $_, $t);
99 $t->run_daemon(\&dns_daemon, 8083, $t); 112 }
100 $t->run_daemon(\&dns_daemon, 8084, $t);
101 $t->run(); 113 $t->run();
102 114
103 $t->waitforfile($t->testdir . '/8081'); 115 for (8081 .. 8086) {
104 $t->waitforfile($t->testdir . '/8082'); 116 $t->waitforfile($t->testdir . "/$_");
105 $t->waitforfile($t->testdir . '/8083'); 117 }
106 $t->waitforfile($t->testdir . '/8084'); 118
107 119 $t->plan(7);
108 $t->plan(5);
109 120
110 ############################################################################### 121 ###############################################################################
111 122
112 # PTR 123 # PTR
113 124
190 $s->send('MAIL FROM:<test@example.com> SIZE=100'); 201 $s->send('MAIL FROM:<test@example.com> SIZE=100');
191 $s->read(); 202 $s->read();
192 203
193 $s->send('RCPT TO:<test@example.com>'); 204 $s->send('RCPT TO:<test@example.com>');
194 $s->ok('PTR with CNAME'); 205 $s->ok('PTR with CNAME');
206
207 $s->send('QUIT');
208 $s->read();
209 close $s;
210
211 }
212
213 # uncompressed answer
214
215 TODO: {
216 local $TODO = 'support for uncompressed name in PTR';
217
218 $s = Test::Nginx::SMTP->new(PeerAddr => "127.0.0.1:8030");
219 $s->read();
220 $s->send('EHLO example.com');
221 $s->read();
222 $s->send('MAIL FROM:<test@example.com> SIZE=100');
223 $s->read();
224
225 $s->send('RCPT TO:<test@example.com>');
226 $s->ok('uncompressed PTR');
227
228 $s->send('QUIT');
229 $s->read();
230 close $s;
231
232 }
233
234 TODO: {
235 local $TODO = 'PTR type checking';
236
237 $s = Test::Nginx::SMTP->new(PeerAddr => "127.0.0.1:8031");
238 $s->read();
239 $s->send('EHLO example.com');
240 $s->read();
241 $s->send('MAIL FROM:<test@example.com> SIZE=100');
242 $s->read();
243
244 $s->send('RCPT TO:<test@example.com>');
245 $s->check(qr/TEMPUNAVAIL/, 'PTR type');
195 246
196 $s->send('QUIT'); 247 $s->send('QUIT');
197 $s->read(); 248 $s->read();
198 close $s; 249 close $s;
199 250
253 } elsif ($port == 8084) { 304 } elsif ($port == 8084) {
254 # PTR answered with CNAME 305 # PTR answered with CNAME
255 306
256 push @rdata, rd_name(CNAME, $ttl, 307 push @rdata, rd_name(CNAME, $ttl,
257 '1.1.0.0.127.in-addr.arpa'); 308 '1.1.0.0.127.in-addr.arpa');
309
310 } elsif ($port == 8085) {
311 # uncompressed answer
312
313 push @rdata, pack("(w/a*)6x n2N n(w/a*)3x",
314 ('1', '0', '0', '127', 'in-addr', 'arpa'),
315 PTR, IN, $ttl, 15, ('a', 'example', 'net'));
316
317 } elsif ($port == 8086) {
318 push @rdata, rd_name(CNAME, $ttl, 'a.example.net');
258 } 319 }
259 320
260 } elsif ($name eq '1.1.0.0.127.in-addr.arpa' && $type == PTR) { 321 } elsif ($name eq '1.1.0.0.127.in-addr.arpa' && $type == PTR) {
261 push @rdata, rd_name(PTR, $ttl, 'a.example.net'); 322 push @rdata, rd_name(PTR, $ttl, 'a.example.net');
262 } 323 }
270 my ($type, $ttl, $name) = @_; 331 my ($type, $ttl, $name) = @_;
271 my ($rdlen, @rdname); 332 my ($rdlen, @rdname);
272 333
273 @rdname = split /\./, $name; 334 @rdname = split /\./, $name;
274 $rdlen = length(join '', @rdname) + @rdname + 1; 335 $rdlen = length(join '', @rdname) + @rdname + 1;
275 pack("n3N n(w/a*)* x", 0xc00c, PTR, IN, $ttl, $rdlen, @rdname); 336 pack("n3N n(w/a*)* x", 0xc00c, $type, IN, $ttl, $rdlen, @rdname);
276 } 337 }
277 338
278 sub rd_addr { 339 sub rd_addr {
279 my ($ttl, $addr) = @_; 340 my ($ttl, $addr) = @_;
280 341