The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use Test::More tests => 16;
use Test::Exception;

use Convert::PEM;
use Math::BigInt;

my $objfile = "./object.pem";

my $pem = Convert::PEM->new(
           Name => 'TEST OBJECT',
           ASN  => qq(
               TestObject SEQUENCE {
                   int INTEGER
               }
    ));
isa_ok $pem, 'Convert::PEM';

my($obj, $obj2);
$obj = { TestObject => { int => 4 } };

lives_ok { $pem->write( Filename => $objfile, Content => $obj) } 'can write';
ok -e $objfile, 'output file exists';
lives_ok { $obj2 = $pem->read( Filename => $objfile ) } 'can read';
is $obj->{TestObject}{int}, $obj2->{TestObject}{int}, 'input matches output';
unlink $objfile;

lives_ok { $pem->write( Filename => $objfile, Content => $obj, Password => 'xx' ) } 'can write';
ok -e $objfile, 'output file exists';
lives_ok { $obj2 = $pem->read( Filename => $objfile ) } 'can read';
ok !defined $obj2, 'cannot read encrypted file';
like $pem->errstr, qr/^Decryption failed/, 'errstr matches decryption failed';
lives_ok { $obj2 = $pem->read( Filename => $objfile, Password => 'xx') } 'can read';
is $obj->{TestObject}{int}, $obj2->{TestObject}{int}, 'input matches output';
unlink $objfile;

$obj->{TestObject}{int} = Math::BigInt->new("110982309809809850938509");
lives_ok { $pem->write( Filename => $objfile, Content => $obj) } 'can write';
ok -e $objfile, 'output file exists';
lives_ok { $obj2 = $pem->read( Filename => $objfile ) } 'can read';
is $obj->{TestObject}{int}, $obj2->{TestObject}{int}, 'input matches output';
unlink $objfile;