Skip to content

Commit

Permalink
PHPLIB-1194: Test log message for non-genuine hosts
Browse files Browse the repository at this point in the history
  • Loading branch information
jmikola committed Sep 25, 2023
1 parent f9c43c3 commit 2208186
Showing 1 changed file with 141 additions and 0 deletions.
141 changes: 141 additions & 0 deletions tests/LogNonGenuineHostTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
<?php

namespace MongoDB\Tests;

use MongoDB\Client;
use MongoDB\Driver\Exception\InvalidArgumentException;
use Psr\Log\AbstractLogger;
use Psr\Log\LoggerInterface;

use function func_get_args;
use function MongoDB\addLogger;
use function MongoDB\removeLogger;

/** @see https://jira.mongodb.org/browse/DRIVERS-2583 */
class LogNonGenuineHostTest extends TestCase
{
private LoggerInterface $logger;

public function setUp(): void
{
$this->logger = $this->createTestPsrLogger();

addLogger($this->logger);
}

public function tearDown(): void
{
removeLogger($this->logger);
}

/** @dataProvider provideCosmosUris */
public function testCosmosUriLogsInfoMessage(string $uri): void
{
$this->createClientAndIgnoreSrvLookupError($uri);

$expectedLog = [
'info',
'You appear to be connected to a CosmosDB cluster. For more information regarding feature compatibility and support please visit https://www.mongodb.com/supportability/cosmosdb',
['domain' => 'mongoc'],
];

$this->assertContains($expectedLog, $this->logger->logs);
}

public static function provideCosmosUris(): array
{
return [
['mongodb://a.mongo.cosmos.azure.com:19555/'],
['mongodb://a.MONGO.COSMOS.AZURE.COM:19555/'],
['mongodb+srv://a.mongo.cosmos.azure.com/'],
['mongodb+srv://A.MONGO.COSMOS.AZURE.COM/'],
// Mixing genuine and nongenuine hosts (unlikely in practice)
['mongodb://a.example.com:27017,b.mongo.cosmos.azure.com:19555/'],
];
}

/** @dataProvider provideDocumentDbUris */
public function testDocumentDbUriLogsInfoMessage(string $uri): void
{
$this->createClientAndIgnoreSrvLookupError($uri);

$expectedLog = [
'info',
'You appear to be connected to a DocumentDB cluster. For more information regarding feature compatibility and support please visit https://www.mongodb.com/supportability/documentdb',
['domain' => 'mongoc'],
];

$this->assertContains($expectedLog, $this->logger->logs);
}

public static function provideDocumentDbUris(): array
{
return [
['mongodb://a.docdb.amazonaws.com:27017/'],
['mongodb://a.docdb-elastic.amazonaws.com:27017/'],
['mongodb://a.DOCDB.AMAZONAWS.COM:27017/'],
['mongodb://a.DOCDB-ELASTIC.AMAZONAWS.COM:27017/'],
['mongodb+srv://a.DOCDB.AMAZONAWS.COM/'],
['mongodb+srv://a.DOCDB-ELASTIC.AMAZONAWS.COM/'],
// Mixing genuine and nongenuine hosts (unlikely in practice)
['mongodb://a.example.com:27017,b.docdb.amazonaws.com:27017/'],
['mongodb://a.example.com:27017,b.docdb-elastic.amazonaws.com:27017/'],
];
}

/** @dataProvider provideGenuineUris */
public function testGenuineUriDoesNotLog(string $uri): void
{
$this->createClientAndIgnoreSrvLookupError($uri);
$this->assertEmpty($this->logger->logs);
}

public static function provideGenuineUris(): array
{
return [
['mongodb://a.example.com:27017,b.example.com:27017/'],
['mongodb://a.mongodb.net:27017'],
['mongodb+srv://a.example.com/'],
['mongodb+srv://a.mongodb.net/'],
// Host names do not end with expected suffix
['mongodb://a.mongo.cosmos.azure.com.tld:19555/'],
['mongodb://a.docdb.amazonaws.com.tld:27017/'],
['mongodb://a.docdb-elastic.amazonaws.com.tld:27017/'],
// SRV host names do not end with expected suffix
['mongodb+srv://a.mongo.cosmos.azure.com.tld/'],
['mongodb+srv://a.docdb.amazonaws.com.tld/'],
['mongodb+srv://a.docdb-elastic.amazonaws.com.tld/'],
];
}

private function createClientAndIgnoreSrvLookupError(string $uri): void
{
try {
$client = new Client($uri);
} catch (InvalidArgumentException $e) {
$this->assertStringContainsString('Failed to look up SRV record', $e->getMessage());
}
}

private function createTestPsrLogger(): LoggerInterface
{
return new class extends AbstractLogger {
public $logs = [];

/**
* Note: parameter type hints are omitted for compatibility with
* psr/log 1.1.4 and PHP 7.4.
*/
public function log($level, $message, array $context = []): void
{
/* Ignore debug-level log messages from PHPC (e.g. connection
* string, Manager creation, handshake data). */
if ($level === 'debug') {
return;
}

$this->logs[] = func_get_args();
}
};
}
}

0 comments on commit 2208186

Please sign in to comment.