1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
<?php
namespace Illuminate\Tests\Integration\Concurrency;
use Exception;
use Illuminate\Concurrency\ProcessDriver;
use Illuminate\Foundation\Application;
use Illuminate\Process\Factory as ProcessFactory;
use Illuminate\Support\Facades\Concurrency;
use Orchestra\Testbench\TestCase;
use PHPUnit\Framework\Attributes\RequiresOperatingSystem;
#[RequiresOperatingSystem('Linux|DAR')]
class ConcurrencyTest extends TestCase
{
protected function setUp(): void
{
$this->defineCacheRoutes(<<<PHP
<?php
use Illuminate\Support\Facades\Concurrency;
use Illuminate\Support\Facades\Route;
Route::any('/concurrency', function () {
return Concurrency::run([
fn () => 1 + 1,
fn () => 2 + 2,
]);
});
PHP);
parent::setUp();
}
public function testWorkCanBeDistributed()
{
$response = $this->get('concurrency')
->assertOk();
[$first, $second] = $response->original;
$this->assertEquals(2, $first);
$this->assertEquals(4, $second);
}
public function testRunHandlerProcessErrorCode()
{
$this->expectException(Exception::class);
$app = new Application(__DIR__);
$processDriver = new ProcessDriver($app->make(ProcessFactory::class));
$processDriver->run([
fn () => exit(1),
]);
}
public function testRunHandlerProcessErrorWithDefaultExceptionWithoutParam()
{
$this->expectException(Exception::class);
$this->expectExceptionMessage('This is a different exception');
Concurrency::run([
fn () => throw new Exception(
'This is a different exception',
),
]);
}
public function testRunHandlerProcessErrorWithCustomExceptionWithoutParam()
{
$this->expectException(ExceptionWithoutParam::class);
$this->expectExceptionMessage('Test');
Concurrency::run([
fn () => throw new ExceptionWithoutParam('Test'),
]);
}
public function testRunHandlerProcessErrorWithCustomExceptionWithParam()
{
$this->expectException(ExceptionWithParam::class);
$this->expectExceptionMessage('API request to https://api.example.com failed with status 400 Bad Request');
Concurrency::run([
fn () => throw new ExceptionWithParam(
'https://api.example.com',
400,
'Bad Request',
'Invalid payload'
),
]);
}
}
class ExceptionWithoutParam extends Exception
{
}
class ExceptionWithParam extends Exception
{
public function __construct(
public string $uri,
public int $statusCode,
public string $reason,
public string|array $responseBody = '',
) {
parent::__construct("API request to {$uri} failed with status $statusCode $reason");
}
}
|