#!perl -w use strict; use warnings; use Qpsmtpd::Constants; sub register_tests { my $self = shift; $self->register_test('test_get_rcpt_host'); $self->register_test('test_is_in_rcpthosts'); $self->register_test('test_is_in_morercpthosts'); $self->register_test('test_hook_rcpt'); } sub test_hook_rcpt { my $self = shift; my $transaction = $self->qp->transaction; my $address = Qpsmtpd::Address->parse(''); my ($r, $mess) = $self->hook_rcpt( $transaction, $address ); cmp_ok( $r, '==', OK, "localhost"); $address = Qpsmtpd::Address->parse(''); ($r, $mess) = $self->hook_rcpt( $transaction, $address ); cmp_ok( $r, '==', DENY, "example.com"); $self->qp->connection->relay_client(1); ($r, $mess) = $self->hook_rcpt( $transaction, $address ); cmp_ok( $r, '==', OK, "example.com"); $self->qp->connection->relay_client(0); }; sub test_is_in_rcpthosts { my $self = shift; my @hosts = $self->qp->config('rcpthosts'); my $host = $hosts[0]; if ( $host ) { ok( $self->is_in_rcpthosts( $host ), "is_in_rcpthosts, $host"); } else { ok(1, "is_in_rcpthosts (skip, no entries)" ); }; ok( $self->is_in_rcpthosts( 'localhost' ), "is_in_rcpthosts +"); ok( ! $self->is_in_rcpthosts( 'example.com' ), "is_in_rcpthosts -"); }; sub test_is_in_morercpthosts { my $self = shift; my $ref = $self->qp->config('morercpthosts', 'map'); my ($domain) = keys %$ref; if ( $domain ) { ok( $self->is_in_morercpthosts( $domain ), "$domain"); } else { ok(1, "is_in_morercpthosts (skip, no entries)" ); }; ok( ! $self->is_in_morercpthosts( 'example.com' ), "missing -"); }; sub test_get_rcpt_host { my $self = shift; my $address = Qpsmtpd::Address->parse(''); cmp_ok( $self->get_rcpt_host( $address ), 'eq', 'example.com', "+" ); $address = Qpsmtpd::Address->parse(''); cmp_ok( $self->get_rcpt_host( $address ), 'eq', 'example.com', "+" ); $address = Qpsmtpd::Address->parse(''); cmp_ok( $self->get_rcpt_host( $address ), 'eq', 'example.com', "+" ); $address = Qpsmtpd::Address->parse(''); my $local_hostname = $self->get_rcpt_host( $address ); if ( $local_hostname eq 'some.host.example.org' ) { cmp_ok( $self->get_rcpt_host( $address ), 'eq', 'some.host.example.org', "special postmaster +" ); } else { ok( 1, "special postmaster + ($local_hostname)" ); } # I think this is a bug. Qpsmtpd::Address fails to parse $address = Qpsmtpd::Address->parse(''); ok( ! $self->get_rcpt_host( $address ), "missing host" ); $address = Qpsmtpd::Address->parse('<>'); ok( ! $self->get_rcpt_host( $address ), "null recipient" ); $address = Qpsmtpd::Address->parse('<@example.com>'); ok( ! $self->get_rcpt_host( $address ), "missing user" ); };