#!perl -w

use strict;
use warnings;

use Qpsmtpd::Constants;

sub register_tests {
    my $self = shift;

    $self->register_test('test_relay_only', 2);
    $self->register_test('test_is_octet_match', 3);
    $self->register_test('test_is_in_cidr_block', 4);
    $self->register_test('test_is_in_norelayclients', 5);
}

sub test_relay_only {
    my $self = shift;

    $self->qp->connection->relay_client(0);
    my $r = $self->relay_only();
    cmp_ok( $r, '==', DENY, "relay_only -");

    $self->qp->connection->relay_client(1);
    $r = $self->relay_only();
    cmp_ok( $r, '==', OK, "relay_only +");

    $self->qp->connection->relay_client(0);
};

sub test_is_octet_match {
    my $self = shift;

    $self->populate_relayclients();

    $self->qp->connection->remote_ip('192.0.1.1');
    ok( $self->is_octet_match(), "match, +");

    $self->qp->connection->remote_ip('192.51.1.1');
    ok( ! $self->is_octet_match(), "nope, -");

    $self->qp->connection->remote_ip('203.0.113.0');
    ok( ! $self->is_octet_match(), "nope, -");
};

sub test_is_in_cidr_block {
    my $self = shift;

    $self->qp->connection->remote_ip('192.0.1.1');
    $self->{_cidr_blocks} = [ '192.0.1.0/24' ];
    ok( $self->is_in_cidr_block(), "match, +" );

    $self->{_cidr_blocks} = [ '192.0.0.0/24' ];
    ok( ! $self->is_in_cidr_block(), "nope, -" );


    $self->qp->connection->remote_ip('fdda:b13d:e431:ae06:00a1::');
    $self->{_cidr_blocks} = [ 'fdda:b13d:e431:ae06::/64' ];
    ok( $self->is_in_cidr_block(), "match, +" );

    $self->{_cidr_blocks} = [ 'fdda:b13d:e431:be17::' ];
    ok( ! $self->is_in_cidr_block(), "nope, -" );
};

sub test_is_in_norelayclients {
    my $self = shift;

    my @matches = qw/ 192.0.99.5 192.0.98.1 192.0.98.255 /;
    my @false = qw/ 192.0.99.7 192.0.109.7 /;

    foreach ( @matches ) {
        $self->qp->connection->remote_ip($_);
        ok( $self->is_in_norelayclients(), "match, + ($_)");
    };

    foreach ( @false ) {
        $self->qp->connection->remote_ip($_);
        ok( ! $self->is_in_norelayclients(), "match, - ($_)");
    };
};