Skip to content

Commit c5d412c

Browse files
authored
YDB FQ: stabilize MySQL tests (#6728)
1 parent d116509 commit c5d412c

File tree

2 files changed

+50
-20
lines changed

2 files changed

+50
-20
lines changed

ydb/library/yql/providers/generic/connector/tests/datasource/mysql/test.py

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
from typing import Set
2+
from datetime import datetime
3+
import time
4+
15
import pytest
26

37
import yatest.common
@@ -28,6 +32,23 @@
2832
class OneTimeWaiter:
2933
__launched: bool = False
3034

35+
__expected_tables: Set[str] = {
36+
'column_selection_A_b_C_d_E',
37+
'column_selection_COL1',
38+
'column_selection_col1',
39+
'column_selection_asterisk',
40+
'column_selection_col2_COL1',
41+
'column_selection_col2_col1',
42+
'column_selection_col2',
43+
'column_selection_col3',
44+
'primitives',
45+
'constant',
46+
'count_rows',
47+
'pushdown',
48+
'json',
49+
'datetimes',
50+
}
51+
3152
def __init__(self):
3253
docker_compose_file_relative_path = str(docker_compose_dir / 'docker-compose.yml')
3354
docker_compose_file_abs_path = yatest.common.source_path(docker_compose_file_relative_path)
@@ -37,8 +58,22 @@ def wait(self):
3758
if self.__launched:
3859
return
3960

40-
self.docker_compose_helper.await_mysql()
41-
self.__launched = True
61+
start = datetime.now()
62+
actual_tables: Set[str] = None
63+
timeout = 60
64+
65+
while (datetime.now() - start).total_seconds() < timeout:
66+
try:
67+
actual_tables = set(self.docker_compose_helper.list_mysql_tables())
68+
except Exception as e:
69+
LOGGER.error(f"list mysql tables error: {e}")
70+
time.sleep(5)
71+
else:
72+
if self.__expected_tables.issubset(actual_tables):
73+
self.__launched = True
74+
return
75+
76+
raise RuntimeError(f"No expected tables in MySQL. Latest result: {actual_tables}")
4277

4378

4479
one_time_waiter = OneTimeWaiter()

ydb/library/yql/providers/generic/connector/tests/utils/docker_compose.py

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import socket
66
import subprocess
77
import yaml
8-
import time
98
from typing import Dict, Any, Sequence
109

1110
import yatest.common
@@ -159,32 +158,28 @@ def list_ydb_tables(self) -> Sequence[str]:
159158

160159
return result
161160

162-
def await_mysql(self):
161+
def list_mysql_tables(self) -> Sequence[str]:
163162
params = self.docker_compose_yml_data["services"]["mysql"]
163+
password = params["environment"]["MYSQL_ROOT_PASSWORD"]
164+
db = params["environment"]["MYSQL_DATABASE"]
164165
cmd = [
165166
self.docker_bin_path,
166167
'exec',
167168
params["container_name"],
168169
'mysql',
169-
f'--password={params["environment"]["MYSQL_ROOT_PASSWORD"]}',
170-
f'{params["environment"]["MYSQL_DATABASE"]}',
170+
f'--password={password}',
171+
db,
171172
'-e',
172-
'SELECT version()',
173+
f'SELECT table_name FROM information_schema.tables WHERE table_schema = "{db}"',
173174
]
174175

175176
LOGGER.debug("calling command: " + " ".join(cmd))
176177

177-
err = RuntimeError("docker-compose error: timed out to check cmd output") # default error value
178-
start = datetime.now()
179-
timeout = 20
178+
out = None
180179

181-
while (datetime.now() - start).total_seconds() < timeout:
182-
try:
183-
subprocess.check_output(cmd, stderr=subprocess.STDOUT).decode('utf8')
184-
return
185-
except subprocess.CalledProcessError as e:
186-
LOGGER.error(f"called process error: {e}")
187-
err = RuntimeError(f"docker-compose error: {e.output} (code {e.returncode})")
188-
time.sleep(5)
189-
190-
raise err
180+
try:
181+
out = subprocess.check_output(cmd, stderr=subprocess.STDOUT).decode('utf8')
182+
except subprocess.CalledProcessError as e:
183+
raise RuntimeError(f"docker cmd failed: {e.output} (code {e.returncode})")
184+
else:
185+
return out.splitlines()[2:]

0 commit comments

Comments
 (0)