Skip to content

Commit 850f70f

Browse files
authored
Merge pull request #122 from mbonneau/2.x_scheduler
Prevent static schedulers from being set more than once
2 parents b4d1cb7 + 2c084d6 commit 850f70f

File tree

2 files changed

+111
-0
lines changed

2 files changed

+111
-0
lines changed

src/Scheduler.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ public static function getDefault(): SchedulerInterface
2222

2323
public static function setDefault(SchedulerInterface $scheduler)
2424
{
25+
if (static::$default !== null) {
26+
throw new \Exception("Scheduler can only be set once. (Are you calling set after get?)");
27+
}
2528
static::$default = $scheduler;
2629
}
2730

@@ -43,11 +46,17 @@ public static function getImmediate(): ImmediateScheduler
4346

4447
public static function setAsync($async)
4548
{
49+
if (static::$async !== null) {
50+
throw new \Exception("Scheduler can only be set once. (Are you calling set after get?)");
51+
}
4652
self::$async = $async;
4753
}
4854

4955
public static function setImmediate($immediate)
5056
{
57+
if (static::$immediate !== null) {
58+
throw new \Exception("Scheduler can only be set once. (Are you calling set after get?)");
59+
}
5160
self::$immediate = $immediate;
5261
}
5362
}

test/Rx/SchedulerTest.php

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
<?php
2+
3+
namespace Rx;
4+
5+
use Rx\Scheduler\EventLoopScheduler;
6+
use Rx\Scheduler\ImmediateScheduler;
7+
use Rx\Testing\TestScheduler;
8+
9+
class SchedulerTest extends TestCase
10+
{
11+
private function resetStaticScheduler()
12+
{
13+
$ref = new \ReflectionClass(Scheduler::class);
14+
foreach (['default', 'async', 'immediate'] as $propertyName) {
15+
$prop = $ref->getProperty($propertyName);
16+
$prop->setAccessible(true);
17+
$prop->setValue(null);
18+
$prop->setAccessible(false);
19+
}
20+
}
21+
22+
public function setup()
23+
{
24+
$this->resetStaticScheduler();
25+
}
26+
27+
public function testGetDefaultConstructsEventLoopScheduler()
28+
{
29+
$scheduler = Scheduler::getDefault();
30+
31+
$this->assertInstanceOf(EventLoopScheduler::class, $scheduler);
32+
}
33+
34+
public function testSetDefault()
35+
{
36+
$scheduler = new TestScheduler();
37+
38+
Scheduler::setDefault($scheduler);
39+
40+
$this->assertSame($scheduler, Scheduler::getDefault());
41+
}
42+
43+
public function testSetAsync()
44+
{
45+
$scheduler = new TestScheduler();
46+
47+
Scheduler::setAsync($scheduler);
48+
49+
$this->assertSame($scheduler, Scheduler::getAsync());
50+
}
51+
52+
public function testSetImmediate()
53+
{
54+
$scheduler = new ImmediateScheduler();
55+
56+
Scheduler::setImmediate($scheduler);
57+
58+
$this->assertSame($scheduler, Scheduler::getImmediate());
59+
}
60+
61+
/**
62+
* @expectedException \Exception
63+
*/
64+
public function testSetDefaultTwiceThrowsException()
65+
{
66+
$scheduler = new TestScheduler();
67+
68+
Scheduler::setDefault($scheduler);
69+
70+
$scheduler2 = new TestScheduler();
71+
72+
Scheduler::setDefault($scheduler2);
73+
}
74+
75+
/**
76+
* @expectedException \Exception
77+
*/
78+
public function testSetAsyncTwiceThrowsException()
79+
{
80+
$scheduler = new TestScheduler();
81+
82+
Scheduler::setAsync($scheduler);
83+
84+
$scheduler2 = new TestScheduler();
85+
86+
Scheduler::setAsync($scheduler2);
87+
}
88+
89+
/**
90+
* @expectedException \Exception
91+
*/
92+
public function testSetImmediateTwiceThrowsException()
93+
{
94+
$scheduler = new ImmediateScheduler();
95+
96+
Scheduler::setImmediate($scheduler);
97+
98+
$scheduler2 = new ImmediateScheduler();
99+
100+
Scheduler::setImmediate($scheduler2);
101+
}
102+
}

0 commit comments

Comments
 (0)