| 
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