#!perl -w # $Id: 04errors.t 682 2004-09-28 05:59:10Z david $ use strict; use Test::More tests => 51; BEGIN { use_ok('Params::CallbackRequest') } my $key = 'myCallbackTester'; sub mydie { die "Ouch!" } sub myfault { die bless {}, 'TestException' } my %cbs = ( pkg_key => $key, cb_key => 'mydie', cb => \&mydie ); my %fault_cb = ( pkg_key => $key, cb_key => 'myfault', cb => \&myfault ); ############################################################################## # Set up callback functions. ############################################################################## # Check that we get a warning for when there are no callbacks. { local $SIG{__WARN__} = sub { like( $_[0], qr/You didn't specify any callbacks/, "Check warning") }; ok( Params::CallbackRequest->new, "Construct CBExec object without CBs" ); } ############################################################################## # Try to construct a CBE object with a bad callback key. my %c = %cbs; $c{cb_key} = ''; eval {Params::CallbackRequest->new(callbacks => [\%c]) }; ok( my $err = $@, "Catch bad cb_key exception" ); isa_ok($err, 'Params::Callback::Exception' ); isa_ok($err, 'Params::Callback::Exception::Params' ); like( $err->error, qr/Missing or invalid callback key/, "Check bad cb_key error message" ); ############################################################################## # Try to construct a CBE object with a bad priority. %c = %cbs; $c{priority} = 'foo'; eval {Params::CallbackRequest->new(callbacks => [\%c]) }; ok( $err = $@, "Catch bad priority exception" ); isa_ok($err, 'Params::Callback::Exception' ); isa_ok($err, 'Params::Callback::Exception::Params' ); like( $err->error, qr/Not a valid priority: 'foo'/, "Check bad priority error message" ); ############################################################################## # Test a bad code ref. my $msg = "Callback for package key 'myCallbackTester' and callback key " . "'coderef' not a code reference"; %c = %cbs; $c{cb_key} = 'coderef'; $c{cb} = 'bogus'; # Ooops. eval {Params::CallbackRequest->new(callbacks => [\%c]) }; ok( $err = $@, "Catch bad code ref exception" ); isa_ok($err, 'Params::Callback::Exception' ); isa_ok($err, 'Params::Callback::Exception::Params' ); like( $err->error, qr/$msg/, "Check bad code ref error message" ); ############################################################################## # Test for a used key. %c = my %b = %cbs; $c{cb_key} = $b{cb_key} = 'bar'; # Ooops. eval {Params::CallbackRequest->new(callbacks => [\%c, \%b]) }; ok( $err = $@, "Catch used key exception" ); isa_ok($err, 'Params::Callback::Exception' ); isa_ok($err, 'Params::Callback::Exception::Params' ); like( $err->error, qr/Callback key 'bar' already used by package key '$key'/, "Check used key error message" ); ############################################################################## # Test a bad request code ref. eval {Params::CallbackRequest->new(pre_callbacks => ['foo']) }; ok( $err = $@, "Catch bad request code ref exception" ); isa_ok($err, 'Params::Callback::Exception' ); isa_ok($err, 'Params::Callback::Exception::Params' ); like( $err->error, qr/Request pre callback not a code reference/, 'Check bad request code ref exception' ); ############################################################################## # Make sure that Params::Validate is using our exceptions. $msg = 'The following parameter was passed in the call to ' . 'Params::CallbackRequest::new but was not listed in the validation options: ' . 'feh'; eval {Params::CallbackRequest->new(feh => 1) }; ok( $err = $@, "Catch bad parameter exception" ); isa_ok($err, 'Params::Callback::Exception' ); isa_ok($err, 'Params::Callback::Exception::Params' ); like( $err->error, qr/$msg/, 'Check bad parameter exception' ); ############################################################################## # Construct one to be used for exceptions during the execution of callbacks. ############################################################################## ok( my $cb_request = Params::CallbackRequest->new( callbacks => [\%cbs, \%fault_cb]), "Construct CBExec object" ); isa_ok($cb_request, 'Params::CallbackRequest' ); ############################################################################## # Send a bad argument to execute(). eval { $cb_request->request('foo') }; # oops! ok( $err = $@, "Catch bad argument exception" ); isa_ok($err, 'Params::Callback::Exception' ); isa_ok($err, 'Params::Callback::Exception::Params' ); like( $err->error, qr/Parameter 'foo' is not a hash reference/, 'Check bad argument exception' ); ############################################################################## # Test the callbacks themselves. ############################################################################## # Make sure an exception get thrown for a non-existant package. my %params = ( 'NoSuchLuck|foo_cb' => 1 ); eval { $cb_request->request(\%params) }; ok( $err = $@, "Catch bad package exception" ); isa_ok($err, 'Params::Callback::Exception' ); isa_ok($err, 'Params::Callback::Exception::InvalidKey' ); like( $err->error, qr/No such callback package 'NoSuchLuck'/, "Check bad package message" ); ############################################################################## # Make sure an exception get thrown for a non-existant callback. %params = ( "$key|foo_cb" => 1 ); eval { $cb_request->request(\%params) }; ok( $err = $@, "Catch missing callback exception" ); isa_ok($err, 'Params::Callback::Exception' ); isa_ok($err, 'Params::Callback::Exception::InvalidKey' ); like( $err->error, qr/No callback found for callback key '$key|foo_cb'/, "Check missing callback message" ); ############################################################################## # Now die from within our callback function. %params = ( "$key|mydie_cb" => 1 ); eval { $cb_request->request(\%params) }; ok( $err = $@, "Catch our exception" ); isa_ok($err, 'Params::Callback::Exception' ); isa_ok($err, 'Params::Callback::Exception::Execution' ); like( $err->error, qr/^Error thrown by callback: Ouch! at/, "Check our mydie message" ); like( $err->callback_error, qr/^Ouch! at/, "Check our die message" ); ############################################################################## # Now throw our own exception. %params = ( "$key|myfault_cb" => 1 ); eval { $cb_request->request(\%params) }; ok( $err = $@, "Catch our exception" ); isa_ok($err, 'TestException' ); ############################################################################## # Now test exception_handler. %params = ( "$key|mydie_cb" => 1 ); ok( $cb_request = Params::CallbackRequest->new ( callbacks => [\%cbs], exception_handler => sub { like( $_[0], qr/^Ouch! at/, "Custom check our die message" ); }), "Construct CBExec object with custom exception handler" ); ok( $cb_request->request(\%params), "Execute callbacks with exception handler" ); 1; __END__