App-CamelPKI
view release on metacpan or search on metacpan
t/lib/App/CamelPKI/Test.pm view on Meta::CPAN
#!perl -w
package App::CamelPKI::Test;
use warnings;
use strict;
=head1 NAME
B<App::CamelPKI::Test> - L<App::CamelPKI> Tests.
=head1 SYNOPSIS
=for My::Tests::Below "synopsis" begin
use App::CamelPKI::Test qw(:default %test_der_DNs);
use Test::Group;
my $utf8 = App::CamelPKI::Test->test_simple_utf8();
run_perl_ok(<<"SCRIPT");
use App::CamelPKI::Test;
warn "Hello world";
SCRIPT
=for My::Tests::Below "synopsis" end
=for My::Tests::Below "synopsis-asn1" begin
use App::CamelPKI::Test qw(x509_decoder);
my $dn_as_tree = x509_decoder('Name')->decode($dn_der);
=for My::Tests::Below "synopsis-asn1" end
server_start();
server_stop();
=head1 DESCRIPTION
This module is a library which aims at simplifying App-PKI test writing.
It started as a raw copy of I<Crypt::OpenSSL::CA:Test> you can find in
the C<t/lib> directory of the source L<Crypt::OpenSSL::CA> CPAN source
package.
=head1 EXPORTED FUNCTIONS
All functions described in this section factor some useful test
tactics and are exported by default. The L</SAMPLE INPUTS> may also
be exported upon request.
=over
=cut
use Test::Builder;
use Test::More;
use Test::Group;
use File::Find;
use File::Path ();
use File::Spec::Functions qw(catfile catdir);
use File::Slurp;
use File::Temp ();
use POSIX ":sys_wait_h";
use File::Which ();
use IO::Socket::SSL;
use LWP::UserAgent;
use HTTP::Request;
#pour formulaires
use URI::URL;
use HTTP::Request::Common;
use HTTP::Request::Form;
use HTML::TreeBuilder 3.0;
use base 'Exporter';
BEGIN {
our @EXPORT =
qw(openssl_path run_thru_openssl run_dumpasn1
run_perl run_perl_ok
certificate_looks_ok
certificate_chain_ok certificate_chain_invalid_ok
x509_schema x509_decoder
run_php run_php_script
http_request_prepare http_request_execute
plaintextcall_remote
call_remote formcall_remote formreq_remote
jsoncall_local jsonreq_remote jsoncall_remote
is_php_cli_present);
our @EXPORT_OK = (@EXPORT,
qw(test_simple_utf8 test_bmp_utf8
@test_DN_CAs
%test_der_DNs
%test_public_keys
%test_reqs_SPKAC %test_reqs_PKCS10
%test_keys_plaintext %test_keys_password
%test_self_signed_certs %test_rootca_certs
%test_entity_certs
test_CRL
server_start server_stop server_port
create_camel_pki_conf_php
camel_pki_chain
));
our %EXPORT_TAGS = ("default" => \@EXPORT);
}
=item I<plaintextcall_remote($url)>
Qureies a real Apache server at $url, which must be fully-qualified.
Throws an exception if the HTTP request isn't a success; otherwise,
t/lib/App/CamelPKI/Test.pm view on Meta::CPAN
line executrable C<php> (or C<php4>) is used. If $path a file name, the
path C<t/php> is added just before.
Note that an ad-hoc C<php.ini> script is needed; it's embeded in Camel-PKI
in C<t/php/php-json.ini>.
=back
=back
=cut
use File::Slurp;
sub run_php {
my ($phpcode) = @_;
my $phpscript = catfile
(tempdir(), sprintf("run_php_script.%d.php", _unique_number()));
write_file($phpscript, $phpcode);
return run_php_script($phpscript);
}
sub run_php_script {
my ($phpscript) = @_;
$phpscript = "t/php/$phpscript" unless ($phpscript =~ m|/|);
my ($php) = (File::Which::which("php"), File::Which::which("php5"));
die "Impossible to find php command line executable"
unless defined $php;
my $out;
IPC::Run::run([$php, "--php-ini", "t/php/php-json.ini",
-d => 'require_once_path=t/php',
$phpscript],
\"", \$out, \$out);
return $out;
}
=head1 MÃTHODES DE CLASSE
=head2 I<tempdir>
Returns a temporary directory e.g. for storing the C<ca-bundle.crt>
for L</certificate_chain_ok>.
=cut
{
my $cached;
sub tempdir {
return My::Tests::Below->tempdir if
(My::Tests::Below->can("tempdir"));
return $cached if defined $cached;
return ($cached = File::Temp::tempdir
("perl-Camel-PKI-Test-XXXXXX",
TMPDIR => 1, ($ENV{DEBUG} ? () : (CLEANUP => 1))));
}
}
=head1 SAMPLE INPUTS
I<App::CamelPKI::Test> also provides a couple of constants and
class methods to serve as inputs for tests. All such symbols are
exportable, but not exported by default (see L</SYNOPSIS>) and they
start with I<test_>, so as to be clearly identified as sample data in
the test code.
=over
=item I<test_simple_utf8()>
=item I<test_bmp_utf8()>
Two constant functions that return test strings for testing the UTF-8
capabilities of Camel-PKI. Both strings are encoded
internally in UTF-8 in the sense of L<utf8/is_utf8>. I<test_simple_utf8()>
contains only characters in the Latin1 range; I<test_bmp_utf8()> contains
only characters outside Latin1, but inside the Basic Multilingual
Plane.
=cut
sub test_simple_utf8 {
my $retval = "zoinxé";
die unless utf8::decode($retval);
return $retval;
}
sub test_bmp_utf8 {
my $retval = "â®âºâ¨"; # Peace, joy, coding :-)
die unless utf8::decode($retval);
return $retval;
}
=item I<%test_der_DNs>
Contains a set of DER-encoded DNs. The keys are the DNs in RFC4514
notation, and the values are strings of bytes. Available DN keys for
now are C<CN=Zoinx,C=fr>.
=cut
## You can generate more using Crypt::OpenSSL::CA using a
## one-liner such as
##
## perl -MCrypt::OpenSSL::CA -MMIME::Base64 -e 'print
## encode_base64(Crypt::OpenSSL::CA::X509_NAME->new
## (C => "fr", CN => "Zoinx")->to_asn1)'
use MIME::Base64 qw(decode_base64);
our %test_der_DNs =
("CN=Zoinx,C=fr" => decode_base64(<<DER),
MB0xCzAJBgNVBAYTAmZyMQ4wDAYDVQQDEwVab2lueA==
DER
);
=item I<@test_DN_CAs>
The DN used in all CA and self-signed certificates, namely
L</%test_self_signed_certs>, L</%test_rootca_certs> and friends. Set
( run in 0.822 second using v1.01-cache-2.11-cpan-13bb782fe5a )