| PITA documentation | Contained in the PITA distribution. |
PITA::Guest - The PITA Guest abstract, a container for running tests
All testing is run inside a Guest, a container object usually involving a system image and a configuration.
This class implements the Guest abstraction.
$guest = PITA::Guest->new( 'guest-51231.pita' ); $guest = PITA::Guest->new( \$file_content ); $guest = PITA::Guest->new( $guest_xml_object );
The new constructor creates a new PITA::Guest object from an XML
description. It takes a single param of either a PITA::XML::Guest
object, a string which is the name of a PITA file containing the XML
description, or a SCALAR reference (which may be a constant SCALAR ref)
containing the XML.
Returns a new PITA::Guest object, or dies on error.
The file accessor returns the name of the file the Guest object was
created from.
The PITA::XML file loads to a PITA::XML::Guest object which is held internally.
The guestxml accessor returns the PITA::XML::Guest object.
The discovered method returns true if the Guest has gone through the
discovery process that identifies testing platforms in the Guest, or false
if not.
The driver method returns the PITA::Driver object within the
PITA::Guest that the tests are run through.
All guests are required to identify themselves.
The ping method is dispatched to the driver and does whatever is
necesary to determine if the guest is live (and actually a
PITA::Guest)
Returns true (may take up to 5 minutes) or false if not.
Most often the detailed of a Guest are provided without identifying what is set up inside them.
The discover method is dispatched to the driver, loading the Guest
and interrogating it to determine the testing platforms available from
it.
Returns true (may take up to 5 minutes) if the testing platforms are correctly discovered, or dies if not.
$response = $guest->test( 'request.pita' );
The test method executes a single testing request.
It takes as argument the name of a PITA::XML file with a <request> at the root. Loads the request and dispatches it to the driver, which will load the Guest, inject the test request and package, and then hand back the response once it is completed.
Depending on the package, this could take from minutes to hours to run.
Returns a PITA::XML::Report object, or dies on error.
The PITA::Guest object remembers the name of the file it was loaded from.
If you run discover, then afterwards your can run save to save the
now-discovered Guest back to a file.
Returns true or dies on error.
Bugs should be reported via the CPAN bug tracker at
http://rt.cpan.org/NoAuth/ReportBug.html?Queue=PITA
For other issues, contact the author.
Adam Kennedy <adamk@cpan.org>
The Practical Image Testing Architecture (http://ali.as/pita/)
Copyright 2005 - 2011 Adam Kennedy.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
The full text of the license can be found in the LICENSE file included with this module.
| PITA documentation | Contained in the PITA distribution. |
package PITA::Guest;
use 5.008; use strict; use Process (); use File::Spec (); use File::Basename (); use Params::Util qw{ _STRING _SCALAR _INSTANCE }; use PITA::XML (); our $VERSION = '0.50'; our @ISA = 'Process'; ##################################################################### # Constructors
sub new { my $class = shift; # Handle the param my $file = undef; my $guest_xml = undef; if ( _INSTANCE($_[0], 'PITA::XML::Guest') ) { $guest_xml = shift; } elsif ( _STRING($_[0]) ) { $file = shift; unless ( -f $file ) { Carp::croak('Did not provide a valid filename'); } $guest_xml = PITA::XML::Guest->read($file); } else { Carp::croak("Invalid param provided to PITA::Guest::new"); } # Create the object my $self = bless { file => $file, guestxml => $guest_xml, driver => undef, }, $class; # If and only if the Guest has an image, save its absolute path if ( $self->guestxml->files ) { my $filexml = ($self->guestxml->files)[0]; my $filename = $filexml->filename; if ( File::Spec->file_name_is_absolute( $filename ) ) { $self->{absimage} = $filename; } elsif ( defined $file ) { $filename = File::Spec->catfile( File::Basename::dirname($file), $filename, ); unless ( File::Spec->file_name_is_absolute( $filename ) ){ $filename = File::Spec->rel2abs( $filename ); } $self->{absimage} = $filename; } elsif ( defined $guest_xml->base ) { $filename = File::Spec->catfile( $guest_xml->base, $filename, ); unless ( File::Spec->file_name_is_absolute( $filename ) ){ $filename = File::Spec->rel2abs( $filename ); } $self->{absimage} = $filename; } else { die "Unable to locate image file for guest"; } } # Create the driver my $driver = 'PITA::Guest::Driver::' . $self->guestxml->driver; eval "require $driver"; die $@ if $@; my %params = ( guest => $self->guestxml ); if ( $self->{absimage} ) { $params{absimage} = $self->{absimage}; } if ( $self->{minicpan} ) { $params{minicpan} = $self->{minicpan}; } if ( $driver->isa('PITA::Guest::Driver::Image') ) { $params{support_server_addr} = '127.0.0.1'; $params{support_server_port} = 12345; } $self->{driver} = $driver->new( %params ); $self; } ##################################################################### # Accessors
sub file { $_[0]->{file}; }
sub guestxml { $_[0]->{guestxml}; }
sub discovered { $_[0]->guestxml->discovered; }
sub driver { $_[0]->{driver}; } ##################################################################### # Main Methods
sub ping { $_[0]->driver->ping; }
sub discover { $_[0]->driver->discover; }
sub test { my $self = shift; my $filename = _STRING(shift); unless ( $filename and -f $filename and -r _ ) { Carp::croak('Did not provide a request file'); } # Load the request object my $request = PITA::XML::Request->read($filename); unless ( $request ) { Carp::croak('Failed to load request file'); } # Locate the archive file, converting the request # filename to absolute if needed. ### FIXME: If the <filename> tag can contain anything ### other than a raw filename, this code is not ### portable, and needs improving to split the ### <filename> first before appending. my $archive = File::Basename::dirname($filename); $archive = File::Spec->catfile( $archive, $request->file->filename ); unless ( $archive and -f $archive and -r _ ) { Carp::croak('Failed to find archive, or insufficient permissions'); } unless ( File::Spec->file_name_is_absolute( $archive ) ) { $archive = File::Spec->rel2abs( $archive ); } $request->file->{filename} = $archive; # Just use the first platform until we write a selection method my $platform = ($self->guestxml->platforms)[0]; unless ( _INSTANCE($platform, 'PITA::XML::Platform') ) { Carp::croak('Could not autoselect a platform'); } # Hand off the testing request to the driver $self->driver->test( $request, $platform ); }
sub save { my $self = shift; unless ( defined $self->file ) { Carp::croak("No file to save to"); } $self->guestxml->write( $self->file ); } 1;