use strict; use warnings; use Data::Entropy::Algorithms qw(rand_bits); use Digest::Bcrypt; use Test::More; use Try::Tiny qw(try catch); my $ctx = try { return Digest::Bcrypt->new(); } catch { return "Couldn't create object: $!"; }; isa_ok($ctx, 'Digest::Bcrypt', 'new: got a proper object'); my $secret = "Super Secret Squirrel"; my $bits = rand_bits(128); is(length($bits), 16, 'rand_bits: 16 octets'); subtest "salt tests", sub { plan(skip_all => "Couldn't get a Digest::Bcrypt object") unless $ctx; my $res; my $err; $ctx->add($secret); try { $ctx->cost(5); $ctx->salt($bits); $res = $ctx->digest; } catch { $err = $_; }; is($err, undef, 'rand_bits salt: no error'); ok($res, 'rand_bits salt: got a proper digest'); $ctx->reset; }; subtest "bad salt tests", sub { plan(skip_all => "Couldn't get a Digest::Bcrypt object") unless $ctx; my $res; my $err; $ctx->add($secret); try { $ctx->cost(5); $ctx->salt(rand_bits(256)); $res = $ctx->digest; } catch { $err = $_; }; like($err, qr/Salt must/, 'bad salt: too many random bits'); is($res, undef, 'bad salt: no result'); }; done_testing();