Reworked the DaemonCommand.
* Accepts options for PID and log file. * Uses posix_kill whenever available. * Checks that the daemon actually started or stopped. * Try to terminate then kill the daemon. * Uses the logger or output instead of "echo". Added a ProcessControl interface and implementations. Closed #908
This commit is contained in:
parent
15b6917f68
commit
4edefee761
11 changed files with 572 additions and 45 deletions
17
Tests/PHPCI/ProcessControl/PosixProcessControlTest.php
Normal file
17
Tests/PHPCI/ProcessControl/PosixProcessControlTest.php
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
<?php
|
||||
namespace Tests\PHPCI\ProcessControl;
|
||||
|
||||
use PHPCI\ProcessControl\PosixProcessControl;
|
||||
|
||||
class PosixProcessControlTest extends UnixProcessControlTest
|
||||
{
|
||||
protected function setUp()
|
||||
{
|
||||
$this->object = new PosixProcessControl();
|
||||
}
|
||||
|
||||
public function testIsAvailable()
|
||||
{
|
||||
$this->assertEquals(function_exists('posix_kill'), PosixProcessControl::isAvailable());
|
||||
}
|
||||
}
|
||||
126
Tests/PHPCI/ProcessControl/ProcessControlTest.php
Normal file
126
Tests/PHPCI/ProcessControl/ProcessControlTest.php
Normal file
|
|
@ -0,0 +1,126 @@
|
|||
<?php
|
||||
namespace Tests\PHPCI\ProcessControl;
|
||||
|
||||
/**
|
||||
* Some helpers to
|
||||
*/
|
||||
abstract class ProcessControlTest extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
/**
|
||||
* @var type
|
||||
*/
|
||||
protected $process;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $pipes;
|
||||
|
||||
/**
|
||||
* @var \PHPCI\ProcessControl\ProcessControlInterface
|
||||
*/
|
||||
protected $object;
|
||||
|
||||
/** Starts a process.
|
||||
*
|
||||
* @return int The PID of the process.
|
||||
*/
|
||||
protected function startProcess()
|
||||
{
|
||||
$desc = array(array("pipe", "r"), array("pipe", "w"), array("pipe", "w"));
|
||||
$this->pipes = array();
|
||||
|
||||
$this->process = proc_open($this->getTestCommand(), $desc, $this->pipes);
|
||||
usleep(500);
|
||||
|
||||
$this->assertTrue(is_resource($this->process));
|
||||
$this->assertTrue($this->isRunning());
|
||||
|
||||
$status = proc_get_status($this->process);
|
||||
return $status['pid'];
|
||||
}
|
||||
|
||||
/** End the running process.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
protected function endProcess()
|
||||
{
|
||||
if (!is_resource($this->process)) {
|
||||
return;
|
||||
}
|
||||
array_map('fclose', $this->pipes);
|
||||
$exitCode = proc_close($this->process);
|
||||
$this->assertFalse($this->isRunning());
|
||||
$this->process = null;
|
||||
return $exitCode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
protected function isRunning()
|
||||
{
|
||||
if (!is_resource($this->process)) {
|
||||
return false;
|
||||
}
|
||||
$status = proc_get_status($this->process);
|
||||
return $status['running'];
|
||||
}
|
||||
|
||||
public function testIsRunning()
|
||||
{
|
||||
if (!$this->object->isAvailable()) {
|
||||
$this->markTestSkipped();
|
||||
}
|
||||
|
||||
$pid = $this->startProcess();
|
||||
|
||||
$this->assertTrue($this->object->isRunning($pid));
|
||||
|
||||
fwrite($this->pipes[0], PHP_EOL);
|
||||
|
||||
$exitCode = $this->endProcess();
|
||||
|
||||
$this->assertEquals(0, $exitCode);
|
||||
$this->assertFalse($this->object->isRunning($pid));
|
||||
}
|
||||
|
||||
public function testSoftKill()
|
||||
{
|
||||
if (!$this->object->isAvailable()) {
|
||||
$this->markTestSkipped();
|
||||
}
|
||||
|
||||
$pid = $this->startProcess();
|
||||
|
||||
$this->object->kill($pid);
|
||||
usleep(500);
|
||||
|
||||
$this->assertFalse($this->isRunning());
|
||||
}
|
||||
|
||||
public function testForcefullyKill()
|
||||
{
|
||||
if (!$this->object->isAvailable()) {
|
||||
$this->markTestSkipped();
|
||||
}
|
||||
|
||||
$pid = $this->startProcess();
|
||||
|
||||
$this->object->kill($pid, true);
|
||||
usleep(500);
|
||||
|
||||
$this->assertFalse($this->isRunning());
|
||||
}
|
||||
|
||||
abstract public function testIsAvailable();
|
||||
|
||||
abstract public function getTestCommand();
|
||||
|
||||
protected function tearDown()
|
||||
{
|
||||
parent::tearDown();
|
||||
$this->endProcess();
|
||||
}
|
||||
}
|
||||
22
Tests/PHPCI/ProcessControl/UnixProcessControlTest.php
Normal file
22
Tests/PHPCI/ProcessControl/UnixProcessControlTest.php
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
namespace Tests\PHPCI\ProcessControl;
|
||||
|
||||
use PHPCI\ProcessControl\UnixProcessControl;
|
||||
|
||||
class UnixProcessControlTest extends ProcessControlTest
|
||||
{
|
||||
protected function setUp()
|
||||
{
|
||||
$this->object = new UnixProcessControl();
|
||||
}
|
||||
|
||||
public function getTestCommand()
|
||||
{
|
||||
return "read SOMETHING";
|
||||
}
|
||||
|
||||
public function testIsAvailable()
|
||||
{
|
||||
$this->assertEquals(DIRECTORY_SEPARATOR === '/', UnixProcessControl::isAvailable());
|
||||
}
|
||||
}
|
||||
22
Tests/PHPCI/ProcessControl/WindowsProcessControlTest.php
Normal file
22
Tests/PHPCI/ProcessControl/WindowsProcessControlTest.php
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
namespace Tests\PHPCI\ProcessControl;
|
||||
|
||||
use PHPCI\ProcessControl\WindowsProcessControl;
|
||||
|
||||
class WindowsProcessControlTest extends ProcessControlTest
|
||||
{
|
||||
protected function setUp()
|
||||
{
|
||||
$this->object = new WindowsProcessControl;
|
||||
}
|
||||
|
||||
public function getTestCommand()
|
||||
{
|
||||
return "pause";
|
||||
}
|
||||
|
||||
public function testIsAvailable()
|
||||
{
|
||||
$this->assertEquals(DIRECTORY_SEPARATOR === '\\', WindowsProcessControl::isAvailable());
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue