20
20
21
21
sys .path [0 :0 ] = ["" ]
22
22
23
+ from bson .codec_options import DEFAULT_CODEC_OPTIONS
23
24
from bson .int64 import Int64
24
25
from bson .objectid import ObjectId
26
+ from bson .raw_bson import RawBSONDocument
25
27
from bson .son import SON
26
28
27
29
@@ -457,16 +459,14 @@ def test_batch_splitting_retry_fails(self):
457
459
458
460
459
461
class TestWriteConcernError (IntegrationTest ):
462
+ @classmethod
460
463
@client_context .require_version_min (4 , 0 )
461
464
@client_context .require_replica_set
462
465
@client_context .require_no_mmap
463
466
@client_context .require_failCommand_fail_point
464
- def test_RetryableWriteError_error_label (self ):
465
- listener = OvertCommandListener ()
466
- client = rs_or_single_client (
467
- retryWrites = True , event_listeners = [listener ])
468
-
469
- fail_insert = {
467
+ def setUpClass (cls ):
468
+ super (TestWriteConcernError , cls ).setUpClass ()
469
+ cls .fail_insert = {
470
470
'configureFailPoint' : 'failCommand' ,
471
471
'mode' : {'times' : 2 },
472
472
'data' : {
@@ -476,10 +476,15 @@ def test_RetryableWriteError_error_label(self):
476
476
'errmsg' : 'Replication is being shut down' },
477
477
}}
478
478
479
+ def test_RetryableWriteError_error_label (self ):
480
+ listener = OvertCommandListener ()
481
+ client = rs_or_single_client (
482
+ retryWrites = True , event_listeners = [listener ])
483
+
479
484
# Ensure collection exists.
480
485
client .pymongo_test .testcoll .insert_one ({})
481
486
482
- with self .fail_point (fail_insert ):
487
+ with self .fail_point (self . fail_insert ):
483
488
with self .assertRaises (WriteConcernError ) as cm :
484
489
client .pymongo_test .testcoll .insert_one ({})
485
490
self .assertTrue (cm .exception .has_error_label (
@@ -491,6 +496,19 @@ def test_RetryableWriteError_error_label(self):
491
496
'RetryableWriteError' ,
492
497
listener .results ['succeeded' ][- 1 ].reply ['errorLabels' ])
493
498
499
+ def test_RetryableWriteError_error_label_RawBSONDocument (self ):
500
+ # using RawBSONDocument should not cause errorLabel parsing to fail
501
+ with self .fail_point (self .fail_insert ):
502
+ with self .client .start_session () as s :
503
+ result = self .client .pymongo_test .command (
504
+ 'insert' , 'testcoll' , documents = [{'_id' : 1 }],
505
+ txnNumber = s ._server_session .transaction_id , session = s ,
506
+ codec_options = DEFAULT_CODEC_OPTIONS .with_options (
507
+ document_class = RawBSONDocument ))
508
+
509
+ self .assertIn ('writeConcernError' , result )
510
+ self .assertIn ('RetryableWriteError' , result ['errorLabels' ])
511
+
494
512
495
513
# TODO: Make this a real integration test where we stepdown the primary.
496
514
class TestRetryableWritesTxnNumber (IgnoreDeprecationsTest ):
0 commit comments