The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# -*- mode: cperl -*-
use strict;
use Test::More;

use File::Temp qw(tempdir);
use File::Glob qw(:glob); # for globbing pattern contains whitespace
use AWS::CLIWrapper;

my $aws = AWS::CLIWrapper->new;
my $cleanup = 0;

{
    my $tmpdir = tempdir( CLEANUP => $cleanup );
    test_sync("normal",
              's3://aws-cliwrapper-test' => $tmpdir);
}

{
    my $tmpdir = tempdir( CLEANUP => $cleanup );
    test_sync("source file contains space",
              's3://aws-cliwrapper-test/file-space' => $tmpdir);
}
{
    my $tmpdir = tempdir("s3-sync-sfs XXXXXX",
                         CLEANUP => $cleanup,
                         TMPDIR  => 1,
                     );
    test_sync("source file contains space and dest dir contains space",
              's3://aws-cliwrapper-test/file-space' => $tmpdir);
}

{
    my $tmpdir = tempdir( CLEANUP => $cleanup );
    test_sync("source dir contains space",
              's3://aws-cliwrapper-test/dir space' => $tmpdir);
}
{
    my $tmpdir = tempdir("s3-sync-sds XXXXXX",
                         CLEANUP => $cleanup,
                         TMPDIR  => 1,
                     );
    test_sync("source dir contains space and dest dir contains space",
              's3://aws-cliwrapper-test/dir space' => $tmpdir);
}

{
    my $tmpdir = tempdir("XXXXXXXX",
                         CLEANUP => $cleanup,
                         TMPDIR  => 1,
                     );
    test_sync("source dir contains single quote",
              "s3://aws-cliwrapper-test/dir'single" => $tmpdir);
}
{
    my $tmpdir = tempdir("s3-sync-dfq'XXXXXX",
                          CLEANUP => $cleanup,
                          TMPDIR  => 1,
                      );
    test_sync("both source and dest dirs contains single quote",
              "s3://aws-cliwrapper-test/dir'single" => $tmpdir);
}

{
    my $tmpdir = tempdir('XXXXXXXX',
                          CLEANUP => $cleanup,
                          TMPDIR  => 1,
                      );
    test_sync("source dir contains double quote",
              's3://aws-cliwrapper-test/dir"double' => $tmpdir);
}
{
    my $tmpdir = tempdir('s3-sync-dfdq"XXXXXX',
                          CLEANUP => $cleanup,
                          TMPDIR  => 1,
                      );
    test_sync("both source and dest dirs contains double quote",
              's3://aws-cliwrapper-test/dir"double' => $tmpdir);
}

done_testing;

sub test_sync {
    my($desc, $src, $dst) = @_;

    my $res = $aws->s3('sync', [$src => $dst],
                       {
                           'delete' => $AWS::CLIWrapper::true,
                       });
    ok($res, "$desc: $src => $dst");

    my @downloaded = bsd_glob("$dst/*");
    my $nd = scalar @downloaded;
    ok($nd > 0, "downloaded $nd");
}