Skip to content

Commit 53d10e3

Browse files
committed
fake the actual memory usage
1 parent b85988e commit 53d10e3

5 files changed

Lines changed: 65 additions & 14 deletions

File tree

src/Messenger/WorkerMemoryUsageSubscriber.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@
77
use Psr\Log\LoggerInterface;
88
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
99
use Symfony\Component\Messenger\Event\WorkerRunningEvent;
10+
use WonderNetwork\SlimKernel\System\RealSystem;
11+
use WonderNetwork\SlimKernel\System\System;
1012

1113
final class WorkerMemoryUsageSubscriber implements EventSubscriberInterface {
1214
private int $memoryUsage;
15+
private readonly System $system;
1316

1417
/**
1518
* @return iterable<string,string>
@@ -23,12 +26,14 @@ public static function getSubscribedEvents(): iterable {
2326
public function __construct(
2427
private readonly LoggerInterface $logger,
2528
private readonly int $cutoff = 1024,
29+
System $system = null,
2630
) {
27-
$this->memoryUsage = memory_get_usage();
31+
$this->system = $system ?? new RealSystem();
32+
$this->memoryUsage = $this->system->memoryUsage();
2833
}
2934

3035
public function onWorkerRunning(): void {
31-
$currentUsage = memory_get_usage();
36+
$currentUsage = $this->system->memoryUsage();
3237

3338
$difference = abs($this->memoryUsage - $currentUsage);
3439

src/System/RealSystem.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace WonderNetwork\SlimKernel\System;
6+
7+
final readonly class RealSystem implements System {
8+
public function memoryUsage(): int {
9+
return memory_get_usage();
10+
}
11+
}

src/System/System.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace WonderNetwork\SlimKernel\System;
6+
7+
interface System {
8+
public function memoryUsage(): int;
9+
}

tests/Messenger/WorkerMemoryUsageSubscriberTest.php

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,31 +7,40 @@
77
use Monolog\Handler\TestHandler;
88
use Monolog\Logger;
99
use PHPUnit\Framework\TestCase;
10+
use WonderNetwork\SlimKernel\System\FakeSystem;
1011

1112
final class WorkerMemoryUsageSubscriberTest extends TestCase {
1213
public function testReportsAboveCutoff(): void {
1314
$buffer = new TestHandler();
1415
$logger = new Logger('some');
1516
$logger->pushHandler($buffer);
16-
$memoryLeak = [];
1717

18-
$sut = new WorkerMemoryUsageSubscriber($logger, cutoff: 10 * 1024);
18+
$system = new FakeSystem();
19+
20+
$sut = new WorkerMemoryUsageSubscriber(
21+
logger: $logger,
22+
cutoff: 10 * 1024,
23+
system: $system,
24+
);
1925
$sut->onWorkerRunning();
2026
self::assertEmpty($buffer->getRecords());
2127

22-
$memoryLeak[] = str_repeat(' ', 10 * 1024);
23-
// triggers the first log
24-
$sut->onWorkerRunning();
25-
self::assertCount(1, $buffer->getRecords());
26-
// the logs themselves take memory, so:
28+
$system->setMemoryUsage(10 * 1024 - 1);
2729
$sut->onWorkerRunning();
28-
self::assertCount(2, $buffer->getRecords());
29-
// no more logs:
30+
self::assertCount(0, $buffer->getRecords());
31+
32+
$system->setMemoryUsage(10 * 1024);
3033
$sut->onWorkerRunning();
34+
self::assertCount(1, $buffer->getRecords());
35+
self::assertSame([
36+
'current' => '10 KB',
37+
'sign' => '+',
38+
'difference' => '10 KB',
39+
], $buffer->getRecords()[0]->context);
40+
3141
$sut->onWorkerRunning();
42+
$system->setMemoryUsage(12 * 1024);
3243
$sut->onWorkerRunning();
33-
self::assertCount(2, $buffer->getRecords());
34-
35-
unset($memoryLeak);
44+
self::assertCount(1, $buffer->getRecords());
3645
}
3746
}

tests/System/FakeSystem.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace WonderNetwork\SlimKernel\System;
6+
7+
final class FakeSystem implements System {
8+
private int $memoryUsage = 0;
9+
10+
public function setMemoryUsage(int $memoryUsage): void {
11+
$this->memoryUsage = $memoryUsage;
12+
}
13+
14+
public function memoryUsage(): int {
15+
return $this->memoryUsage;
16+
}
17+
}

0 commit comments

Comments
 (0)