From 7fcbcffaf3d8f8f45116f260ade5a4942495d44a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Wed, 27 Dec 2017 18:13:08 +0100 Subject: [PATCH 1/2] Avoid PHPUnit warnings by using dummy assertions --- tests/AbstractLoopTest.php | 2 ++ tests/Timer/TimersTest.php | 2 ++ 2 files changed, 4 insertions(+) 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/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); } } From e4619fabaf7109e22f13078c079e5c5f70783396 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Wed, 27 Dec 2017 19:42:25 +0100 Subject: [PATCH 2/2] Improve timer tests to be less fragile by not blocking the loop --- tests/Timer/AbstractTimerTest.php | 96 +++++++++++++++++++++---------- 1 file changed, 65 insertions(+), 31 deletions(-) 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() pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

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:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy