<?php 
 
use Forker\Forker; 
use Forker\Storage\ArrayStorage; 
 
class ForkerTest extends PHPUnit_Framework_TestCase 
{ 
 
    private $Forker = null; 
    private $tasks    = array(); 
 
    public function setUp() 
    { 
        $this->tasks = array( 
            'some', 'tasks', 'to', 'perform' 
        ); 
 
        $storageSystem    = new ArrayStorage; 
        $numberOfSubTasks = 4; 
        $this->Forker   = new Forker($storageSystem, $this->tasks, $numberOfSubTasks); 
    } 
 
    /** 
     * @expectedException Forker\Exception\ForkingErrorException 
     */ 
    public function testWeThrowExceptionIfForkingError() 
    { 
        $forkError = -1; 
 
        $mockForker = $this->getMock( 
            'Forker\Forker', 
            array('getChildProces', 'child', 'waitForMyChildren'), 
            array(new ArrayStorage, array()) 
        ); 
 
        $mockForker->expects($this->exactly(1)) 
            ->method('getChildProces') 
            ->will($this->returnValue($forkError)); 
 
        $mockForker->fork(function($foo) {}); 
    } 
 
    /** 
     * Each child should receive his task :) 
     */ 
    public function testWeCanSendSubTasksForEachChild() 
    { 
        return; 
        $storageSystem     = new ArrayStorage; 
        $numberOfSubTasks  = 4; 
 
        $mockForker = $this->getMock( 
            'Forker\Forker', 
            array('getChildProces', 'child', 'waitForMyChildren'), 
            array($storageSystem, $this->tasks, $numberOfSubTasks) 
        ); 
 
 
        $mockForker->expects($this->exactly(4)) 
            ->method('child'); 
 
        list($key,$value) = each($this->tasks); 
 
        $mockForker->expects($this->at(1)) 
            ->method('child') 
            ->with(array($key=>$value)); 
 
        list($key,$value) = each($this->tasks); 
        $mockForker->expects($this->at(3)) 
            ->method('child') 
            ->with(array($key=>$value)); 
 
        list($key,$value) = each($this->tasks); 
        $mockForker->expects($this->at(5)) 
            ->method('child') 
            ->with(array($key=>$value)); 
 
        list($key,$value) = each($this->tasks); 
        $mockForker->expects($this->at(7)) 
            ->method('child') 
            ->with(array($key=>$value)); 
 
        $mockForker->fork(function($foo) {}); 
    } 
 
    public function testWeCreateANewProcessForEachSubTask() 
    { 
        $storageSystem     = new ArrayStorage; 
        $childProcessValue = 7; 
        $numberOfSubTasks  = 4; 
 
        $mockForker = $this->getMock( 
            'Forker\Forker', 
            array('getChildProces',  'waitForMyChildren'), 
            array($storageSystem, $this->tasks, $numberOfSubTasks) 
        ); 
 
        $mockForker->expects($this->exactly(4)) 
            ->method('getChildProces') 
            ->will($this->returnValue($childProcessValue)); 
        $mockForker->fork(function($foo) {}); 
    } 
 
    public function testWeCanCalculateSafeNumberOfWorkers() 
    { 
 
        // we try to set here a non divisor as a number of subtasks 
        $numTasks = 16; 
        $numberOfSubTaks = 7; 
        $expectedNumOfWorkers = 8; 
 
        $this->assertEquals( 
            $expectedNumOfWorkers, 
            $this->Forker->calculateNumberOfWorkers($numTasks, $numberOfSubTaks) 
        ); 
 
        // If the number of sub tasks is a divisor of the number of tasks, let it 
        $numTasks = 6; 
        $numberOfSubTaks = 3; 
        $expectedNumOfWorkers = 3; 
 
        $this->assertEquals( 
            $expectedNumOfWorkers, 
            $this->Forker->calculateNumberOfWorkers($numTasks, $numberOfSubTaks) 
        ); 
 
        // If the number is greater, then we let the number of subtasks 
        $numTasks = 6; 
        $numberOfSubTaks = 12; 
        $expectedNumOfWorkers = 6; 
 
        $this->assertEquals( 
            $expectedNumOfWorkers, 
            $this->Forker->calculateNumberOfWorkers($numTasks, $numberOfSubTaks) 
        ); 
    } 
 
    public function testWeCanSplitTaks() 
    { 
 
        // half 
        $expectedTask = array(2=>'to', 3=>'perform'); 
        $indexTask    =1; 
        $numberOfSubTasks = 2; 
 
        $this->assertEquals( 
            $expectedTask, 
            $this->Forker->giveMeMyTask($indexTask, $numberOfSubTasks) 
        ); 
    } 
} 
 
 |