The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Test_Helper;

my $test_version;
BEGIN {
    sub skip_all {
        my ($msg) = @_;
        print "1..1\n",
              "ok - Skipped. $msg\n";
        exit;
    }

    if ($^O =~ /^(?:mswin|win)/i) {
        skip_all ('This module is not for Windows');        
    }
    use MySQL::Sandbox;
    $ENV{TEST_SANDBOX_HOME}="$ENV{PWD}/t/test_sb";
    $ENV{PERL5LIB}="$ENV{PWD}/lib";
    $ENV{PATH}="$ENV{PWD}/bin:$ENV{PATH}";
    $ENV{TEST_VERSION} = $ENV{TEST_VERSION} || '5.6.26';
    $ENV{SANDBOX_AS_ROOT} = 1;
    $test_version = $ENV{TEST_VERSION} ;
};

use strict;
use warnings;
use base qw( Exporter);
our @ISA= qw(Exporter);
our @EXPORT_OK= qw( test_sandbox find_plugindir skip_all confirm_version);
our @EXPORT = @EXPORT_OK;

sub get_version_parts
{
    my ($version) = @_;
    if ($version =~ /(\d+)\.(\d+)\.(\d+)/)
    {
        my ($major, $minor, $rev) = ($1, $2, $3) ;
        return ($major, $minor, $rev);
    }    
    else
    {
        die "# version $version does not have expected components"
    }
}

sub confirm_version
{
    my ($min_version, $max_version) = @_;
    my $will_skip =0;
    my ($major, $minor, $rev) = get_version_parts($test_version);
    my ($major1, $minor1, $rev1) = get_version_parts($min_version);
    my ($major2, $minor2, $rev2) = get_version_parts($max_version);
    my $compare_test = sprintf("%05d-%05d-%05d", $major,  $minor,  $rev);
    my $compare_min  = sprintf("%05d-%05d-%05d", $major1, $minor1, $rev1);
    my $compare_max  = sprintf("%05d-%05d-%05d", $major2, $minor2, $rev2);
    unless (($compare_test ge $compare_min) && ($compare_test le $compare_max))
    {
        warn "# Skipping version $test_version for this test. It is not in the required range ($min_version - $max_version)\n";
        print "1..1\n";
        print "ok 1 # Test version $test_version is not in the required range for this test ($min_version - $max_version)\n";
        exit;
    }
}

sub test_sandbox {
    my ($cmd, $expected_tests, $informative) = @_;
    unless ($cmd) {
        die "command expected\n";
    }
    unless ($expected_tests) {
        die "number of tests expected as second parameter\n";
    }
    $expected_tests =~ /^\d+$/
        or die "the 'expected tests' parameter must be a number \n";

    ##
    # accepts either a bare version 
    #   (e.g. 5.0.79)
    # or a tarball 
    #   (e.g. $HOME/downloads/mysql-5.0.79-osx10.5-x86.tar.gz)
    # or the path to a directory containing binaries
    #   (e.g. $HOME/opt/mysql/5.0.79)

    if (   ( -d $test_version) 
        or (( -f $test_version ) && ($test_version =~ /\.tar\.gz$/) )
        or ( -d "$ENV{HOME}/opt/mysql/$test_version")) {
        warn  "Testing <$test_version>. "
            . "Please wait. This will take a few minutes\n" if $informative;
        print "1..$expected_tests\n";
    }
    else {
        print "1..1\n";
        print "ok 1 # skip - no binaries found for $test_version\n";
        print " - See the README under 'TESTING' for more options.\n" if $informative;
        exit;
    }

    $ENV{TAP_MODE} =1;
    system ("$cmd --versions=$test_version ");
}

sub find_plugindir {
    my ($minimum_version, $maximum_version, $use_current) = @_;
    my $plugindir;

    if  ( 
        $ENV{SANDBOX_BINARY} 
        &&
        ( -d $ENV{SANDBOX_BINARY})
        ) 
    {
        #
        # finds the latest 5.x version
        #
        my $highest_version = '';
        my @versions = ();
        my @dirs =  sort { $b cmp $a } 
                    grep { ($_ ge $minimum_version) && ($_ le $maximum_version) }
                    map { m{(\d\.\d\.\d+)/?$}; $1 }
                        grep { /\d+\.\d+\.\d+/ } 
                        grep { -d $_ } 
                            glob("$ENV{SANDBOX_BINARY}/*/" ) ;
        unless (@dirs) {
            skip_all("no directories found under $ENV{SANDBOX_BINARY}");
        }
        $highest_version = $dirs[0];
        if ($highest_version lt $minimum_version)  {
            skip_all("no suitable version found for this test");
        }
        my $TEST_VERSION = $ENV{TEST_VERSION} || $highest_version;
        # print "<@dirs> <$highest_version> <$TEST_VERSION>\n";
        unless ( grep { $TEST_VERSION eq $_ } @dirs ) {
            #skip_all("$TEST_VERSION is not suitable for this test");
            $TEST_VERSION = $highest_version unless $use_current;
        }
        warn "# Testing plugin with <$TEST_VERSION>\n";
        $ENV{TEST_VERSION} = $TEST_VERSION;
        $plugindir = "$ENV{SANDBOX_BINARY}/$TEST_VERSION/lib/plugin";
        unless ( -d $plugindir) {
            $plugindir = "$ENV{SANDBOX_BINARY}/$TEST_VERSION/lib/mysql/plugin";
            unless ( -d $plugindir) {
                skip_all("Plugin directory for $TEST_VERSION not found");
            }
        }
    }
    else {
        skip_all('no $SANDBOX_BINARY found');
    }
    $ENV{'SB_PLUGIN_DIR'} = $plugindir;
}

1;

__END__