1#!./perl 2 3use strict; 4use warnings; 5BEGIN { 6 unless (-d 'blib') { 7 chdir 't' if -d 't'; 8 @INC = '../lib'; 9 } 10} 11use utf8; 12use open qw( :utf8 :std ); 13 14require './test.pl'; 15 16plan(skip_all => "Your system has no SIGALRM") if !exists $SIG{ALRM}; 17plan(tests => 8); 18 19require mro; 20 21=pod 22 23These are like the 010_complex_merge_classless test, 24but an infinite loop has been made in the heirarchy, 25to test that we can fail cleanly instead of going 26into an infinite loop 27 28=cut 29 30# initial setup, everything sane 31{ 32 package ƙ; 33 use mro 'c3'; 34 our @ISA = qw/ᶨ ィ/; 35 package ᶨ; 36 use mro 'c3'; 37 our @ISA = qw/f/; 38 package ィ; 39 use mro 'c3'; 40 our @ISA = qw/ʰ f/; 41 package ʰ; 42 use mro 'c3'; 43 our @ISA = qw/ᶢ/; 44 package ᶢ; 45 use mro 'c3'; 46 our @ISA = qw/ᛞ/; 47 package f; 48 use mro 'c3'; 49 our @ISA = qw/ǝ/; 50 package ǝ; 51 use mro 'c3'; 52 our @ISA = qw/ᛞ/; 53 package ᛞ; 54 use mro 'c3'; 55 our @ISA = qw/Ạ B ʗ/; 56 package ʗ; 57 use mro 'c3'; 58 our @ISA = qw//; 59 package B; 60 use mro 'c3'; 61 our @ISA = qw//; 62 package Ạ; 63 use mro 'c3'; 64 our @ISA = qw//; 65} 66 67# A series of 8 aberations that would cause infinite loops, 68# each one undoing the work of the previous 69my @loopies = ( 70 sub { @ǝ::ISA = qw/f/ }, 71 sub { @ǝ::ISA = qw/ᛞ/; @ʗ::ISA = qw/f/ }, 72 sub { @ʗ::ISA = qw//; @Ạ::ISA = qw/ƙ/ }, 73 sub { @Ạ::ISA = qw//; @ᶨ::ISA = qw/f ƙ/ }, 74 sub { @ᶨ::ISA = qw/f/; @ʰ::ISA = qw/ƙ ᶢ/ }, 75 sub { @ʰ::ISA = qw/ᶢ/; @B::ISA = qw/B/ }, 76 sub { @B::ISA = qw//; @ƙ::ISA = qw/ƙ ᶨ ィ/ }, 77 sub { @ƙ::ISA = qw/ᶨ ィ/; @ᛞ::ISA = qw/Ạ ʰ B ʗ/ }, 78); 79 80foreach my $loopy (@loopies) { 81 eval { 82 local $SIG{ALRM} = sub { die "ALRMTimeout" }; 83 alarm(3); 84 $loopy->(); 85 mro::get_linear_isa('ƙ', 'c3'); 86 }; 87 88 if(my $err = $@) { 89 if($err =~ /ALRMTimeout/) { 90 ok(0, "Loop terminated by SIGALRM"); 91 } 92 elsif($err =~ /Recursive inheritance detected/) { 93 ok(1, "Graceful exception thrown"); 94 } 95 else { 96 ok(0, "Unrecognized exception: $err"); 97 } 98 } 99 else { 100 ok(0, "Infinite loop apparently succeeded???"); 101 } 102} 103