use Test::More tests => 18; use Forks::Super; use strict; use warnings; # exercise the tied scalar behaviors of some Forks::Super::Queue variables. $Forks::Super::MAIN_PID = $$; Forks::Super::Queue::init(); SKIP: { if ($Forks::Super::Queue::INHIBIT_QUEUE_MONITOR) { skip "queue monitor disabled", 18; } # $Forks::Super::Queue::QUEUE_MONITOR_FREQ # 1. may be assigned any value # 2. but fetched value is a positive integer # 3. on change, restarts the queue monitor $Forks::Super::Queue::QUEUE_MONITOR_FREQ = 30; ok(tied $Forks::Super::Queue::QUEUE_MONITOR_FREQ, "\$QUEUE_MONITOR_FREQ is tied"); ok($Forks::Super::Queue::QUEUE_MONITOR_FREQ == 30, "\$QUEUE_MONITOR_FREQ init"); $Forks::Super::Queue::QUEUE_MONITOR_FREQ = 10; ok($Forks::Super::Queue::QUEUE_MONITOR_FREQ == 10, "\$QUEUE_MONITOR_FREQ change"); $Forks::Super::Queue::QUEUE_MONITOR_FREQ = -50; ok($Forks::Super::Queue::QUEUE_MONITOR_FREQ > 0, "\$QUEUE_MONITOR_FREQ is positive"); $Forks::Super::Queue::QUEUE_MONITOR_FREQ = 30; ok(!defined $Forks::Super::Queue::QUEUE_MONITOR_PID, "\$QUEUE_MONITOR_PID not defined"); my $start_after = 5 + Time::HiRes::time(); my $job = Forks::Super::Job->new({ queue_priority => 0, style => 'sub', sub => sub { sleep 5 }, start_after => $start_after }); Forks::Super::Queue::queue_job($job); ok(defined $Forks::Super::Queue::QUEUE_MONITOR_PID, "\$QUEUE_MONITOR_PID defined after job put on queue"); my $qmpid = $Forks::Super::Queue::QUEUE_MONITOR_PID; $Forks::Super::Queue::QUEUE_MONITOR_FREQ = 60; ok(defined $Forks::Super::Queue::QUEUE_MONITOR_PID, ### 6 ### "Queue monitor still running after \$QUEUE_MONITOR_FREQ change"); ok($qmpid eq 'setitimer' || $Forks::Super::Queue::QUEUE_MONITOR_PID != $qmpid, "Queue monitor restarted after \$QUEUE_MONITOR_FREQ change"); $qmpid = $Forks::Super::Queue::QUEUE_MONITOR_PID; # $Forks::Super::Queue::INHIBIT_QUEUE_MONITOR # 1. takes on boolean values # 2. on change to true, kills queue monitor ok($Forks::Super::Queue::INHIBIT_QUEUE_MONITOR == 0 || $Forks::Super::Queue::INHIBIT_QUEUE_MONITOR == 1, "\$INHIBIT_QUEUE_MONITOR has a boolean value"); ok(tied $Forks::Super::Queue::INHIBIT_QUEUE_MONITOR, "\$INHIBIT_QUEUE_MONITOR is tied"); @Forks::Super::Queue::QUEUE = (); $Forks::Super::Queue::INHIBIT_QUEUE_MONITOR = ""; ok($Forks::Super::Queue::INHIBIT_QUEUE_MONITOR == 0, "\$INHIBIT_QUEUE_MONITOR has a boolean value"); Forks::Super::Queue::queue_job($job); $qmpid = $Forks::Super::Queue::QUEUE_MONITOR_PID; ok(defined($qmpid), "Queue monitor started when \$INHIBIT_QUEUE_MONITOR disabled"); $Forks::Super::Queue::INHIBIT_QUEUE_MONITOR = 5; ok($Forks::Super::Queue::INHIBIT_QUEUE_MONITOR == 1, "\$INHIBIT_QUEUE_MONITOR has a boolean value"); ok(!defined($Forks::Super::Queue::QUEUE_MONITOR_PID), "queue monitor disabled when \$INHIBIT_QUEUE_MONITOR enabled"); # $Forks::Super::QUEUE_INTERRUPT # 0. inherits from Forks::Super::Tie::Enum # 1. may only be assigned from valid signal names # 2. on change, restarts the queue monitor if (0 == keys %SIG) { skip "\%SIG not initialized. Can't test \$Forks::Super::QUEUE_INTERRUPT", 4; } if ($Forks::Super::SysInfo::CONFIG{'setitimer'}) { ok(1, "# \$Forks::Super::QUEUE_INTERRUPT not used in setitimer mode"); } else { ok(defined($SIG{$Forks::Super::QUEUE_INTERRUPT}), "\$QUEUE_INTERRUPT set to a valid signal name"); } my @sig = keys %SIG; my $qi = $Forks::Super::QUEUE_INTERRUPT; $Forks::Super::QUEUE_INTERRUPT = $sig[0]; ok($Forks::Super::QUEUE_INTERRUPT eq $sig[0], "\$QUEUE_INTERRUPT set to $sig[0]"); $Forks::Super::QUEUE_INTERRUPT = 'not a signal name'; ok($Forks::Super::QUEUE_INTERRUPT eq $sig[0], "\$QUEUE_INTERRUPT not set to bogus signal name"); ok(tied $Forks::Super::QUEUE_INTERRUPT, "\$QUEUE_INTERRUPT is tied"); } # end SKIP waitall;