diff --git a/tests/bugs/gh_7823_test.py b/tests/bugs/gh_7823_test.py new file mode 100644 index 00000000..2568966d --- /dev/null +++ b/tests/bugs/gh_7823_test.py @@ -0,0 +1,61 @@ +#coding:utf-8 + +""" +ID: issue-7823 +ISSUE: https://github.com/FirebirdSQL/firebird/issues/7823 +TITLE: ISQL command SHOW DATABASE crashes in absence of firebird.msg +NOTES: + [24.01.2024] pzotov + Test implemented only for Windows. + Confirmed bug on 6.0.0.222: ISQL crashes after 'show database' and further statements are not executed. + Checked on 6.0.0.223 - all fine. +""" +import shutil +import subprocess +from pathlib import Path +import pytest +from firebird.qa import * + +db = db_factory() +act = python_act('db', substitutions = [('^((?!(SUCCESS_MSG)).)*$', ''), ('[ \t]+', ' ')]) + +expected_stdout = """ + SUCCESS_MSG Ok +""" + +tmp_isql = temp_file('isql.exe') +tmp_clnt = temp_file('fbclient.dll') +tmp_sql = temp_file('check.sql') +tmp_log = temp_file('check.log') + +@pytest.mark.version('>=6.0') +@pytest.mark.platform('Windows') +def test_1(act: Action, tmp_isql: Path, tmp_clnt: Path, tmp_sql: Path, tmp_log: Path, capsys): + print(Path(act.vars['bin-dir'],'isql.exe')) + print(tmp_isql) + shutil.copy2(Path(act.vars['bin-dir'],'isql.exe'), tmp_isql) + shutil.copy2(Path(act.vars['bin-dir'],'fbclient.dll'), tmp_clnt) + + #cmd_isql = [str(tmp_isql), act.db.dsn, '-user', act.db.user, '-pas', act.db.password, '-i', str(tmp_sql)] + cmd_isql = [str(tmp_isql), act.vars['host']+'/'+act.vars['port']+':'+str(act.db.db_path), '-user', act.db.user, '-pas', act.db.password, '-i', str(tmp_sql)] + cmd_line = ' '.join(cmd_isql) + sql_text = f""" + -- {cmd_line} + set list on; + -- this cased crash of ISQL: + show database; + -- this was not executed before fix: + select 'Ok' as success_msg from rdb$database; + """ + tmp_sql.write_text(sql_text) + + with open(tmp_log, 'w') as f: + subprocess.run( cmd_isql, stdout = f, stderr = subprocess.STDOUT) + + with open(tmp_log, 'r') as f: + for line in f: + print(line) + + act.expected_stdout = expected_stdout + act.stdout = capsys.readouterr().out + assert act.clean_stdout == act.clean_expected_stdout