The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#! perl -T

BEGIN {
    use strict;
    use warnings;
    use Test::More tests => 8;

    use_ok('Sys::Mmap');
}

use FileHandle;

$temp_file = "mmap.tmp";

my $temp_file_contents = "ABCD1234" x 1000; 
sysopen(FOO, $temp_file, O_WRONLY|O_CREAT|O_TRUNC) or die "$temp_file: $!\n";
print FOO $temp_file_contents;
close FOO;

my $foo;
sysopen(FOO, $temp_file, O_RDONLY) or die "$temp_file: $!\n";
# Test negative offsets fail.
is(eval { mmap($foo, 0, PROT_READ, MAP_SHARED, FOO, -100); 1}, undef, "Negative seek fails.");
like($@, qr/^\Qmmap: Cannot operate on a negative offset (-100)\E/, "croaks when negative offset is passed in"); 
# Now map the file for real
mmap($foo, 0, PROT_READ, MAP_SHARED, FOO);
close FOO;

is($foo, $temp_file_contents, "RO access to the file produces valid data");
munmap($foo);

sysopen(FOO, $temp_file, O_RDWR) or die "$temp_file: $!\n";
mmap($foo, 0, PROT_READ|PROT_WRITE, MAP_SHARED, FOO);
close FOO;

substr($foo, 3, 1) = "Z";
substr($temp_file_contents, 3, 1) = "Z";
is($foo, $temp_file_contents, 'Foo can be altered in RW mode');
munmap($foo);

sysopen(FOO, $temp_file, O_RDONLY) or die "$temp_file: $!\n";
my $bar = <FOO>;
is($bar, $temp_file_contents, 'Altered foo reflects on disk');

{
    my $foo;
    my $file_size = -s $temp_file;
    open(my $fh, "<", $temp_file) or die;
    isa_ok($fh, 'GLOB');
    mmap($foo, $file_size, &Sys::Mmap::PROT_READ, &Sys::Mmap::MAP_SHARED, $fh);
    is($foo, $temp_file_contents, 'Read $foo, when it comes from a FileHandle');
    munmap($foo);
}
    

unlink($temp_file);