The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w
use Test::More;
use Test::Exception;

eval { require Unix::Syslog };

use vars qw($REAL_TESTS $FAKE_TESTS);
$FAKE_TESTS ||= 0;
$REAL_TESTS = 41;

plan( skip_all => q{Unix::Syslog not installed; can't test} ) if $@;
plan tests => ($FAKE_TESTS + $REAL_TESTS);

use_ok('Log::Syslog::Abstract', qw( openlog syslog closelog ));

dies_ok { openlog() } 'openlog with no args dies';
like ( $@, qr/first argument must be an identifier string/, '... with expected error');

dies_ok { openlog('wookie') } 'openlog with one arg dies';
like ( $@, qr/second argument must be flag string/, '... with expected error');

dies_ok { openlog('wookie', 'pid,ndelay') } 'openlog with 2 args dies';
like ( $@, qr/third argument must be a facility string/, '... with expected error');

# Only check mapping of values if we have a real Unix::Syslog on this
# platform.

# check _convert_flags
my %flag_to_value = (
	pid     => Unix::Syslog::LOG_PID(),
	ndelay  => Unix::Syslog::LOG_NDELAY(),
);
is( Log::Syslog::Abstract::_convert_flags( 'pid,ndelay'), 0x01 | 0x08, 'bitwise-or of all flags is as expected');
foreach my $flag ( keys %flag_to_value ) {
	is( Log::Syslog::Abstract::_convert_flags( $flag ), $flag_to_value{$flag}, "Flag $flag works");
}

# check _convert_facility
# TODO: works on Linux... what about elsewhere?
my %facility_to_value = (
	emerg => Unix::Syslog::LOG_EMERG(),
	panic => Unix::Syslog::LOG_EMERG(),
	alert => Unix::Syslog::LOG_ALERT(),
	crit => Unix::Syslog::LOG_CRIT(),
	error => Unix::Syslog::LOG_ERR(),
	'err' => Unix::Syslog::LOG_ERR(),
	warning => Unix::Syslog::LOG_WARNING(),
	notice => Unix::Syslog::LOG_NOTICE(),
	info => Unix::Syslog::LOG_INFO(),
	debug => Unix::Syslog::LOG_DEBUG(),

	kern => Unix::Syslog::LOG_KERN(),
	user => Unix::Syslog::LOG_USER(),
	mail => Unix::Syslog::LOG_MAIL(),
	daemon => Unix::Syslog::LOG_DAEMON(),
	auth => Unix::Syslog::LOG_AUTH(),
	syslog => Unix::Syslog::LOG_SYSLOG(),
	lpr => Unix::Syslog::LOG_LPR(),
	news => Unix::Syslog::LOG_NEWS(),
	uucp => Unix::Syslog::LOG_UUCP(),
	cron => Unix::Syslog::LOG_CRON(),
	authpriv => Unix::Syslog::LOG_AUTHPRIV(),
	ftp => Unix::Syslog::LOG_FTP(),
	local0 => Unix::Syslog::LOG_LOCAL0(),
	local1 => Unix::Syslog::LOG_LOCAL1(),
	local2 => Unix::Syslog::LOG_LOCAL2(),
	local3 => Unix::Syslog::LOG_LOCAL3(),
	local4 => Unix::Syslog::LOG_LOCAL4(),
	local5 => Unix::Syslog::LOG_LOCAL5(),
	local6 => Unix::Syslog::LOG_LOCAL6(),
	local7 => Unix::Syslog::LOG_LOCAL7(),
);

foreach my $facility ( keys %facility_to_value ) {
	is( Log::Syslog::Abstract::_convert_facility( $facility ), $facility_to_value{$facility}, "Flag $facility works");
}

# Try some combinations
is( Log::Syslog::Abstract::_convert_facility( 'notice|local7') , $facility_to_value{notice} | $facility_to_value{local7}, 'bitwise-OR works');