Skip to content

Commit 5d2d64b

Browse files
committed
Refactor internal ReactiveHandler to inject LogStreamHandler object
1 parent d5e2fea commit 5d2d64b

3 files changed

Lines changed: 31 additions & 78 deletions

File tree

src/App.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace FrameworkX;
44

5+
use FrameworkX\Io\LogStreamHandler;
56
use FrameworkX\Io\MiddlewareHandler;
67
use FrameworkX\Io\ReactiveHandler;
78
use FrameworkX\Io\RedirectHandler;
@@ -126,7 +127,7 @@ public function __construct(...$middleware)
126127

127128
$this->router = $router;
128129
$this->handler = new MiddlewareHandler($handlers);
129-
$this->sapi = \PHP_SAPI === 'cli' ? new ReactiveHandler($container->getEnv('X_LISTEN')) : new SapiHandler();
130+
$this->sapi = \PHP_SAPI === 'cli' ? new ReactiveHandler(new LogStreamHandler('php://output'), $container->getEnv('X_LISTEN')) : new SapiHandler();
130131
}
131132

132133
/**

src/Io/ReactiveHandler.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ class ReactiveHandler
2929
/** @var string */
3030
private $listenAddress;
3131

32-
public function __construct(?string $listenAddress)
32+
/** @throws void */
33+
public function __construct(LogStreamHandler $logger, ?string $listenAddress)
3334
{
34-
/** @throws void */
35-
$this->logger = new LogStreamHandler('php://output');
35+
$this->logger = $logger;
3636
$this->listenAddress = $listenAddress ?? '127.0.0.1:8080';
3737
}
3838

tests/Io/ReactiveHandlerTest.php

Lines changed: 26 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,11 @@ public function testRunWillReportDefaultListeningAddressAndRunLoop(): void
2323
assert(is_resource($socket));
2424
fclose($socket);
2525

26-
$handler = new ReactiveHandler(null);
27-
2826
$logger = $this->createMock(LogStreamHandler::class);
2927
$logger->expects($this->atLeastOnce())->method('log')->withConsecutive(['Listening on http://127.0.0.1:8080']);
28+
assert($logger instanceof LogStreamHandler);
3029

31-
// $handler->logger = $logger;
32-
$ref = new \ReflectionProperty($handler, 'logger');
33-
if (PHP_VERSION_ID < 80100) {
34-
$ref->setAccessible(true);
35-
}
36-
$ref->setValue($handler, $logger);
30+
$handler = new ReactiveHandler($logger, null);
3731

