|
1 | 1 | import sys
|
2 | 2 | import unittest
|
3 | 3 | import tarantool
|
| 4 | +from tarantool.error import DatabaseError |
4 | 5 |
|
5 | 6 | from .lib.tarantool_server import TarantoolServer
|
| 7 | +from .lib.skip import skip_or_run_error_extra_info_test |
6 | 8 |
|
7 | 9 | class TestSuite_Request(unittest.TestCase):
|
8 | 10 | @classmethod
|
@@ -309,6 +311,77 @@ def test_13_unix_socket_connect(self):
|
309 | 311 | self.sock_con = tarantool.connect(self.sock_srv.host, self.sock_srv.args['primary'])
|
310 | 312 | self.assertEqual(self.sock_con.ping(notime=True), "Success")
|
311 | 313 |
|
| 314 | + @skip_or_run_error_extra_info_test |
| 315 | + def test_14_extra_error_info(self): |
| 316 | + try: |
| 317 | + self.con.eval("not a Lua code") |
| 318 | + except DatabaseError as exc: |
| 319 | + self.assertEqual(exc.extra_info.type, 'LuajitError') |
| 320 | + self.assertRegex(exc.extra_info.file, r'/tarantool') |
| 321 | + self.assertTrue(exc.extra_info.line > 0) |
| 322 | + self.assertEqual(exc.extra_info.message, "eval:1: unexpected symbol near 'not'") |
| 323 | + self.assertEqual(exc.extra_info.errno, 0) |
| 324 | + self.assertEqual(exc.extra_info.errcode, 32) |
| 325 | + self.assertEqual(exc.extra_info.fields, None) |
| 326 | + self.assertEqual(exc.extra_info.prev, None) |
| 327 | + else: |
| 328 | + self.fail('Expected error') |
| 329 | + |
| 330 | + @skip_or_run_error_extra_info_test |
| 331 | + def test_15_extra_error_info_stacked(self): |
| 332 | + try: |
| 333 | + self.con.eval(r""" |
| 334 | + local e1 = box.error.new(box.error.UNKNOWN) |
| 335 | + local e2 = box.error.new(box.error.TIMEOUT) |
| 336 | + e2:set_prev(e1) |
| 337 | + error(e2) |
| 338 | + """) |
| 339 | + except DatabaseError as exc: |
| 340 | + self.assertEqual(exc.extra_info.type, 'ClientError') |
| 341 | + self.assertRegex(exc.extra_info.file, 'eval') |
| 342 | + self.assertEqual(exc.extra_info.line, 3) |
| 343 | + self.assertEqual(exc.extra_info.message, "Timeout exceeded") |
| 344 | + self.assertEqual(exc.extra_info.errno, 0) |
| 345 | + self.assertEqual(exc.extra_info.errcode, 78) |
| 346 | + self.assertEqual(exc.extra_info.fields, None) |
| 347 | + self.assertNotEqual(exc.extra_info.prev, None) |
| 348 | + prev = exc.extra_info.prev |
| 349 | + self.assertEqual(prev.type, 'ClientError') |
| 350 | + self.assertEqual(prev.file, 'eval') |
| 351 | + self.assertEqual(prev.line, 2) |
| 352 | + self.assertEqual(prev.message, "Unknown error") |
| 353 | + self.assertEqual(prev.errno, 0) |
| 354 | + self.assertEqual(prev.errcode, 0) |
| 355 | + self.assertEqual(prev.fields, None) |
| 356 | + else: |
| 357 | + self.fail('Expected error') |
| 358 | + |
| 359 | + @skip_or_run_error_extra_info_test |
| 360 | + def test_16_extra_error_info_fields(self): |
| 361 | + try: |
| 362 | + self.con.eval(""" |
| 363 | + box.schema.func.create('forbidden_function') |
| 364 | + """) |
| 365 | + except DatabaseError as exc: |
| 366 | + self.assertEqual(exc.extra_info.type, 'AccessDeniedError') |
| 367 | + self.assertRegex(exc.extra_info.file, r'/tarantool') |
| 368 | + self.assertTrue(exc.extra_info.line > 0) |
| 369 | + self.assertEqual( |
| 370 | + exc.extra_info.message, |
| 371 | + "Create access to function 'forbidden_function' is denied for user 'test'") |
| 372 | + self.assertEqual(exc.extra_info.errno, 0) |
| 373 | + self.assertEqual(exc.extra_info.errcode, 42) |
| 374 | + self.assertEqual( |
| 375 | + exc.extra_info.fields, |
| 376 | + { |
| 377 | + 'object_type': 'function', |
| 378 | + 'object_name': 'forbidden_function', |
| 379 | + 'access_type': 'Create' |
| 380 | + }) |
| 381 | + self.assertEqual(exc.extra_info.prev, None) |
| 382 | + else: |
| 383 | + self.fail('Expected error') |
| 384 | + |
312 | 385 | @classmethod
|
313 | 386 | def tearDownClass(self):
|
314 | 387 | self.con.close()
|
|
0 commit comments