diff --git a/test/conftest.py b/test/conftest.py index 0402a2f72652e1bca0bd608c9869463efb24fe30..02360ae41cb6dc9e9bc62fbccca396b5655a2be8 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -184,6 +184,10 @@ def normalize_net_box_result(func): case _: raise exc from exc + # This is special case for Connection.__init__ + if result is None: + return + match result.data: case []: return None @@ -405,14 +409,42 @@ POSITION_IN_SPACE_INSTANCE_ID = 3 class Connection(tarantool.Connection): # type: ignore + @normalize_net_box_result + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + @normalize_net_box_result + def call(self, func_name, *args, on_push=None, on_push_ctx=None): + return super().call(func_name, *args, on_push=on_push, on_push_ctx=on_push_ctx) + + @normalize_net_box_result + def eval(self, expr, *args, on_push=None, on_push_ctx=None): + return super().eval(expr, *args, on_push=on_push, on_push_ctx=on_push_ctx) + def sql( self, sql: str, *params, ) -> dict: """Run SQL query and return result""" + return self.call("pico.sql", sql, *params) - return normalize_net_box_result(self.call)("pico.sql", sql, params) + def sudo_sql( + self, + sql: str, + *params, + ) -> dict: + """Run SQL query as admin and return result""" + old_euid = self.eval( + """ + local before = box.session.euid() + box.session.su('admin') + return before + """ + ) + ret = self.sql(sql, params) + self.eval("box.session.su(...)", old_euid) + return ret @dataclass @@ -512,7 +544,6 @@ class Instance: finally: c.close() - @normalize_net_box_result def call( self, fn, @@ -524,7 +555,6 @@ class Instance: with self.connect(timeout, user=user, password=password) as conn: return conn.call(fn, args) - @normalize_net_box_result def eval( self, expr, @@ -568,9 +598,8 @@ class Instance: timeout: int | float = 1, ) -> dict: """Run SQL query and return result""" - return self.call( - "pico.sql", sql, params, user=user, password=password, timeout=timeout - ) + with self.connect(timeout=timeout, user=user, password=password) as conn: + return conn.sql(sql, params) def sudo_sql( self, @@ -582,8 +611,7 @@ class Instance: ) -> dict: """Run SQL query as admin and return result""" with self.connect(timeout, user=user, password=password) as conn: - conn.eval("box.session.su('admin')") - return conn.sql(sql, params) + return conn.sudo_sql(sql, params) def terminate(self, kill_after_seconds=10) -> int | None: """Terminate the instance gracefully with SIGTERM""" @@ -704,6 +732,11 @@ class Instance: # FIXME: copy-pasted from above self.process.wait(timeout) + # When logs are disabled stdour and stderr are set to None + if not (self.process.stdout or self.process.stderr): + self.process = None + return + # Wait for all the output to be handled in the separate threads while not self.process.stdout.closed or not self.process.stderr.closed: # type: ignore time.sleep(0.1) diff --git a/test/int/test_joining.py b/test/int/test_joining.py index 82a148316c1694913d6e396becf327e71739ef3f..f4ed81b0abf6e2df1e180e55b9d547971ba71e33 100644 --- a/test/int/test_joining.py +++ b/test/int/test_joining.py @@ -129,9 +129,8 @@ def test_replication(cluster: Cluster): for instance in cluster.instances: with instance.connect(1) as conn: raft_instance = conn.eval( - "return box.space._pico_instance:get(...):tomap()", - instance.instance_id, - )[0] + "return box.space._pico_instance:get(...):tomap()", instance.instance_id + ) space_cluster = conn.call("box.space._cluster:select") expected = { @@ -147,7 +146,7 @@ def test_replication(cluster: Cluster): } assert {k: v for k, v in raft_instance.items() if k in expected} == expected - assert list(*space_cluster) == [ + assert space_cluster == [ [1, i1.instance_uuid()], [2, i2.instance_uuid()], ]