3832
// lovely: remove socket server on next tick to terminate loop
3933
Loop::futureTick(function () {
@@ -58,17 +52,11 @@ public function testRunWillReportGivenListeningAddressAndRunLoop(): void
5852
assert(is_string($addr));
5953
fclose($socket);
6054

61-
$handler = new ReactiveHandler($addr);
62-
6355
$logger = $this->createMock(LogStreamHandler::class);
6456
$logger->expects($this->atLeastOnce())->method('log')->withConsecutive(['Listening on http://' . $addr]);
57+
assert($logger instanceof LogStreamHandler);
6558

66-
// $handler->logger = $logger;
67-
$ref = new \ReflectionProperty($handler, 'logger');
68-
if (PHP_VERSION_ID < 80100) {
69-
$ref->setAccessible(true);
70-
}
71-
$ref->setValue($handler, $logger);
59+
$handler = new ReactiveHandler($logger, $addr);
7260

7361
// lovely: remove socket server on next tick to terminate loop
7462
Loop::futureTick(function () {
@@ -87,17 +75,11 @@ public function testRunWillReportGivenListeningAddressAndRunLoop(): void
8775

8876
public function testRunWillReportGivenListeningAddressWithRandomPortAndRunLoop(): void
8977
{
90-
$handler = new ReactiveHandler('127.0.0.1:0');
91-
9278
$logger = $this->createMock(LogStreamHandler::class);
9379
$logger->expects($this->atLeastOnce())->method('log')->withConsecutive([$this->matches('Listening on http://127.0.0.1:%d')]);
80+
assert($logger instanceof LogStreamHandler);
9481

95-
// $handler->logger = $logger;
96-
$ref = new \ReflectionProperty($handler, 'logger');
97-
if (PHP_VERSION_ID < 80100) {
98-
$ref->setAccessible(true);
99-
}
100-
$ref->setValue($handler, $logger);
82+
$handler = new ReactiveHandler($logger, '127.0.0.1:0');
10183

10284
// lovely: remove socket server on next tick to terminate loop
10385
Loop::futureTick(function () {
@@ -116,16 +98,10 @@ public function testRunWillReportGivenListeningAddressWithRandomPortAndRunLoop()
11698

11799
public function testRunWillRestartLoopUntilSocketIsClosed(): void
118100
{
119-
$handler = new ReactiveHandler('127.0.0.1:0');
120-
121101
$logger = $this->createMock(LogStreamHandler::class);
102+
assert($logger instanceof LogStreamHandler);
122103

123-
// $handler->logger = $logger;
124-
$ref = new \ReflectionProperty($handler, 'logger');
125-
if (PHP_VERSION_ID < 80100) {
126-
$ref->setAccessible(true);
127-
}
128-
$ref->setValue($handler, $logger);
104+
$handler = new ReactiveHandler($logger, '127.0.0.1:0');
129105

130106
// lovely: remove socket server on next tick to terminate loop
131107
Loop::futureTick(function () use ($logger) {
@@ -155,16 +131,10 @@ public function testRunWillListenForHttpRequestAndSendBackHttpResponseOverSocket
155131
assert(is_string($addr));
156132
fclose($socket);
157133

158-
$handler = new ReactiveHandler($addr);
159-
160134
$logger = $this->createMock(LogStreamHandler::class);
135+
assert($logger instanceof LogStreamHandler);
161136

162-
// $handler->logger = $logger;
163-
$ref = new \ReflectionProperty($handler, 'logger');
164-
if (PHP_VERSION_ID < 80100) {
165-
$ref->setAccessible(true);
166-
}
167-
$ref->setValue($handler, $logger);
137+
$handler = new ReactiveHandler($logger, $addr);
168138

169139
Loop::futureTick(function () use ($addr): void {
170140
$connector = new Connector();
@@ -206,16 +176,10 @@ public function testRunWillOnlyRestartLoopAfterAwaitingWhenFibersAreNotAvailable
206176
assert(is_string($addr));
207177
fclose($socket);
208178

209-
$handler = new ReactiveHandler($addr);
210-
211179
$logger = $this->createMock(LogStreamHandler::class);
180+
assert($logger instanceof LogStreamHandler);
212181

213-
// $handler->logger = $logger;
214-
$ref = new \ReflectionProperty($handler, 'logger');
215-
if (PHP_VERSION_ID < 80100) {
216-
$ref->setAccessible(true);
217-
}
218-
$ref->setValue($handler, $logger);
182+
$handler = new ReactiveHandler($logger, $addr);
219183

220184
Loop::futureTick(function () use ($addr, $logger): void {
221185
$connector = new Connector();
@@ -276,16 +240,10 @@ public function testRunWillReportHttpErrorForInvalidClientRequest(): void
276240
assert(is_string($addr));
277241
fclose($socket);
278242

279-
$handler = new ReactiveHandler($addr);
280-
281243
$logger = $this->createMock(LogStreamHandler::class);
244+
assert($logger instanceof LogStreamHandler);
282245

283-
// $handler->logger = $logger;
284-
$ref = new \ReflectionProperty($handler, 'logger');
285-
if (PHP_VERSION_ID < 80100) {
286-
$ref->setAccessible(true);
287-
}
288-
$ref->setValue($handler, $logger);
246+
$handler = new ReactiveHandler($logger, $addr);
289247

290248
Loop::futureTick(function () use ($addr, $logger): void {
291249
$connector = new Connector();
@@ -320,17 +278,11 @@ public function testRunWillReportHttpErrorForInvalidClientRequest(): void
320278
*/
321279
public function testRunWillStopWhenReceivingSigint(): void
322280
{
323-
$handler = new ReactiveHandler('127.0.0.1:0');
324-
325281
$logger = $this->createMock(LogStreamHandler::class);
326282
$logger->expects($this->exactly(2))->method('log');
283+
assert($logger instanceof LogStreamHandler);
327284

328-
// $handler->logger = $logger;
329-
$ref = new \ReflectionProperty($handler, 'logger');
330-
if (PHP_VERSION_ID < 80100) {
331-
$ref->setAccessible(true);
332-
}
333-
$ref->setValue($handler, $logger);
285+
$handler = new ReactiveHandler($logger, '127.0.0.1:0');
334286

335287
Loop::futureTick(function () use ($logger) {
336288
$logger->expects($this->once())->method('log')->with('Received SIGINT, stopping loop');
@@ -350,16 +302,10 @@ public function testRunWillStopWhenReceivingSigint(): void
350302
*/
351303
public function testRunWillStopWhenReceivingSigterm(): void
352304
{
353-
$handler = new ReactiveHandler('127.0.0.1:0');
354-
355305
$logger = $this->createMock(LogStreamHandler::class);
306+
assert($logger instanceof LogStreamHandler);
356307

357-
// $handler->logger = $logger;
358-
$ref = new \ReflectionProperty($handler, 'logger');
359-
if (PHP_VERSION_ID < 80100) {
360-
$ref->setAccessible(true);
361-
}
362-
$ref->setValue($handler, $logger);
308+
$handler = new ReactiveHandler($logger, '127.0.0.1:0');
363309

364310
Loop::futureTick(function () use ($logger) {
365311
$logger->expects($this->once())->method('log')->with('Received SIGTERM, stopping loop');
@@ -374,7 +320,10 @@ public function testRunWillStopWhenReceivingSigterm(): void
374320

375321
public function testRunWithEmptyAddressThrows(): void
376322
{
377-
$handler = new ReactiveHandler('');
323+
$logger = $this->createMock(LogStreamHandler::class);
324+
assert($logger instanceof LogStreamHandler);
325+
326+
$handler = new ReactiveHandler($logger, '');
378327

379328
$this->expectException(\InvalidArgumentException::class);
380329
$handler->run(function (): void { });
@@ -391,7 +340,10 @@ public function testRunWithBusyPortThrows(): void
391340
$this->markTestSkipped('System does not prevent listening on same address twice');
392341
}
393342

394-
$handler = new ReactiveHandler($addr);
343+
$logger = $this->createMock(LogStreamHandler::class);
344+
assert($logger instanceof LogStreamHandler);
345+
346+
$handler = new ReactiveHandler($logger, $addr);
395347

396348
$this->expectException(\RuntimeException::class);
397349
$this->expectExceptionMessage('Failed to listen on');

0 commit comments

Comments
 (0)