# New Ticket Created by James Keenan # Please include the string: [perl #44493] # in the subject line of all future correspondence about this issue. # <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=44493 >
--- osname= linux osvers= 2.6.18.3 arch= i486-linux-gnu-thread-multi cc= cc --- Flags: category=core severity=medium ack=no --- Several weeks back method slurp_temp() was added to lib/Parrot/Configure/Data.pm and then subsequently used in Configure.pl. No unit tests were provided. I've been trying to boost test coverage in the reconfigure/ branch and finally got around to examining slurp_temp(). I noted a slight difference between slurp() and slurp_temp(). The former stated 'use Parrot::Config::Generated', while the latter simply said 'use Parrot::Config'. The former is only created during configuration; the latter is MANIFEST-listed. So in the former the 'eval' return value could meaningfully be either defined or undefined, whereas in the latter it was all but guaranteed to be defined. The patch attached corrects Parrot::Configure::Data::slurp_temp, corrects two existing test files, and adds one new test file in t/postconfigure. I will apply this patch to trunk within a couple of days unless someone objects. Thank you very much. kid 51 Index: MANIFEST =================================================================== --- MANIFEST (revision 20550) +++ MANIFEST (working copy) @@ -1,7 +1,7 @@ # ex: set ro: # $Id$ # -# generated by tools/dev/mk_manifest_and_skip.pl Tue Aug 7 23:41:36 2007 UT +# generated by tools/dev/mk_manifest_and_skip.pl Tue Aug 7 23:56:32 2007 UT # # See tools/dev/install_files.pl for documentation on the # format of this file. @@ -3151,6 +3151,7 @@ t/postconfigure/03-revision_no_DEVELOPING.t [] t/postconfigure/04-revision.t [] t/postconfigure/05-trace.t [] +t/postconfigure/06-data_slurp_temp.t [] t/run/README [] t/run/exit.t [] t/run/options.t [] Index: lib/Parrot/Configure/Data.pm =================================================================== --- lib/Parrot/Configure/Data.pm (revision 20550) +++ lib/Parrot/Configure/Data.pm (working copy) @@ -203,7 +203,7 @@ my $self = shift; my $res = eval <<EVAL_CONFIG_TEMP; no strict; -use Parrot::Config; +use Parrot::Config::Generated; \\%PConfig_Temp; EVAL_CONFIG_TEMP Index: t/configure/004-configure.t =================================================================== --- t/configure/004-configure.t (revision 20550) +++ t/configure/004-configure.t (working copy) @@ -6,7 +6,7 @@ use strict; use warnings; -use Test::More tests => 30; +use Test::More tests => 31; use Carp; use lib qw( . lib ../lib ../../lib ); use Parrot::BuildUtil; @@ -98,9 +98,25 @@ eval { $conf->data()->slurp(); }; like($@, qr/You cannot use --step until you have completed the full configure process/, - "Got expected error message when using --step option without prior completed configuration"); + "Got expected error message when using --step option and slurp() without prior completed configuration"); } +$res = eval "no strict; use Parrot::Config::Generated; \\%PConfig_Temp"; +SKIP: { + my $reason = <<REASON; +If you have already completed configuration, +you can call Parrot::Configure::Data::slurp_temp(). +But here you are testing for that method's failure. +REASON + + skip $reason, 1 if defined $res; + + eval { $conf->data()->slurp_temp(); }; + like($@, + qr/You cannot use --step until you have completed the full configure process/, + "Got expected error message when using --step option and slurp_temp() without prior completed configuration"); +} + pass("Completed all tests in $0"); ################### DOCUMENTATION ################### Index: t/postconfigure/02-data_slurp.t =================================================================== --- t/postconfigure/02-data_slurp.t (revision 20550) +++ t/postconfigure/02-data_slurp.t (working copy) @@ -85,7 +85,7 @@ is($conf->options->{c}->{debugging}, 1, "command-line option '--debugging' has been stored in object"); -my $res = eval "no strict; use Parrot::Config; \\%PConfig"; +my $res = eval "no strict; use Parrot::Config::Generated; \\%PConfig"; SKIP: { my $reason = <<REASON; If you have already completed configuration, Index: t/postconfigure/06-data_slurp_temp.t =================================================================== --- t/postconfigure/06-data_slurp_temp.t (revision 0) +++ t/postconfigure/06-data_slurp_temp.t (revision 0) @@ -0,0 +1,150 @@ +#! perl +# Copyright (C) 2007, The Perl Foundation. +# $Id: 06-data_slurp_temp.t 20500 2007-08-05 20:49:59Z jkeenan $ +# 06-data_slurp_temp.t + +use strict; +use warnings; + +use Test::More tests => 33; +use Carp; +use lib qw( . lib ../lib ../../lib ); +use Parrot::BuildUtil; +use Parrot::Configure; +use Parrot::Configure::Options qw( process_options ); +use_ok('Parrot::Configure::Step::List', qw| + get_steps_list +| ); +use Parrot::IO::Capture::Mini; + +my $parrot_version = Parrot::BuildUtil::parrot_version(); +like($parrot_version, qr/\d+\.\d+\.\d+/, + "Parrot version is in 3-part format"); + +$| = 1; +is($|, 1, "output autoflush is set"); + +my $args = process_options( { + argv => [ q{--step=gen::makefiles}, q{--target=Makefile} ], + script => $0, + parrot_version => $parrot_version, + svnid => '$Id: 02-data_slurp.t 20550 2007-08-07 23:46:54Z jkeenan $', +} ); +ok(defined $args, "process_options returned successfully"); +my %args = %$args; + +my $conf = Parrot::Configure->new; +ok(defined $conf, "Parrot::Configure->new() returned okay"); +isa_ok($conf, "Parrot::Configure"); + +my $newconf = Parrot::Configure->new; +ok(defined $newconf, "Parrot::Configure->new() returned okay"); +isa_ok($newconf, "Parrot::Configure"); +is($conf, $newconf, "Parrot::Configure object is a singleton"); + +# Since these tests peek into the Parrot::Configure object, they will break if +# the structure of that object changes. We retain them for now to delineate +# our progress in testing the object. +foreach my $k (qw| steps options data |) { + ok(defined $conf->$k, "Parrot::Configure object has $k key"); +} +is(ref($conf->steps), q{ARRAY}, + "Parrot::Configure object 'steps' key is array reference"); +is(scalar @{$conf->steps}, 0, + "Parrot::Configure object 'steps' key holds empty array reference"); +foreach my $k (qw| options data |) { + isa_ok($conf->$k, "Parrot::Configure::Data"); +} + +can_ok("Parrot::Configure", qw| data |); +can_ok("Parrot::Configure", qw| options |); +can_ok("Parrot::Configure", qw| steps |); +can_ok("Parrot::Configure", qw| add_step |); +can_ok("Parrot::Configure", qw| add_steps |); +can_ok("Parrot::Configure", qw| run_single_step |); +can_ok("Parrot::Configure", qw| runsteps |); +can_ok("Parrot::Configure", qw| _run_this_step |); + +$conf->add_step($args->{step}); +my @confsteps = @{$conf->steps}; +isnt(scalar @confsteps, 0, + "Parrot::Configure object 'steps' key holds non-empty array reference"); +my $nontaskcount = 0; +foreach my $k (@confsteps) { + $nontaskcount++ unless $k->isa("Parrot::Configure::Task"); +} +is($nontaskcount, 0, "Each step is a Parrot::Configure::Task object"); + +$conf->options->set(%{$args}); +is($conf->options->{c}->{step}, 'gen::makefiles', + "command-line option '--step=gen::makefiles' has been stored in object"); +is($conf->options->{c}->{target}, 'Makefile', + "command-line option '--target=Makefiles' has been stored in object"); +is($conf->options->{c}->{debugging}, 1, + "command-line option '--debugging' has been stored in object"); + +my $res = eval "no strict; use Parrot::Config::Generated; \\%PConfig"; +SKIP: { + my $reason = <<REASON; +If you have already completed configuration, +you can call Parrot::Configure::Data::slurp(). +You appear not to have completed configuration; +hence, two tests are skipped. +REASON + + skip $reason, 2 unless defined $res; + + eval { $conf->data()->slurp(); }; + ok( (defined $@) && (! $@), "Parrot::Configure::slurp() succeeded"); + + eval { $conf->data()->slurp_temp(); }; + ok( (defined $@) && (! $@), "Parrot::Configure::slurp_temp() succeeded"); + + my $tie_out = tie *STDOUT, "Parrot::IO::Capture::Mini" + or croak "Unable to tie"; + my $ret = $conf->run_single_step( $args->{step} ); + my @more_lines = $tie_out->READLINE; + ok( (defined $@) && (! $@), + "Parrot::Configure::run_single_step() succeeded"); +} + +pass("Completed all tests in $0"); + +################### DOCUMENTATION ################### + +=head1 NAME + +06-data_slurp_temp.t - test Parrot::Configure::Data::slurp() once configuration has been completed + +=head1 SYNOPSIS + + % prove t/postconfigure/06-data_slurp_temp.t + +=head1 DESCRIPTION + +The files in this directory test functionality used by F<Configure.pl>. +Certain of the modules C<use>d by F<Configure.pl> have functionality which is +only meaningful I<after> F<Configure.pl> has actually been run and +Parrot::Config::Generated has been created. So certain tests need to be run +when your Parrot filesystem is in a "pre-F<make>, post-F<Configure.pl>" state. + +The tests in this file mimic the functionality of F<tools/dev/reconfigure.pl> +and test C<Parrot::Configure::Data::slurp()>. What is 'slurped' here is an +already created C<%Parrot::Config::PConfig>. + +=head1 AUTHOR + +James E Keenan + +=head1 SEE ALSO + +Parrot::Configure, F<Configure.pl>. + +=cut + +# Local Variables: +# mode: cperl +# cperl-indent-level: 4 +# fill-column: 100 +# End: +# vim: expandtab shiftwidth=4: --- Summary of my parrot 0.4.14 (r20550) configuration: configdate='Tue Aug 7 23:58:13 2007 GMT' Platform: osname=linux, archname=i686-linux jitcapable=1, jitarchname=i386-linux, jitosname=LINUX, jitcpuarch=i386 execcapable=1 perl=/usr/local/bin/perl Compiler: cc='cc', ccflags=' -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -DHASATTRIBUTE_CONST -DHASATTRIBUTE_DEPRECATED -DHASATTRIBUTE_MALLOC -DHASATTRIBUTE_NORETURN -DHASATTRIBUTE_PURE -DHASATTRIBUTE_UNUSED -DHASATTRIBUTE_WARN_UNUSED_RESULT', Linker and Libraries: ld='cc', ldflags=' -L/usr/local/lib', cc_ldflags='', libs='-lnsl -ldl -lm -lcrypt -lutil -lpthread -lrt' Dynamic Linking: share_ext='.so', ld_share_flags='-shared -L/usr/local/lib -fPIC', load_ext='.so', ld_load_flags='-shared -L/usr/local/lib -fPIC' Types: iv=long, intvalsize=4, intsize=4, opcode_t=long, opcode_t_size=4, ptrsize=4, ptr_alignment=1 byteorder=1234, nv=double, numvalsize=8, doublesize=8 --- Environment: HOME =/home/jimk LANG (unset) LANGUAGE (unset) LD_LIBRARY_PATH (unset) LOGDIR (unset) PATH =/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/usr/local/mysql/bin:/home/jimk/bin:/home/jimk/bin/perl SHELL =/bin/bash