3 class WaitConditionLoopFakeTime
extends WaitConditionLoop
{
4 protected $wallClock = 1;
6 function __construct( callable
$condition, $timeout, array $busyCallbacks ) {
7 parent
::__construct( $condition, $timeout, $busyCallbacks );
10 function usleep( $microseconds ) {
11 $this->wallClock +
= $microseconds / 1e6
;
14 function getCpuTime() {
18 function getWallTime() {
19 return $this->wallClock
;
22 public function setWallClock( &$timestamp ) {
23 $this->wallClock
=& $timestamp;
27 class WaitConditionLoopTest
extends PHPUnit_Framework_TestCase
{
28 public function testCallbackReached() {
29 $wallClock = microtime( true );
32 $status = new StatusValue();
33 $loop = new WaitConditionLoopFakeTime(
34 function () use ( &$count, $status ) {
36 $status->value
= 'cookie';
38 return WaitConditionLoop
::CONDITION_REACHED
;
41 $this->newBusyWork( $x, $y, $z )
43 $this->assertEquals( $loop::CONDITION_REACHED
, $loop->invoke() );
44 $this->assertEquals( 1, $count );
45 $this->assertEquals( 'cookie', $status->value
);
46 $this->assertEquals( [ 0, 0, 0 ], [ $x, $y, $z ], "No busy work done" );
49 $loop = new WaitConditionLoopFakeTime(
50 function () use ( &$count, &$wallClock ) {
54 return $count >= 2 ? WaitConditionLoop
::CONDITION_REACHED
: false;
57 $this->newBusyWork( $x, $y, $z, $wallClock )
59 $this->assertEquals( $loop::CONDITION_REACHED
, $loop->invoke(),
60 "Busy work did not cause timeout" );
61 $this->assertEquals( [ 1, 0, 0 ], [ $x, $y, $z ] );
64 $loop = new WaitConditionLoopFakeTime(
65 function () use ( &$count, &$wallClock ) {
69 return $count > 80 ?
true : false;
72 $this->newBusyWork( $x, $y, $z, $wallClock, $dontCallMe, $badCalls )
74 $this->assertEquals( 0, $badCalls, "Callback exception not yet called" );
75 $this->assertEquals( $loop::CONDITION_REACHED
, $loop->invoke() );
76 $this->assertEquals( [ 1, 1, 1 ], [ $x, $y, $z ], "Busy work done" );
77 $this->assertEquals( 1, $badCalls, "Bad callback ran and was exception caught" );
82 } catch ( Exception
$e ) {
85 $this->assertInstanceOf( 'RunTimeException', $e );
86 $this->assertEquals( 1, $badCalls, "Callback exception cached" );
89 public function testCallbackTimeout() {
91 $wallClock = microtime( true );
92 $loop = new WaitConditionLoopFakeTime(
93 function () use ( &$count, &$wallClock ) {
97 return $count > 300 ?
true : false;
100 $this->newBusyWork( $x, $y, $z, $wallClock )
102 $loop->setWallClock( $wallClock );
103 $this->assertEquals( $loop::CONDITION_TIMED_OUT
, $loop->invoke() );
104 $this->assertEquals( [ 1, 1, 1 ], [ $x, $y, $z ], "Busy work done" );
106 $loop = new WaitConditionLoopFakeTime(
107 function () use ( &$count, &$wallClock ) {
114 $this->newBusyWork( $x, $y, $z, $wallClock )
116 $this->assertEquals( $loop::CONDITION_REACHED
, $loop->invoke() );
119 $loop = new WaitConditionLoopFakeTime(
120 function () use ( &$count, &$wallClock ) {
124 return $count > 10 ?
true : false;
127 $this->newBusyWork( $x, $y, $z, $wallClock )
129 $this->assertEquals( $loop::CONDITION_FAILED
, $loop->invoke() );
132 public function testCallbackAborted() {
134 $wallClock = microtime( true );
135 $loop = new WaitConditionLoopFakeTime(
136 function () use ( &$x, &$wallClock ) {
140 return $x > 2 ? WaitConditionLoop
::CONDITION_ABORTED
: false;
143 $this->newBusyWork( $x, $y, $z, $wallClock )
145 $loop->setWallClock( $wallClock );
146 $this->assertEquals( $loop::CONDITION_ABORTED
, $loop->invoke() );
149 private function newBusyWork(
150 &$x, &$y, &$z, &$wallClock = 1, &$dontCallMe = null, &$badCalls = 0
156 $list[] = function () use ( &$x, &$wallClock ) {
161 $dontCallMe = function () use ( &$badCalls ) {
163 throw new RuntimeException( "TrollyMcTrollFace" );
165 $list[] =& $dontCallMe;
166 $list[] = function () use ( &$y, &$wallClock ) {
171 $list[] = function () use ( &$z, &$wallClock ) {