Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions src/Neo4j/Neo4jConnectionPool.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,12 @@
use Laudis\Neo4j\Databags\SessionConfiguration;
use Laudis\Neo4j\Enum\AccessMode;
use Laudis\Neo4j\Enum\RoutingRoles;
use Laudis\Neo4j\Exception\ConnectionPoolException;
use Psr\Http\Message\UriInterface;
use Psr\Log\LogLevel;
use Psr\SimpleCache\CacheInterface;

use function random_int;

use RuntimeException;

use function sprintf;
use function str_replace;
use function time;
Expand Down Expand Up @@ -165,7 +163,7 @@ public function acquire(SessionConfiguration $config): Generator
}

if ($table === null) {
throw new RuntimeException(sprintf('Cannot connect to host: "%s". Hosts tried: "%s"', $this->data->getUri()->getHost(), implode('", "', $triedAddresses)), previous: $latestError);
throw new ConnectionPoolException(sprintf('Cannot connect to host: "%s". Hosts tried: "%s"', $this->data->getUri()->getHost(), implode('", "', $triedAddresses)), previous: $latestError);
}

$server = $this->getNextServer($table, $config->getAccessMode());
Expand Down
3 changes: 2 additions & 1 deletion src/Neo4j/Neo4jDriver.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
use Laudis\Neo4j\Databags\ServerInfo;
use Laudis\Neo4j\Databags\SessionConfiguration;
use Laudis\Neo4j\Enum\AccessMode;
use Laudis\Neo4j\Exception\ConnectionPoolException;
use Laudis\Neo4j\Formatter\SummarizedResultFormatter;
use Psr\Http\Message\UriInterface;
use Psr\Log\LogLevel;
Expand Down Expand Up @@ -92,7 +93,7 @@ public function verifyConnectivity(?SessionConfiguration $config = null): bool
$config ??= SessionConfiguration::default();
try {
GeneratorHelper::getReturnFromGenerator($this->pool->acquire($config));
} catch (ConnectException $e) {
} catch (ConnectException|ConnectionPoolException $e) {
$this->pool->getLogger()?->log(LogLevel::WARNING, 'Could not connect to server on URI '.$this->parsedUrl->__toString(), ['error' => $e]);

return false;
Expand Down
122 changes: 122 additions & 0 deletions tests/Unit/ClientExceptionHandlingTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
<?php

declare(strict_types=1);

/*
* This file is part of the Neo4j PHP Client and Driver package.
*
* (c) Nagels <https://nagels.tech>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Laudis\Neo4j\Tests\Unit;

use Laudis\Neo4j\Client;
use Laudis\Neo4j\Common\DriverSetupManager;
use Laudis\Neo4j\Databags\SessionConfiguration;
use Laudis\Neo4j\Databags\TransactionConfiguration;
use PHPUnit\Framework\TestCase;
use RuntimeException;

final class ClientExceptionHandlingTest extends TestCase
{
public function testClientRunStatementWithFailingDriver(): void
{
$driverSetupManager = $this->createMock(DriverSetupManager::class);
$sessionConfig = SessionConfiguration::default();
$transactionConfig = TransactionConfiguration::default();

$driverSetupManager->method('getDriver')
->willThrowException(new RuntimeException(
'Cannot connect to any server on alias: default with Uris: (\'neo4j://node1:7687\', \'neo4j://node2:7687\')'
));

$client = new Client($driverSetupManager, $sessionConfig, $transactionConfig);

$this->expectException(RuntimeException::class);
$this->expectExceptionMessage('Cannot connect to any server on alias: default');
$client->run('RETURN 1 as n');
}

public function testClientWriteTransactionWithFailingDriver(): void
{
$driverSetupManager = $this->createMock(DriverSetupManager::class);
$sessionConfig = SessionConfiguration::default();
$transactionConfig = TransactionConfiguration::default();

$driverSetupManager->method('getDriver')
->willThrowException(new RuntimeException(
'Cannot connect to any server on alias: default with Uris: (\'neo4j://node1:7687\', \'neo4j://node2:7687\')'
));

$client = new Client($driverSetupManager, $sessionConfig, $transactionConfig);

$this->expectException(RuntimeException::class);
$this->expectExceptionMessage('Cannot connect to any server');

$client->writeTransaction(function () {
return 'test';
});
}

public function testClientReadTransactionWithFailingDriver(): void
{
$driverSetupManager = $this->createMock(DriverSetupManager::class);
$sessionConfig = SessionConfiguration::default();
$transactionConfig = TransactionConfiguration::default();

$driverSetupManager->method('getDriver')
->willThrowException(new RuntimeException(
'Cannot connect to any server on alias: default with Uris: (\'neo4j://node1:7687\', \'neo4j://node2:7687\')'
));

$client = new Client($driverSetupManager, $sessionConfig, $transactionConfig);

$this->expectException(RuntimeException::class);
$this->expectExceptionMessage('Cannot connect to any server');

$client->readTransaction(function () {
return 'test';
});
}

public function testClientBeginTransactionWithFailingDriver(): void
{
$driverSetupManager = $this->createMock(DriverSetupManager::class);
$sessionConfig = SessionConfiguration::default();
$transactionConfig = TransactionConfiguration::default();

$driverSetupManager->method('getDriver')
->willThrowException(new RuntimeException(
'Cannot connect to any server on alias: default with Uris: (\'neo4j://node1:7687\', \'neo4j://node2:7687\')'
));

$client = new Client($driverSetupManager, $sessionConfig, $transactionConfig);

$this->expectException(RuntimeException::class);
$this->expectExceptionMessage('Cannot connect to any server');

$client->beginTransaction();
}

public function testClientExceptionIncludesFailedAliasInfo(): void
{
$driverSetupManager = $this->createMock(DriverSetupManager::class);
$sessionConfig = SessionConfiguration::default();
$transactionConfig = TransactionConfiguration::default();

$driverSetupManager->method('getDriver')
->willThrowException(new RuntimeException(
'Cannot connect to any server on alias: secondary with Uris: (\'neo4j://node4:7687\', \'neo4j://node5:7687\')'
));

$client = new Client($driverSetupManager, $sessionConfig, $transactionConfig);

$this->expectException(RuntimeException::class);
$this->expectExceptionMessage('Cannot connect to any server on alias: secondary');

$client->run('RETURN 1 as n', [], 'secondary');
}
}
Loading
Loading