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