1#!./perl -w 2$|=1; 3BEGIN { 4 if($ENV{PERL_CORE}) { 5 chdir 't' if -d 't'; 6 @INC = '../lib'; 7 } 8 require Config; import Config; 9 if ($Config{'extensions'} !~ /\bOpcode\b/ && $Config{'osname'} ne 'VMS') { 10 print "1..0\n"; 11 exit 0; 12 } 13 14} 15 16# Tests Todo: 17# 'main' as root 18 19package test; # test from somewhere other than main 20 21use vars qw($bar); 22 23use Opcode 1.00, qw(opdesc opset opset_to_ops opset_to_hex 24 opmask_add full_opset empty_opset opcodes opmask define_optag); 25 26use Safe 1.00; 27 28my $last_test; # initalised at end 29print "1..$last_test\n"; 30 31my $t = 1; 32my $cpt; 33# create and destroy some automatic Safe compartments first 34$cpt = new Safe or die; 35$cpt = new Safe or die; 36$cpt = new Safe or die; 37 38$cpt = new Safe "Root" or die; 39 40foreach(1..3) { 41 $foo = 42; 42 43 $cpt->share(qw($foo)); 44 45 print ${$cpt->varglob('foo')} == 42 ? "ok $t\n" : "not ok $t\n"; $t++; 46 47 ${$cpt->varglob('foo')} = 9; 48 49 print $foo == 9 ? "ok $t\n" : "not ok $t\n"; $t++; 50 51 print $cpt->reval('$foo') == 9 ? "ok $t\n" : "not ok $t\n"; $t++; 52 # check 'main' has been changed: 53 print $cpt->reval('$::foo') == 9 ? "ok $t\n" : "not ok $t\n"; $t++; 54 print $cpt->reval('$main::foo') == 9 ? "ok $t\n" : "not ok $t\n"; $t++; 55 # check we can't see our test package: 56 print $cpt->reval('$test::foo') ? "not ok $t\n" : "ok $t\n"; $t++; 57 print $cpt->reval('${"test::foo"}') ? "not ok $t\n" : "ok $t\n"; $t++; 58 59 $cpt->erase; # erase the compartment, e.g., delete all variables 60 61 print $cpt->reval('$foo') ? "not ok $t\n" : "ok $t\n"; $t++; 62 63 # Note that we *must* use $cpt->varglob here because if we used 64 # $Root::foo etc we would still see the original values! 65 # This seems to be because the compiler has created an extra ref. 66 67 print ${$cpt->varglob('foo')} ? "not ok $t\n" : "ok $t\n"; $t++; 68} 69 70print "ok $last_test\n"; 71BEGIN { $last_test = 28 } 72