The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
use 5.010;
use lib 't/lib';
use Any::Moose;
use Hailo::Test;
use Benchmark qw(:all);
use File::Temp qw(tempfile tempdir);
use Test::More;
use namespace::clean -except => 'meta';

# Notes:
#   for i in $(echo 'show databases;' | mysql -u root -proot | grep hailo-test); do echo "drop database $i;" | mysql -u root -proot; done
#   for i in $(psql -A -l | perl -pe 's/\|.*//'|grep hailo-test); do dropdb $i; done

my $test_count = $ARGV[0] // 10;
my @storages = $ARGV[1] ? (split /[\s,]+/, $ARGV[1]) : Hailo::Test::all_storages();
my @s = map {
    /SQLite/
    ? ([ $_, "$_/file",   { in_memory => 0 } ],
       [ $_, "$_/memory", { in_memory => 1 } ])
    : ([ $_, $_, {} ]);
} @storages;

my @s_str = map { $_->[0] } @s;

say "Testing @s_str";
sleep 1;

# Dir to store our training file / brains
my $dir = tempdir( "hailo-benchmark-XXXXX", CLEANUP => 1, TMPDIR => 1 );

my %hailos;
my %test;

# A uid for this test run
my @t = "a".."z";
my $toke = join q[], map { @t[rand @t] } 1 .. 10;

for my $s (@s) {
    my ($storage, $name, $opts) = @$s;
    my $i = 0; for my $cnt (1 .. $test_count) { $i++;
        my $st = $name;
        $st =~ s/[^A-Za-z]/-/g;
        my $tmpdir = tempdir( "$st-XXXXX", DIR => $dir, CLEANUP => 1 );
        my $hailo = Hailo::Test->new(
            tmpdir => $tmpdir,
            storage => $storage,
            brief => 1,
            %$opts,
            ($storage =~ /PostgreSQL|MySQL/
             ? (brain => "hailo_benchmark_db_test_${toke}_$i")
             : ()),
        );

        my $ok = $hailo->spawn_storage();

        pass "Created storage $storage $cnt/$test_count";

        # Push a hailo
        push @{ $hailos{$name} } => $hailo;
    }

    $test{$name} = sub {
        state $iter = 0;
        my $hailo = $hailos{$name}->[$iter];

        $hailo->test_all();

        $iter++;
    };
}

cmpthese($test_count, \%test);

done_testing();