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: 5 months 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)
        );
    }
}