59 lines
3.7 KiB
PHP
59 lines
3.7 KiB
PHP
<?php
|
|
|
|
it('services broker transport before replaying queued outbox items', function (): void {
|
|
$agentSource = (string)file_get_contents(app_path('resources/edge-gateway-agent/agent.php'));
|
|
$runOffset = strpos($agentSource, 'public function run(): void');
|
|
expect($runOffset)->not->toBeFalse();
|
|
|
|
$loopSource = substr($agentSource, (int)$runOffset, 1800);
|
|
$configureOffset = strpos($loopSource, '$this->configureBrokerClient();');
|
|
$pumpOffset = strpos($loopSource, '$this->pumpBrokerTransport();');
|
|
$flushOffset = strpos($loopSource, '$this->flushOutbox();');
|
|
|
|
expect($configureOffset)->not->toBeFalse()
|
|
->and($pumpOffset)->not->toBeFalse()
|
|
->and($flushOffset)->not->toBeFalse()
|
|
->and((int)$configureOffset)->toBeLessThan((int)$pumpOffset)
|
|
->and((int)$pumpOffset)->toBeLessThan((int)$flushOffset);
|
|
});
|
|
|
|
it('bounds stale outbox replay so it cannot monopolize the gateway loop', function (): void {
|
|
$agentSource = (string)file_get_contents(app_path('resources/edge-gateway-agent/agent.php'));
|
|
|
|
expect($agentSource)->toContain('private const OUTBOX_REPLAY_BATCH_LIMIT = 3;')
|
|
->and($agentSource)->toContain('private const OUTBOX_REPLAY_TIMEOUT_SECONDS = 3;')
|
|
->and($agentSource)->toContain('private const OUTBOX_OPERATION_COMPLETE_REPLAY_TIMEOUT_SECONDS = 10;')
|
|
->and($agentSource)->toContain('private const OUTBOX_REPLAY_FAILURE_COOLDOWN_SECONDS = 15;')
|
|
->and($agentSource)->toContain('private int $lastOutboxFailureAt = 0;')
|
|
->and($agentSource)->toContain('$this->stateStore->queuedItems(self::OUTBOX_REPLAY_BATCH_LIMIT)')
|
|
->and($agentSource)->toContain('private function shouldSkipOutboxReplay(): bool')
|
|
->and($agentSource)->toContain('$this->lastOutboxFailureAt = time();')
|
|
->and($agentSource)->toContain('? self::OUTBOX_OPERATION_COMPLETE_REPLAY_TIMEOUT_SECONDS')
|
|
->and($agentSource)->toContain(': self::OUTBOX_REPLAY_TIMEOUT_SECONDS;');
|
|
});
|
|
|
|
it('keeps draining API command jobs while broker transport is connected', function (): void {
|
|
$agentSource = (string)file_get_contents(app_path('resources/edge-gateway-agent/agent.php'));
|
|
$runOffset = strpos($agentSource, 'public function run(): void');
|
|
expect($runOffset)->not->toBeFalse();
|
|
|
|
$loopSource = substr($agentSource, (int)$runOffset, 1900);
|
|
|
|
expect($agentSource)->toContain('private const BROKER_CONNECTED_COMMAND_POLL_INTERVAL_SECONDS = 1;')
|
|
->and($agentSource)->toContain('private int $lastBrokerConnectedCommandPollAt = 0;')
|
|
->and($agentSource)->toContain('private function shouldPollApiCommandQueue(bool $brokerConnected): bool')
|
|
->and($agentSource)->toContain('private function processCommandQueue(?int $waitSecondsOverride = null): void')
|
|
->and($loopSource)->toContain('$brokerConnected = $this->isBrokerConnected();')
|
|
->and($loopSource)->toContain('if (!$brokerConnected) {')
|
|
->and($loopSource)->toContain('$processedManagementOperation = $this->processManagementOperation();')
|
|
->and($loopSource)->toContain('$this->processCommandQueue($brokerConnected ? 0 : null);');
|
|
});
|
|
|
|
it('uses a short control-plane timeout for self-serve machine signals before queueing', function (): void {
|
|
$agentSource = (string)file_get_contents(app_path('resources/edge-gateway-agent/agent.php'));
|
|
|
|
expect($agentSource)->toContain('private const MACHINE_SIGNAL_TIMEOUT_SECONDS = 3;')
|
|
->and($agentSource)->toContain('private function sendControlPlaneEvent(string $endpoint, array $payload, string $type, int $timeoutSeconds = 20): bool')
|
|
->and($agentSource)->toContain("'machine_signal',\n self::MACHINE_SIGNAL_TIMEOUT_SECONDS");
|
|
});
|