openssl/test/recipes/10-test_bn.t
Richard Levitte f3356b7f49 Add math tests recipes
The math recipes are among the heavier, but also quite important.
For the BN test, we have previously relied on bc to verify the numbers.
Unfortunately, bc doesn't exist everywhere, making tests on some platforms
rather painful.  With the new recipe (recipes/10-test_bn.t), we rely
on perl's Math::BigInt and a homegrown simple calculator (recipes/bc.pl)
that can do enough to cover for bc.

Reviewed-by: Rich Salz <rsalz@openssl.org>
2015-09-07 16:10:57 +02:00

77 lines
1.3 KiB
Perl

#! /usr/bin/perl
use strict;
use warnings;
use Math::BigInt;
use Test::More;
use OpenSSL::Test qw/:DEFAULT top_file/;
setup("test_bn");
plan tests => 3;
require_ok(top_file("test","recipes","bc.pl"));
my $testresults = "tmp.bntest";
my $init = ok(run(test(["bntest"], stdout => $testresults)), 'initialize');
SKIP: {
skip "Initializing failed, skipping", 1 if !$init;
subtest 'Checking the bn results' => sub {
my @lines = ();
if (open DATA, $testresults) {
@lines = <DATA>;
close DATA;
}
chomp(@lines);
plan tests => scalar grep(/^print /, @lines);
my $l = "";
while (scalar @lines) {
$l = shift @lines;
last if $l =~ /^print /;
}
while (1) {
$l =~ s/^print "//;
$l =~ s/\\n"//;
my $t = $l;
my @operations = ();
$l = undef;
while (scalar @lines) {
$l = shift @lines;
last if $l =~ /^print /;
push @operations, $l;
$l = undef;
}
ok(check_operations(@operations), "verify $t");
last unless $l;
}
};
}
sub check_operations {
my $failcount = 0;
foreach my $line (@_) {
my $result = calc(split /\s+/, $line);
if ($result ne "0" && $result ne "0x0") {
$failcount++;
print STDERR "Failed! $line => $result\n";
}
}
return $failcount == 0;
}