Login   Register  
PHP Classes
elePHPant
Icontem

File: tests/unit/ForkerTest.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Daniel Martinez  >  Forker PHP  >  tests/unit/ForkerTest.php  >  Download  
File: tests/unit/ForkerTest.php
Role: Unit test script
Content type: text/plain
Description: Unit test script
Class: Forker PHP
Split tasks into multiple forked processes
Author: By
Last change: Changing indentation
Beginning splitting responsabilities
Date: 1 month ago
Size: 4,182 bytes
 

Contents

Class file image Download
<?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)
        );
    }
}