011_infinite_loop.t   [plain text]


#!/usr/bin/perl

use strict;
use warnings;

use Test::More;
use Algorithm::C3; # we already did use_ok 10 times by now..

plan skip_all => "Your system has no SIGALRM" if !exists $SIG{ALRM};
plan tests => 8;

=pod

These are like the 010_complex_merge_classless test,
but an infinite loop has been made in the heirarchy,
to test that we can fail cleanly instead of going
into an infinite loop

=cut

my @loopies = (
    { #1
        k => [qw(j i)],
        j => [qw(f)],
        i => [qw(h f)],
        h => [qw(g)],
        g => [qw(d)],
        f => [qw(e)],
        e => [qw(f)],
        d => [qw(a b c)],
        c => [],
        b => [],
        a => [],
    },
    { #2
        k => [qw(j i)],
        j => [qw(f)],
        i => [qw(h f)],
        h => [qw(g)],
        g => [qw(d)],
        f => [qw(e)],
        e => [qw(d)],
        d => [qw(a b c)],
        c => [qw(f)],
        b => [],
        a => [],
    },
    { #3
        k => [qw(j i)],
        j => [qw(f)],
        i => [qw(h f)],
        h => [qw(g)],
        g => [qw(d)],
        f => [qw(e)],
        e => [qw(d)],
        d => [qw(a b c)],
        c => [],
        b => [],
        a => [qw(k)],
    },
    { #4
        k => [qw(j i)],
        j => [qw(f k)],
        i => [qw(h f)],
        h => [qw(g)],
        g => [qw(d)],
        f => [qw(e)],
        e => [qw(d)],
        d => [qw(a b c)],
        c => [],
        b => [],
        a => [],
    },
    { #5
        k => [qw(j i)],
        j => [qw(f)],
        i => [qw(h f)],
        h => [qw(k g)],
        g => [qw(d)],
        f => [qw(e)],
        e => [qw(d)],
        d => [qw(a b c)],
        c => [],
        b => [],
        a => [],
    },
    { #6
        k => [qw(j i)],
        j => [qw(f)],
        i => [qw(h f)],
        h => [qw(g)],
        g => [qw(d)],
        f => [qw(e)],
        e => [qw(d)],
        d => [qw(a b c)],
        c => [],
        b => [qw(b)],
        a => [],
    },
    { #7
        k => [qw(k j i)],
        j => [qw(f)],
        i => [qw(h f)],
        h => [qw(g)],
        g => [qw(d)],
        f => [qw(e)],
        e => [qw(d)],
        d => [qw(a b c)],
        c => [],
        b => [],
        a => [],
    },
    { #7
        k => [qw(j i)],
        j => [qw(f)],
        i => [qw(h f)],
        h => [qw(g)],
        g => [qw(d)],
        f => [qw(e)],
        e => [qw(d)],
        d => [qw(a h b c)],
        c => [],
        b => [],
        a => [],
    },
);

foreach my $loopy (@loopies) {
    eval {
        local $SIG{ALRM} = sub { die "ALRMTimeout" };
        alarm(3);
        Algorithm::C3::merge('k', sub {
            return @{ $loopy->{ $_[0] } };
        });
    };

    if(my $err = $@) {
        if($err =~ /ALRMTimeout/) {
            ok(0, "Loop terminated by SIGALRM");
        }
        elsif($err =~ /Infinite loop detected/) {
            ok(1, "Graceful exception thrown");
        }
        else {
            ok(0, "Unrecognized exception: $err");
        }
    }
    else {
        ok(0, "Infinite loop apparently succeeded???");
    }
}