(topology, app_error)
| 117 | |
| 118 | |
| 119 | def got_app_error(topology, app_error): |
| 120 | server_address = common.partition_node(app_error["address"]) |
| 121 | server = topology.get_server_by_address(server_address) |
| 122 | error_type = app_error["type"] |
| 123 | generation = app_error.get("generation", server.pool.gen.get_overall()) |
| 124 | when = app_error["when"] |
| 125 | max_wire_version = app_error["maxWireVersion"] |
| 126 | # XXX: We could get better test coverage by mocking the errors on the |
| 127 | # Pool/Connection. |
| 128 | try: |
| 129 | if error_type == "command": |
| 130 | _check_command_response(app_error["response"], max_wire_version) |
| 131 | _check_write_command_response(app_error["response"]) |
| 132 | elif error_type == "network": |
| 133 | raise AutoReconnect("mock non-timeout network error") |
| 134 | elif error_type == "timeout": |
| 135 | raise NetworkTimeout("mock network timeout error") |
| 136 | else: |
| 137 | raise AssertionError(f"unknown error type: {error_type}") |
| 138 | raise AssertionError |
| 139 | except (AutoReconnect, NotPrimaryError, OperationFailure) as e: |
| 140 | if when == "beforeHandshakeCompletes": |
| 141 | # The pool would have added the SystemOverloadedError in this case. |
| 142 | if isinstance(e, AutoReconnect): |
| 143 | e._add_error_label("SystemOverloadedError") |
| 144 | completed_handshake = False |
| 145 | elif when == "afterHandshakeCompletes": |
| 146 | completed_handshake = True |
| 147 | else: |
| 148 | raise AssertionError(f"Unknown when field {when}") |
| 149 | |
| 150 | topology.handle_error( |
| 151 | server_address, |
| 152 | _ErrorContext(e, max_wire_version, generation, completed_handshake, None), |
| 153 | ) |
| 154 | |
| 155 | |
| 156 | def get_type(topology, hostname): |
no test coverage detected