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::Clustericious::Config;
use Test::Clustericious::Cluster;
use Test::More tests => 18;
use Capture::Tiny qw( capture_stdout );
use Yars::Command::yars_disk_scan;

my $data = create_directory_ok 'data';
my $state = create_directory_ok 'state';
create_config_helper_ok data_dir => sub { $data };
create_config_helper_ok state_dir => sub { $state };
my $cluster = Test::Clustericious::Cluster->new;
$cluster->create_cluster_ok(qw( Yars ));

is capture_stdout { is(Yars::Command::yars_disk_scan->main('-a'), 0, 'status = 0') }, '', 'empty yars, empty output';

my $t   = $cluster->t;
my $url = $cluster->url;

$t->put_ok("$url/file/robot.txt", {}, 'robots in disguise')
  ->status_is(201);

$t->put_ok("$url/file/scorecard.txt", {}, 'five to six')
  ->status_is(201);

is capture_stdout { is(Yars::Command::yars_disk_scan->main('-a'), 0, 'status = 0') }, '', 'trivial scan, both files are right';

# no muck up one of the files:
do {
  my $fn = "$data/29/0c/f0/c6/8c/8f/96/32/03/3a/1c/34/43/50/07/3f/robot.txt";
  ok -w $fn, "file is writable";
  open my $fh, '>>', $fn;
  print $fh "... more than meets the eye";
  close $fh;
};

like capture_stdout { is(Yars::Command::yars_disk_scan->main('-a'), 2, 'status = 2') }, qr{^290cf0c68c8f9632033a1c344350073f robot.txt$}m, 'one file is wrong';

like capture_stdout { is(Yars::Command::yars_disk_scan->main($data), 2, 'status = 2') }, qr{^290cf0c68c8f9632033a1c344350073f robot.txt$}m, 'one file is wrong';

__DATA__

@@ etc/Yars.conf
---
% use Test::Clustericious::Config;
url: <%= cluster->url %>
servers:
  - url: <%= cluster->url %>
    disks:
      - root: <%= data_dir %>
        buckets: [ 0,1,2,3,4,5,6,7,8,9,'a','b','c','d','e','f' ]

state_file: <%= state_dir . "/state.txt" %>