1use strict; 2use warnings; 3 4use File::Spec; 5use File::Temp qw( tempdir ); 6use Test::More 0.88; 7 8use Log::Dispatch; 9use Log::Dispatch::File; 10 11## no critic (ControlStructures::ProhibitNegativeExpressionsInUnlessAndUntilConditions) 12plan skip_all => "Cannot test utf8 files with this version of Perl ($])" 13 unless $] >= 5.008; 14 15my $dir = tempdir( CLEANUP => 1 ); 16 17my %params = ( 18 name => 'file', 19 min_level => 'debug', 20 filename => File::Spec->catfile( $dir, 'logfile_X.txt' ), 21); 22 23my @tests = ( 24 { 25 params => { %params, 'binmode' => ':utf8' }, 26 message => "foo bar\x{20AC}", 27 expected_message => "foo bar\xe2\x82\xac", 28 }, 29); 30 31my $count = 0; 32for my $t (@tests) { 33 my $dispatcher = Log::Dispatch->new(); 34 ok( $dispatcher, 'got a logger object' ); 35 36 $t->{params}{filename} =~ s/X\.txt$/$count++ . '.txt'/e; 37 my $file = $t->{params}{filename}; 38 39 my $logger = Log::Dispatch::File->new( %{ $t->{params} } ); 40 ok( $logger, 'got a file output object' ); 41 42 $dispatcher->add($logger); 43 $dispatcher->log( level => 'info', message => $t->{message} ); 44 45 ok( -e $file, "$file exists" ); 46 47 open my $fh, '<', $file or die $!; 48 my $line = do { local $/ = undef; <$fh> }; 49 close $fh or die $!; 50 51 is( $line, $t->{expected_message}, 'output contains UTF-8 bytes' ); 52} 53 54done_testing(); 55 56