# -*-perl-*- use strict; use warnings; require 't/lib/db-common.pl'; use TheSchwartz; use Test::More tests => 20; run_tests(10, sub { my $client = test_client(dbs => ['ts1']); my $handle = $client->insert("Worker::Foo", { cluster => 'all'}); ok($handle); my $job = Worker::Foo->grab_job($client); ok($job, "no addition jobs to be grabbed"); Worker::Foo->work_safely($job); $client->can_do("Worker::Foo"); $client->work_until_done; # should process 5 jobs. # finish a job by replacing it with nothing $handle = $client->insert("Worker::Foo", { cluster => 'gibberish'}); ok($handle->is_pending, "job is still pending"); $job = $handle->job; $job->replace_with(); ok(! $handle->is_pending, "job no longer pending"); teardown_dbs('ts1'); }); ############################################################################ package Worker::Foo; use base 'TheSchwartz::Worker'; use Test::More; ## Import test methods. sub work { my ($class, $job) = @_; my $args = $job->arg; if ($args->{cluster} eq "all") { ok(1, "got the expand job"); my @jobs; for (1..5) { push @jobs, TheSchwartz::Job->new_from_array("Worker::Foo", { cluster => $_ } ); } # which does a $job->completed iff all the @jobs, in one txn, insert # on the same database that $job was on. and it should DIE if the # transaction fails, just so txn flow doesn't proceed on accident. # then work_safely with catch the die and call $job->failed $job->replace_with(@jobs); return; } if ($args->{cluster} =~ /^\d+$/) { ok(1, "got job $args->{cluster}"); $job->completed; return; } # if anything were to fall through the bottom of here without # first calling fail/completed/replace_with, or dying, then the # work_safely wrapper should treat it as a "fall-through" failure # and log it, doing the whole retries/delay thing as with a # regular die. } sub grab_for { 30 }