App-CamelPKI

 view release on metacpan or  search on metacpan

t/lib/App/CamelPKI/Test.pm  view on Meta::CPAN


=head2 Synopsis tests

=cut

test "synopsis" => sub {
    # Thank you Test::Group for being fully reflexive!
    eval My::Tests::Below->pod_code_snippet("synopsis");
    die $@ if $@;
};


test "synopsis asn1" => sub {
    my $synopsis = My::Tests::Below->pod_code_snippet("synopsis-asn1");
    ok(defined(my $dn_der =
       $App::CamelPKI::Test::test_der_DNs{"CN=Zoinx,C=fr"}),
       "\$dn_der defined");
    eval $synopsis; die $@ if $@;
    pass;
};

=head2 Sample Input Validation

=cut

test "test_simple_utf8 and test_bmp_utf8" => sub {
    is(length(App::CamelPKI::Test->test_simple_utf8()), 6);
    ok(utf8::is_utf8(App::CamelPKI::Test->test_simple_utf8()));

    is(length(App::CamelPKI::Test->test_bmp_utf8()), 3);
    ok(utf8::is_utf8(App::CamelPKI::Test->test_bmp_utf8()));
};

test "%test_keys_plaintext and %test_keys_password" => sub {
    is_deeply
        ([sort keys %App::CamelPKI::Test::test_keys_plaintext],
         [sort keys %App::CamelPKI::Test::test_keys_password],
         "same keys in both");
    if (defined(my $openssl_bin = openssl_path)) {
        while(my ($k, $v) =
              each %App::CamelPKI::Test::test_keys_password) {
            my ($out, $err) = run_thru_openssl
                ($v, qw(rsa -passin pass:secret));
            is($out,
               $App::CamelPKI::Test::test_keys_plaintext{$k});
        }
    }
};

test "certificate_chain_ok and test certificates" => sub {
    my @keyids = keys %App::CamelPKI::Test::test_rootca_certs;
    foreach my $id (@keyids) {
        certificate_chain_ok
            ($App::CamelPKI::Test::test_entity_certs{$id},
           [ $App::CamelPKI::Test::test_rootca_certs{$id} ]);
        certificate_chain_ok
            ($App::CamelPKI::Test::test_entity_certs{"${id}_sha256"},
             [ $App::CamelPKI::Test::test_rootca_certs{$id} ]);
    }

    my ($snippet_ok, $snippet_not_ok) =
        map { My::Tests::Below->pod_code_snippet($_) }
            (qw(certificate_chain_ok certificate_chain_notok));
    my $out = run_perl(<<"SCRIPT");
use Test::More qw(no_plan);
use App::CamelPKI::Test qw(certificate_chain_ok
       %test_rootca_certs %test_self_signed_certs %test_entity_certs);
foreach my \$key (qw(${\join(" ", @keyids)})) {
    $snippet_ok
    $snippet_not_ok
}
SCRIPT
    for my $i (0..$#keyids) {
        my $success = 2 * $i + 1;
        my $failure = 2 * $i + 2;
        like($out, qr/^ok $success/m);
        like($out, qr/^not ok $failure/m);
    }
};

test "no collisions in the entity certificates' serial numbers" => sub {
    my %serialz;
    foreach my $certpem (values %App::CamelPKI::Test::test_entity_certs) {
        my ($out, $err) =
            run_thru_openssl($certpem, qw(x509 -noout -text));
        (my ($serial) = $out =~ m/Serial Number:\n?\s+(.*)\n/)
            or die $out;
        ok(! $serialz{$serial}++, "duplicate serial $serial");
    }
};

use App::CamelPKI::Test qw(server_start server_stop server_port);

sub server_can_connect {
    my $ua = LWP::UserAgent->new;
    my $port = server_port;
    my $response = $ua->get("https://127.0.0.1:$port/");

    # TODO : find a solution
    # A small bug prevent this from working, no time
	# to worry about it, just adapt the test
	# In a perfect world, it should be :
	#  return ($response->is_success);
	if ($response->status_line =~ qr/404/){
		return 1;
	}
    return ($response->is_success);
}

SKIP: {
	use App::CamelPKI; 
	my $webserver = App::CamelPKI->model("WebServer")->apache;
	
	skip "Apache is not installed or Key Ceremony has not been done", 
		1 unless ($webserver->is_installed_and_has_perl_support && $webserver->is_operational);
	
	test "server_start and server_stop" => sub {
    	server_start();
    	ok(server_can_connect());

    	server_stop();
    	ok(! server_can_connect());
	};
};

SKIP:{
	skip "php-cli not installed",1
		unless is_php_cli_present();
test "run_php" => sub {
    my $phpout = run_php(<<"SCRIPT");



( run in 0.746 second using v1.01-cache-2.11-cpan-5a3173703d6 )