Skip to content

Commit 7fcba03

Browse files
alcaeuslevon80999
authored andcommitted
PHPLIB-982: Change evaluation of serverParameters to allow for server differences (mongodb#978)
* PHPLIB-982: Change evaluation of serverParameters to allow for server differences * Fix topology typos
1 parent 517a244 commit 7fcba03

File tree

3 files changed

+113
-25
lines changed

3 files changed

+113
-25
lines changed

tests/UnifiedSpecTests/RunOnRequirement.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ public function __construct(stdClass $o)
113113
}
114114
}
115115

116-
public function isSatisfied(string $serverVersion, string $topology, stdClass $serverParameters, bool $isAuthenticated, bool $isServerless, bool $isClientSideEncryptionSupported): bool
116+
public function isSatisfied(string $serverVersion, string $topology, ServerParameterHelper $serverParameters, bool $isAuthenticated, bool $isServerless, bool $isClientSideEncryptionSupported): bool
117117
{
118118
if (isset($this->minServerVersion) && version_compare($serverVersion, $this->minServerVersion, '<')) {
119119
return false;
@@ -128,9 +128,11 @@ public function isSatisfied(string $serverVersion, string $topology, stdClass $s
128128
}
129129

130130
if (isset($this->serverParameters)) {
131-
$constraint = new Matches($this->serverParameters, null, true, false);
132-
if (! $constraint->evaluate($serverParameters, '', true)) {
133-
return false;
131+
foreach ($this->serverParameters as $parameter => $expectedValue) {
132+
$constraint = new Matches($expectedValue, null, true, false);
133+
if (! $constraint->evaluate($serverParameters->$parameter, '', true)) {
134+
return false;
135+
}
134136
}
135137
}
136138

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
<?php
2+
3+
namespace MongoDB\Tests\UnifiedSpecTests;
4+
5+
use MongoDB\Client;
6+
use MongoDB\Driver\Exception\CommandException;
7+
use MongoDB\Driver\ReadPreference;
8+
9+
use function array_key_exists;
10+
11+
final class ServerParameterHelper
12+
{
13+
/** @var Client */
14+
private $client;
15+
16+
/** @var array<string|mixed> */
17+
private $parameters = [];
18+
19+
/** @var bool */
20+
private $fetchAllParametersFailed = false;
21+
22+
/** @var bool */
23+
private $allParametersFetched = false;
24+
25+
public function __construct(Client $client)
26+
{
27+
$this->client = $client;
28+
}
29+
30+
/** @return mixed */
31+
public function __get(string $parameter)
32+
{
33+
if (! array_key_exists($parameter, $this->parameters)) {
34+
$this->fetchParameter($parameter);
35+
}
36+
37+
return $this->parameters[$parameter];
38+
}
39+
40+
private function fetchParameter(string $parameter): void
41+
{
42+
// Try fetching all parameters once
43+
if (! $this->allParametersFetched && ! $this->fetchAllParametersFailed) {
44+
$this->fetchAllParameters();
45+
}
46+
47+
if (array_key_exists($parameter, $this->parameters)) {
48+
return;
49+
}
50+
51+
// If fetching all parameters failed, or the parameter was not part of
52+
// the list, fetch the single parameter as fallback
53+
$this->fetchSingleParameter($parameter);
54+
}
55+
56+
private function fetchAllParameters(): void
57+
{
58+
try {
59+
$database = $this->client->selectDatabase('admin');
60+
$cursor = $database->command(
61+
['getParameter' => '*'],
62+
[
63+
'readPreference' => new ReadPreference(ReadPreference::PRIMARY),
64+
'typeMap' => [
65+
'root' => 'array',
66+
'document' => 'array',
67+
'array' => 'array',
68+
],
69+
]
70+
);
71+
72+
$this->parameters = $cursor->toArray()[0];
73+
$this->allParametersFetched = true;
74+
} catch (CommandException $e) {
75+
$this->fetchAllParametersFailed = true;
76+
}
77+
}
78+
79+
private function fetchSingleParameter(string $parameter): void
80+
{
81+
$database = $this->client->selectDatabase('admin');
82+
$cursor = $database->command(
83+
[
84+
'getParameter' => 1,
85+
$parameter => 1,
86+
],
87+
[
88+
'readPreference' => new ReadPreference(ReadPreference::PRIMARY),
89+
'typeMap' => [
90+
'root' => 'array',
91+
'document' => 'array',
92+
'array' => 'array',
93+
],
94+
]
95+
);
96+
97+
$this->parameters[$parameter] = $cursor->toArray()[0][$parameter];
98+
}
99+
}

tests/UnifiedSpecTests/UnifiedTestRunner.php

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ final class UnifiedTestRunner
8484
/** @var FailPointObserver */
8585
private $failPointObserver;
8686

87+
/** @var ServerParameterHelper */
88+
private $serverParameterHelper;
89+
8790
public function __construct(string $internalClientUri)
8891
{
8992
$this->internalClient = FunctionalTestCase::createTestClient($internalClientUri);
@@ -95,6 +98,8 @@ public function __construct(string $internalClientUri)
9598
if ($this->isServerless() || strpos($internalClientUri, self::ATLAS_TLD) !== false) {
9699
$this->allowKillAllSessions = false;
97100
}
101+
102+
$this->serverParameterHelper = new ServerParameterHelper($this->internalClient);
98103
}
99104

100105
public function run(UnifiedTestCase $test): void
@@ -248,7 +253,7 @@ private function checkRunOnRequirements(array $runOnRequirements): void
248253
$cachedIsSatisfiedArgs = [
249254
$this->getServerVersion(),
250255
$this->getTopology(),
251-
$this->getServerParameters(),
256+
$this->serverParameterHelper,
252257
$this->isAuthenticated(),
253258
$this->isServerless(),
254259
$this->isClientSideEncryptionSupported(),
@@ -264,7 +269,7 @@ private function checkRunOnRequirements(array $runOnRequirements): void
264269

265270
// @todo Add server parameter requirements?
266271
Assert::markTestSkipped(sprintf(
267-
'Server (version=%s, toplogy=%s, auth=%s) does not meet test requirements',
272+
'Server (version=%s, topology=%s, auth=%s) does not meet test requirements',
268273
$cachedIsSatisfiedArgs[0],
269274
$cachedIsSatisfiedArgs[1],
270275
$cachedIsSatisfiedArgs[3] ? 'yes' : 'no'
@@ -278,24 +283,6 @@ private function getPrimaryServer(): Server
278283
return $manager->selectServer(new ReadPreference(ReadPreference::PRIMARY));
279284
}
280285

281-
private function getServerParameters(): stdClass
282-
{
283-
$database = $this->internalClient->selectDatabase('admin');
284-
$cursor = $database->command(
285-
['getParameter' => '*'],
286-
[
287-
'readPreference' => new ReadPreference(ReadPreference::PRIMARY),
288-
'typeMap' => [
289-
'root' => 'object',
290-
'document' => 'object',
291-
'array' => 'array',
292-
],
293-
]
294-
);
295-
296-
return $cursor->toArray()[0];
297-
}
298-
299286
private function getServerVersion(): string
300287
{
301288
$database = $this->internalClient->selectDatabase('admin');
@@ -331,7 +318,7 @@ private function getTopology(): string
331318
return RunOnRequirement::TOPOLOGY_LOAD_BALANCED;
332319

333320
default:
334-
throw new UnexpectedValueException('Toplogy is neither single nor RS nor sharded');
321+
throw new UnexpectedValueException('Topology is neither single nor RS nor sharded');
335322
}
336323
}
337324

0 commit comments

Comments
 (0)