diff --git a/tests/AbstractLoopTest.php b/tests/AbstractLoopTest.php index f07f6877..296bdc7e 100644 --- a/tests/AbstractLoopTest.php +++ b/tests/AbstractLoopTest.php @@ -262,6 +262,8 @@ public function testRemoveInvalid() // remove a valid stream from the event loop that was never added in the first place $this->loop->removeReadStream($stream); $this->loop->removeWriteStream($stream); + + $this->assertTrue(true); } /** @test */ diff --git a/tests/Timer/AbstractTimerTest.php b/tests/Timer/AbstractTimerTest.php index 28c7a421..15202e41 100644 --- a/tests/Timer/AbstractTimerTest.php +++ b/tests/Timer/AbstractTimerTest.php @@ -8,69 +8,103 @@ abstract class AbstractTimerTest extends TestCase { abstract public function createLoop(); - public function testAddTimer() + public function testAddTimerReturnsNonPeriodicTimerInstance() { - // usleep is intentionally high + $loop = $this->createLoop(); + + $timer = $loop->addTimer(0.001, $this->expectCallableNever()); + + $this->assertInstanceOf('React\EventLoop\TimerInterface', $timer); + $this->assertFalse($timer->isPeriodic()); + } + public function testAddTimerWillBeInvokedOnceAndBlocksLoopWhenRunning() + { $loop = $this->createLoop(); $loop->addTimer(0.001, $this->expectCallableOnce()); - usleep(1000); - $this->tickLoop($loop); + + $start = microtime(true); + $loop->run(); + $end = microtime(true); + + // make no strict assumptions about actual time interval. + // must be at least 0.001s (1ms) and should not take longer than 0.1s + $this->assertGreaterThanOrEqual(0.001, $end - $start); + $this->assertLessThan(0.1, $end - $start); } - public function testAddPeriodicTimer() + public function testAddPeriodicTimerReturnsPeriodicTimerInstance() { $loop = $this->createLoop(); - $loop->addPeriodicTimer(0.001, $this->expectCallableExactly(3)); - usleep(1000); - $this->tickLoop($loop); - usleep(1000); - $this->tickLoop($loop); - usleep(1000); - $this->tickLoop($loop); + $periodic = $loop->addPeriodicTimer(0.1, $this->expectCallableNever()); + + $this->assertInstanceOf('React\EventLoop\TimerInterface', $periodic); + $this->assertTrue($periodic->isPeriodic()); } - public function testAddPeriodicTimerWithCancel() + public function testAddPeriodicTimerWillBeInvokedUntilItIsCancelled() { $loop = $this->createLoop(); - $timer = $loop->addPeriodicTimer(0.001, $this->expectCallableExactly(2)); - - usleep(1000); - $this->tickLoop($loop); - usleep(1000); - $this->tickLoop($loop); + $periodic = $loop->addPeriodicTimer(0.1, $this->expectCallableExactly(3)); - $loop->cancelTimer($timer); + // make no strict assumptions about actual time interval. + // leave some room to ensure this ticks exactly 3 times. + $loop->addTimer(0.399, function () use ($loop, $periodic) { + $loop->cancelTimer($periodic); + }); - usleep(1000); - $this->tickLoop($loop); + $loop->run(); } - public function testAddPeriodicTimerCancelsItself() + public function testAddPeriodicTimerWillBeInvokedWithMaximumAccuracyUntilItIsCancelled() { + $loop = $this->createLoop(); + $i = 0; + $periodic = $loop->addPeriodicTimer(0.001, function () use (&$i) { + ++$i; + }); + + $loop->addTimer(0.02, function () use ($loop, $periodic) { + $loop->cancelTimer($periodic); + }); + + $loop->run(); + // make no strict assumptions about number of invocations. + // we know it must be no more than 20 times and should at least be + // invoked twice for really slow loops + $this->assertLessThanOrEqual(20, $i); + $this->assertGreaterThan(2, $i); + } + + public function testAddPeriodicTimerCancelsItself() + { $loop = $this->createLoop(); + $i = 0; $loop->addPeriodicTimer(0.001, function ($timer) use (&$i, $loop) { $i++; - if ($i == 2) { + if ($i === 5) { $loop->cancelTimer($timer); } }); - usleep(1000); - $this->tickLoop($loop); - usleep(1000); - $this->tickLoop($loop); - usleep(1000); - $this->tickLoop($loop); + $start = microtime(true); + $loop->run(); + $end = microtime(true); + + $this->assertEquals(5, $i); - $this->assertSame(2, $i); + // make no strict assumptions about time interval. + // 5 invocations must take at least 0.005s (5ms) and should not take + // longer than 0.1s for slower loops. + $this->assertGreaterThanOrEqual(0.005, $end - $start); + $this->assertLessThan(0.1, $end - $start); } public function testMinimumIntervalOneMicrosecond() diff --git a/tests/Timer/TimersTest.php b/tests/Timer/TimersTest.php index c70a39cd..a2cb134b 100644 --- a/tests/Timer/TimersTest.php +++ b/tests/Timer/TimersTest.php @@ -25,5 +25,7 @@ public function testBlockedTimer() })); $timers->tick(); + + $this->assertTrue(true); } }
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: