The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# $Id$
# -*-perl-*-

use strict;
use warnings;

require 't/lib/db-common.pl';

use TheSchwartz;
use Test::More tests => 12;

run_tests(
    4,
    sub {
        my $client = test_client( dbs => [ 'ts1', 'ts2' ] );

        my $n_jobs = 60;
        for ( 1 .. $n_jobs ) {
            my $handle = $client->insert("Worker::Foo");
            die unless $handle;
        }

        my $db1 = DBI->connect( dsn_for("ts1"), $ENV{TS_DB_USER},
            $ENV{TS_DB_PASS} );
        my $db2 = DBI->connect( dsn_for("ts2"), $ENV{TS_DB_USER},
            $ENV{TS_DB_PASS} );
        die unless $db1 && $db2;

        my $jobs1 = $db1->selectrow_array("SELECT COUNT(*) FROM job");
        my $jobs2 = $db2->selectrow_array("SELECT COUNT(*) FROM job");
        is( $jobs1 + $jobs2, $n_jobs, "inserted all $n_jobs" );

        ok( $jobs1 > $n_jobs / 4,
            "at least a quarter of jobs went to db1 ($jobs1 / $n_jobs)" );
        ok( $jobs2 > $n_jobs / 4,
            "at least a quarter of jobs went to db1 ($jobs2 / $n_jobs)" );

        my $do_jobs = int( $n_jobs / 2 );
        $client->can_do("Worker::Foo");
        for ( 1 .. $do_jobs ) {
            $client->work_once
                or die;
        }

        my $jobs1b = $db1->selectrow_array("SELECT COUNT(*) FROM job");
        my $jobs2b = $db2->selectrow_array("SELECT COUNT(*) FROM job");

        my $remain_jobs = $n_jobs - $do_jobs;
        is( $jobs1b + $jobs2b, $remain_jobs, "expected jobs remain" );

        # deltas: how much work gone done each
        my $jobs1d = $jobs1 - $jobs1b;
        my $jobs2d = $jobs2 - $jobs2b;

        # difference in work done:
        my $workdiff = abs( $jobs1d - $jobs2d );

        teardown_dbs( 'ts1', 'ts2' );
    }
);

sub max { $_[0] > $_[1] ? $_[0] : $_[1] }

package Worker::Foo;
use base 'TheSchwartz::Worker';

sub work {
    my ( $class, $job ) = @_;
    $job->completed;
}