#!/usr/bin/perl
# Test the serialization of XML structures to filehandles
use strict;
use vars qw($dir $vol $fh $file $tmpfile $md5_able $faux_req $faux_res $ofh
$data);
use RPC::XML ':all';
use Test::More tests => 20;
use File::Spec;
# We'll be using the <nil /> extension here:
$RPC::XML::ALLOW_NIL = 1;
($vol, $dir, undef) = File::Spec->splitpath(File::Spec->rel2abs($0));
$dir = File::Spec->catpath($vol, $dir, '');
$file = File::Spec->catfile($dir, 'svsm_text.gif');
$tmpfile = File::Spec->catfile($dir, "__tmp__${$}__");
END
{
# Make sure we don't leave any droppings...
if (-f $tmpfile)
{
unlink $tmpfile;
}
}
if (! (open $fh, '<', $file))
{
die "Could not open $file for reading: $!";
}
$faux_req = RPC::XML::request->new(
'test',
RPC_STRING 'string',
RPC_INT 10,
RPC_I4 20,
RPC_I8 4294967296,
RPC_DOUBLE 0.5,
RPC_BOOLEAN 1,
RPC_DATETIME_ISO8601 time2iso8601(),
[ qw(a b c) ],
{ one => 2 },
RPC_NIL,
RPC_BASE64 $fh
);
# This is a good place to test the length() method, while we're at it
is(length($faux_req->as_string), $faux_req->length, 'Testing length() method');
if (! (open $ofh, '+>', $tmpfile))
{
die "Could not open $tmpfile for read/write: $!";
}
select $ofh; $| = 1; select STDOUT;
$faux_req->serialize($ofh);
ok(1, 'serialize method did not croak'); # Just happy we made it this far.
is(-s $ofh, length($faux_req->as_string), 'File size is correct');
seek $ofh, 0, 0;
$data = '';
read $ofh, $data, -s $ofh;
is($data, $faux_req->as_string, 'File content is correct');
# Done with these for now
close $fh;
close $ofh;
unlink $tmpfile;
# We'll be doing this next set twice, as RPC::XML::response::serialize has a
# slightly different code-path for faults and all other responses.
if (! (open $ofh, '+>', $tmpfile))
{
die "Could not open $tmpfile for read/write: $!";
}
select $ofh; $| = 1; select STDOUT;
$faux_res = RPC::XML::response->new(RPC::XML::fault->new(1, 'test'));
is(length($faux_res->as_string), $faux_res->length,
'length() in fault response');
$faux_res->serialize($ofh);
# Again, this means that all the triggered calls managed to not die
ok(1, 'serialize method did not croak');
is(-s $ofh, length($faux_res->as_string), 'Fault-response file size OK');
seek $ofh, 0, 0;
$data = '';
read $ofh, $data, -s $ofh;
is($data, $faux_res->as_string, 'Fault-response content is correct');
close $ofh;
unlink $tmpfile;
# Round two, with normal response (not fault)
if (! (open $ofh, '+>', $tmpfile))
{
die "Could not open $tmpfile for read/write: $!";
}
select $ofh; $| = 1; select STDOUT;
$faux_res = RPC::XML::response->new('test');
is(length($faux_res->as_string), $faux_res->length,
'length() in normal response');
$faux_res->serialize($ofh);
# Again, this means that all the triggered calls managed to not die
ok(1, 'serialize method did not croak');
is(-s $ofh, length($faux_res->as_string), 'Normal response file size OK');
seek $ofh, 0, 0;
$data = '';
read $ofh, $data, -s $ofh;
is($data, $faux_res->as_string, 'Normal response content OK');
close $ofh;
unlink $tmpfile;
# Test some extra code-paths in the base64 logic:
# Route 1: In-memory content
if (! (open $ofh, '+>', $tmpfile))
{
die "Could not open $tmpfile for read/write: $!";
}
select $ofh; $| = 1; select STDOUT;
$faux_res = RPC::XML::response->new(RPC::XML::base64->new('a simple string'));
is(length($faux_res->as_string), $faux_res->length,
'length() in normal response');
$faux_res->serialize($ofh);
# Again, this means that all the triggered calls managed to not die
ok(1, 'serialize method did not croak');
is(-s $ofh, length($faux_res->as_string), 'Normal response file size OK');
seek $ofh, 0, 0;
$data = '';
read $ofh, $data, -s $ofh;
is($data, $faux_res->as_string, 'Normal response content OK');
close $ofh;
unlink $tmpfile;
# Route 2: Spool from a file that is already encoded
if (! (open $ofh, '+>', $tmpfile))
{
die "Could not open $tmpfile for read/write: $!";
}
select $ofh; $| = 1; select STDOUT;
$file = File::Spec->catfile($dir, 'svsm_text.b64');
if (! (open $fh, '<', $file))
{
die "Could not open $file for reading: $!";
}
$faux_res = RPC::XML::response->new(RPC::XML::base64->new($fh, 'encoded'));
is(length($faux_res->as_string), $faux_res->length,
'length() in normal response');
$faux_res->serialize($ofh);
# Again, this means that all the triggered calls managed to not die
ok(1, 'serialize method did not croak');
is(-s $ofh, length($faux_res->as_string), 'Normal response file size OK');
seek $ofh, 0, 0;
$data = '';
read $ofh, $data, -s $ofh;
is($data, $faux_res->as_string, 'Normal response content OK');
close $fh;
close $ofh;
unlink $tmpfile;
exit;