The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::More tests => 2;
use Test::Requires qw(Sys::Trace);
use File::Temp qw(:mktemp);

my $target1 = File::Temp->new(TEMPLATE => ".target.$$.XXXXXX");
my $target2 = File::Temp->new(TEMPLATE => ".target.$$.XXXXXX");
my $name    = mktemp(".name.$$.XXXXXX");
diag "$name\n";
END { unlink $name or warn "Couldn't unlink $name: $!" }

subtest 'non-atomic' => sub {
    plan tests => 2;
    my $non_atomic_trace = Sys::Trace->new(
        exec => [$^X, '-Ilib', '-E', "symlink '$target1', '$name';"]
    );
    $non_atomic_trace->start;
    $non_atomic_trace->wait;

    my $non_atomic_results = $non_atomic_trace->results;
    ok do { grep { $_->{call} eq 'symlink' } @$non_atomic_results }, 'symlink system call seen';
    ok do {!grep { $_->{call} eq 'rename'  } @$non_atomic_results }, 'no rename system call seen';
};

subtest 'atomic' => sub {
    plan tests => 4;
    my $atomic_trace = Sys::Trace->new(
        exec => [$^X, '-Ilib', '-E', "use File::Symlink::Atomic; symlink '$target2', '$name';"]
    );
    $atomic_trace->start;
    $atomic_trace->wait;

    my $atomic_results = $atomic_trace->results;
    ok do { grep { $_->{call} eq 'symlink' } @$atomic_results }, 'symlink system call seen';
    is do { grep { $_->{call} eq 'rename'  } @$atomic_results }, 1, 'rename system call seen';
    
    my @rename_calls = do { grep { $_->{call} eq 'rename'  } @$atomic_results };
    like $rename_calls[0]->{args}->[0], qr/\Q$name/, 'correct parameters';
    like $rename_calls[0]->{args}->[1], qr/\Q$name/, 'correct parameters';
};