Skip to content

Commit 48359eb

Browse files
authored
test(spanner): harden 'test_transaction_batch_update*' systests against partial success + abort (#9579)
Closes #9534.
1 parent 21e9457 commit 48359eb

File tree

1 file changed

+31
-4
lines changed

1 file changed

+31
-4
lines changed

spanner/tests/system/test_system.py

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import uuid
2525

2626
import pytest
27+
import grpc
2728
from google.rpc import code_pb2
2829

2930
from google.api_core import exceptions
@@ -66,6 +67,10 @@
6667
COUNTERS_TABLE = "counters"
6768
COUNTERS_COLUMNS = ("name", "value")
6869

70+
_STATUS_CODE_TO_GRPC_STATUS_CODE = {
71+
member.value[0]: member for member in grpc.StatusCode
72+
}
73+
6974

7075
class Config(object):
7176
"""Run-time configuration to be modified at set-up.
@@ -785,9 +790,13 @@ def test_transaction_execute_update_then_insert_commit(self):
785790
# [END spanner_test_dml_with_mutation]
786791

787792
@staticmethod
788-
def _check_batch_status(status_code):
789-
if status_code != code_pb2.OK:
790-
raise exceptions.from_grpc_status(status_code, "batch_update failed")
793+
def _check_batch_status(status_code, expected=code_pb2.OK):
794+
if status_code != expected:
795+
grpc_status_code = _STATUS_CODE_TO_GRPC_STATUS_CODE[status_code]
796+
call = FauxCall(status_code)
797+
raise exceptions.from_grpc_status(
798+
grpc_status_code, "batch_update failed", errors=[call]
799+
)
791800

792801
def test_transaction_batch_update_success(self):
793802
# [START spanner_test_dml_with_mutation]
@@ -906,7 +915,7 @@ def unit_of_work(transaction):
906915
status, row_counts = transaction.batch_update(
907916
[insert_statement, update_statement, delete_statement]
908917
)
909-
self.assertEqual(status.code, code_pb2.INVALID_ARGUMENT)
918+
self._check_batch_status(status.code, code_pb2.INVALID_ARGUMENT)
910919
self.assertEqual(len(row_counts), 1)
911920
self.assertEqual(row_counts[0], 1)
912921

@@ -2190,3 +2199,21 @@ def _handle_abort_unit_of_work(self, transaction):
21902199
def handle_abort(self, database):
21912200
database.run_in_transaction(self._handle_abort_unit_of_work)
21922201
self.handler_done.set()
2202+
2203+
2204+
class FauxCall(object):
2205+
def __init__(self, code, details="FauxCall"):
2206+
self._code = code
2207+
self._details = details
2208+
2209+
def initial_metadata(self):
2210+
return {}
2211+
2212+
def trailing_metadata(self):
2213+
return {}
2214+
2215+
def code(self):
2216+
return self._code
2217+
2218+
def details(self):
2219+
return self._details

0 commit comments

Comments
 (0)