Skip to content

Commit 8c07222

Browse files
authored
PHPC-1762: CRUD spec prose tests for WriteError and WriteConcernError.errInfo (#1229)
* PHPC-1762: CRUD spec prose tests for WriteError and WriteConcernError errInfo Note: the prose test for WriteConcernError.info was originally in PHPLIB but was inadvertently removed in mongodb/mongo-php-library@a9e2977 (mongodb/mongo-php-library#820). * Require 5.0+ server for versioned API test * Add links to prose tests
1 parent 3c41a31 commit 8c07222

File tree

3 files changed

+138
-0
lines changed

3 files changed

+138
-0
lines changed

tests/manager/manager-ctor-serverApi-001.phpt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ MongoDB\Driver\Manager::__construct(): serverApi driver option
33
--SKIPIF--
44
<?php require __DIR__ . "/../utils/basic-skipif.inc"; ?>
55
<?php skip_if_not_live(); ?>
6+
<?php skip_if_server_version('<', '5.0'); ?>
67
--FILE--
78
<?php
89

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
--TEST--
2+
MongoDB\Driver\WriteConcernError::getInfo() exposes writeConcernError.errInfo
3+
--DESCRIPTION--
4+
CRUD spec prose test #1
5+
https://github.com/mongodb/specifications/blob/master/source/crud/tests/README.rst#writeconcernerror-details-exposes-writeconcernerror-errinfo
6+
--SKIPIF--
7+
<?php require __DIR__ . "/../utils/basic-skipif.inc"; ?>
8+
<?php skip_if_no_failcommand_failpoint(); ?>
9+
<?php skip_if_not_clean(); ?>
10+
--FILE--
11+
<?php
12+
require_once __DIR__ . "/../utils/basic.inc";
13+
14+
$manager = create_test_manager();
15+
16+
// Select a specific server for future operations to avoid mongos switching in sharded clusters
17+
$server = $manager->selectServer(new MongoDB\Driver\ReadPreference('primary'));
18+
19+
configureTargetedFailPoint(
20+
$server,
21+
'failCommand',
22+
[ 'times' => 1],
23+
[
24+
'failCommands' => ['insert'],
25+
'writeConcernError' => [
26+
'code' => 100,
27+
'codeName' => 'UnsatisfiableWriteConcern',
28+
'errmsg' => 'Not enough data-bearing nodes',
29+
'errInfo' => [
30+
'writeConcern' => [
31+
'w' => 2,
32+
'wtimeout' => 0,
33+
'provenance' => 'clientSupplied',
34+
],
35+
],
36+
],
37+
]
38+
);
39+
40+
$bulk = new MongoDB\Driver\BulkWrite;
41+
$bulk->insert(['_id' => 1]);
42+
43+
try {
44+
$server->executeBulkWrite(NS, $bulk);
45+
} catch (MongoDB\Driver\Exception\BulkWriteException $e) {
46+
var_dump($e->getWriteResult()->getWriteConcernError()->getInfo());
47+
}
48+
49+
?>
50+
===DONE===
51+
--EXPECTF--
52+
object(stdClass)#%d (%d) {
53+
["writeConcern"]=>
54+
object(stdClass)#%d (%d) {
55+
["w"]=>
56+
int(2)
57+
["wtimeout"]=>
58+
int(0)
59+
["provenance"]=>
60+
string(14) "clientSupplied"
61+
}
62+
}
63+
===DONE===
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
--TEST--
2+
MongoDB\Driver\WriteError::getInfo() exposes writeError.errInfo
3+
--DESCRIPTION--
4+
CRUD spec prose test #2
5+
https://github.com/mongodb/specifications/blob/master/source/crud/tests/README.rst#writeerror-details-exposes-writeerrors-errinfo
6+
--SKIPIF--
7+
<?php require __DIR__ . "/../utils/basic-skipif.inc"; ?>
8+
<?php skip_if_server_version('<', '5.0'); ?>
9+
<?php skip_if_not_clean(); ?>
10+
--FILE--
11+
<?php
12+
require_once __DIR__ . "/../utils/basic.inc";
13+
14+
class Test implements MongoDB\Driver\Monitoring\CommandSubscriber
15+
{
16+
private $errInfo;
17+
18+
public function execute()
19+
{
20+
$manager = create_test_manager();
21+
22+
$manager->executeCommand(DATABASE_NAME, new MongoDB\Driver\Command([
23+
'create' => COLLECTION_NAME,
24+
'validator' => ['x' => ['$type' => 'string']],
25+
]));
26+
27+
$bulk = new MongoDB\Driver\BulkWrite;
28+
$bulk->insert(['x' => 1]);
29+
30+
MongoDB\Driver\Monitoring\addSubscriber($this);
31+
32+
try {
33+
$manager->executeBulkWrite(NS, $bulk);
34+
} catch (MongoDB\Driver\Exception\BulkWriteException $e) {
35+
$writeError = $e->getWriteResult()->getWriteErrors()[0];
36+
37+
var_dump($writeError->getCode()); // DocumentValidationFailure(121)
38+
39+
/* Note: we intentionally do not assert the contents of errInfo
40+
* since its structure could change between server versions. */
41+
var_dump($writeError->getInfo() instanceof stdClass);
42+
var_dump($this->errInfo instanceof stdClass);
43+
var_dump($writeError->getInfo() == $this->errInfo);
44+
}
45+
46+
MongoDB\Driver\Monitoring\removeSubscriber($this);
47+
}
48+
49+
public function commandStarted(MongoDB\Driver\Monitoring\CommandStartedEvent $event)
50+
{
51+
}
52+
53+
public function commandSucceeded(MongoDB\Driver\Monitoring\CommandSucceededEvent $event)
54+
{
55+
if ($event->getCommandName() === 'insert') {
56+
$this->errInfo = $event->getReply()->writeErrors[0]->errInfo ?? null;
57+
}
58+
}
59+
60+
public function commandFailed(MongoDB\Driver\Monitoring\CommandFailedEvent $event)
61+
{
62+
}
63+
}
64+
65+
(new Test)->execute();
66+
67+
?>
68+
===DONE===
69+
--EXPECTF--
70+
int(121)
71+
bool(true)
72+
bool(true)
73+
bool(true)
74+
===DONE===

0 commit comments

Comments
 (0)