1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
|
# --
# Copyright (C) 2001-2021 OTRS AG, https://otrs.com/
# Copyright (C) 2021 Znuny GmbH, https://znuny.org/
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (GPL). If you
# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
# --
## no critic (Modules::RequireExplicitPackage)
use strict;
use warnings;
use utf8;
use vars (qw($Self));
my $HelperObject = $Kernel::OM->Get('Kernel::System::UnitTest::Helper');
my $Home = $Kernel::OM->Get('Kernel::Config')->Get('Home');
my $Daemon = $Home . '/bin/otrs.Daemon.pl';
# Get current daemon status.
my $PreviousDaemonStatus = `$Daemon status`;
# Check if there is permissions for daemon commands.
if ( !defined $PreviousDaemonStatus ) {
$Self->False(
0,
'Permission denied for deamon commands, skipping test',
);
return 1;
}
# Stop daemon if it was already running before this test.
if ( $PreviousDaemonStatus =~ m{Daemon running}i ) {
`$^X $Daemon stop`;
my $SleepTime = 2;
# Wait to get daemon fully stopped before test continues.
print "A running Daemon was detected and need to be stopped...\n";
print 'Sleeping ' . $SleepTime . "s\n";
sleep $SleepTime;
}
my $SchedulerDBObject = $Kernel::OM->Get('Kernel::System::Daemon::SchedulerDB');
my $TaskWorkerObject = $Kernel::OM->Get('Kernel::System::Daemon::DaemonModules::SchedulerTaskWorker');
my $RunTasks = sub {
local $SIG{CHLD} = "IGNORE";
my $ErrorMessage;
# Localize the standard error, to prevent redefining warnings.
# WARNING: This also hides any task run errors.
local *STDERR;
# Redirect the standard error to a variable.
open STDERR, ">>", \$ErrorMessage;
# Wait until task is executed.
ACTIVESLEEP:
for my $Sec ( 1 .. 120 ) {
# Run the worker.
$TaskWorkerObject->Run();
$TaskWorkerObject->_WorkerPIDsCheck();
my @List = $SchedulerDBObject->TaskList();
last ACTIVESLEEP if !scalar @List;
sleep 1;
print "Waiting $Sec secs for scheduler tasks to be executed\n";
}
};
$Self->True(
1,
"Initial Task Cleanup...",
);
$RunTasks->();
# Remove existing scheduled asynchronous tasks from DB, as they may interfere with tests run later.
my @AsyncTasks = $SchedulerDBObject->TaskList(
Type => 'AsynchronousExecutor',
);
for my $AsyncTask (@AsyncTasks) {
my $Success = $SchedulerDBObject->TaskDelete(
TaskID => $AsyncTask->{TaskID},
);
$Self->True(
$Success,
"TaskDelete - Removed scheduled asynchronous task $AsyncTask->{TaskID}",
);
}
my @Tests = (
{
Name => 'Synchronous Call',
Function => 'Execute',
},
{
Name => 'ASynchronous Call',
Function => 'ExecuteAsyc',
},
{
Name => 'ASynchronous Call With Object Name',
Function => 'ExecuteAsycWithObjectName',
},
);
# Make sure there is no other pending task to be executed.
my $Success = $TaskWorkerObject->Run();
$RunTasks->();
my $AsynchronousExecutorObject
= $Kernel::OM->Get('scripts::test::sample::AsynchronousExecutor::TestAsynchronousExecutor');
my $MainObject = $Kernel::OM->Get('Kernel::System::Main');
my @FileRemember;
for my $Test (@Tests) {
my $File = $Home . '/var/tmp/task_' . $HelperObject->GetRandomNumber();
if ( -e $File ) {
unlink $File;
}
push @FileRemember, $File;
my $Function = $Test->{Function};
$AsynchronousExecutorObject->$Function(
File => $File,
Success => 1,
);
if ( $Function eq 'ExecuteAsyc' || $Function eq 'ExecuteAsycWithObjectName' ) {
$TaskWorkerObject->Run();
$RunTasks->();
}
$Self->True(
-e $File,
"$Test->{Name} - $File exists with true",
);
my $ContentSCALARRef = $MainObject->FileRead(
Location => $File,
Mode => 'utf8',
Type => 'Local',
Result => 'SCALAR',
DisableWarnings => 1,
);
$Self->Is(
${$ContentSCALARRef},
'123',
"$Test->{Name} - $File content match",
);
}
# perform cleanup
for my $File (@FileRemember) {
if ( -e $File ) {
unlink $File;
}
$Self->True(
!-e $File,
"$File removed with true",
);
}
# start daemon if it was already running before this test
if ( $PreviousDaemonStatus =~ m{Daemon running}i ) {
system("perl $Daemon start");
}
1;
|