14 """Tests of grpc_status.
22 from tests
import bazel_namespace_package_hack
23 bazel_namespace_package_hack.sys_path_to_site_dir_hack()
34 from grpc_status
import rpc_status
39 from google.rpc
import code_pb2, status_pb2, error_details_pb2
41 _STATUS_OK =
'/test/StatusOK'
42 _STATUS_NOT_OK =
'/test/StatusNotOk'
43 _ERROR_DETAILS =
'/test/ErrorDetails'
44 _INCONSISTENT =
'/test/Inconsistent'
45 _INVALID_CODE =
'/test/InvalidCode'
47 _REQUEST = b
'\x00\x00\x00'
48 _RESPONSE = b
'\x01\x01\x01'
50 _GRPC_DETAILS_METADATA_KEY =
'grpc-status-details-bin'
52 _STATUS_DETAILS =
'This is an error detail'
53 _STATUS_DETAILS_ANOTHER =
'This is another error detail'
61 servicer_context.abort(grpc.StatusCode.INTERNAL, _STATUS_DETAILS)
65 details = any_pb2.Any()
67 error_details_pb2.DebugInfo(stack_entries=traceback.format_stack(),
68 detail=
'Intentionally invoked'))
69 rich_status = status_pb2.Status(
70 code=code_pb2.INTERNAL,
71 message=_STATUS_DETAILS,
74 servicer_context.abort_with_status(rpc_status.to_status(rich_status))
78 rich_status = status_pb2.Status(
79 code=code_pb2.INTERNAL,
80 message=_STATUS_DETAILS,
82 servicer_context.set_code(grpc.StatusCode.NOT_FOUND)
83 servicer_context.set_details(_STATUS_DETAILS_ANOTHER)
85 servicer_context.set_trailing_metadata(
86 ((_GRPC_DETAILS_METADATA_KEY, rich_status.SerializeToString()),))
90 rich_status = status_pb2.Status(
92 message=
'Invalid code',
94 servicer_context.abort_with_status(rpc_status.to_status(rich_status))
100 if handler_call_details.method == _STATUS_OK:
102 elif handler_call_details.method == _STATUS_NOT_OK:
104 elif handler_call_details.method == _ERROR_DETAILS:
106 _error_details_unary_unary)
107 elif handler_call_details.method == _INCONSISTENT:
109 _inconsistent_unary_unary)
110 elif handler_call_details.method == _INVALID_CODE:
112 _invalid_code_unary_unary)
117 @unittest.skipIf(sys.version_info[0] < 3,
118 'ProtoBuf descriptor has moved on from Python2')
124 port = self.
_server.add_insecure_port(
'[::]:0')
137 status = rpc_status.from_call(call)
138 self.assertIs(status,
None)
143 rpc_error = exception_context.exception
145 self.assertEqual(rpc_error.code(), grpc.StatusCode.INTERNAL)
147 status = rpc_status.from_call(rpc_error)
148 self.assertIs(status,
None)
153 rpc_error = exception_context.exception
155 status = rpc_status.from_call(rpc_error)
156 self.assertEqual(rpc_error.code(), grpc.StatusCode.INTERNAL)
157 self.assertEqual(status.code, code_pb2.Code.Value(
'INTERNAL'))
161 status.details[0].Is(error_details_pb2.DebugInfo.DESCRIPTOR),
True)
162 info = error_details_pb2.DebugInfo()
163 status.details[0].Unpack(info)
164 self.assertIn(
'_error_details_unary_unary', info.stack_entries[-1])
169 rpc_error = exception_context.exception
170 self.assertEqual(rpc_error.code(), grpc.StatusCode.NOT_FOUND)
173 self.assertRaises(ValueError, rpc_status.from_call, rpc_error)
178 rpc_error = exception_context.exception
179 self.assertEqual(rpc_error.code(), grpc.StatusCode.UNKNOWN)
181 self.assertIn(
'Invalid status code', rpc_error.details())
184 if __name__ ==
'__main__':
185 logging.basicConfig()
186 unittest.main(verbosity=2)