6
0
mirror of https://github.com/FirebirdSQL/firebird-qa.git synced 2025-01-22 21:43:06 +01:00
firebird-qa/tests/bugs/gh_1665_test.py

135 lines
5.9 KiB
Python

#coding:utf-8
"""
ID: issue-1665
ISSUE: https://github.com/FirebirdSQL/firebird/issues/1665
TITLE: TempDirectories parameter in firebird.conf ignored by global temporary tables
DESCRIPTION:
Source discussions:
1) https://github.com/FirebirdSQL/firebird/pull/311
("Introduce new setting TempTableDirectory as discussed in fb-devel, see also CORE-1241")
2) https://github.com/FirebirdSQL/firebird/issues/1665
("TempDirectories parameter in firebird.conf ignored by global temporary tables [CORE1241]")
Old: CORE-1241; discussion resumed 14.12.2020.
Commits (20.04.2021 14:17; 17.05.2021 15:46):
1) https://github.com/FirebirdSQL/firebird/commit/f2805020a6f34d253c93b8edac6068c1b35f9b89
"New setting TempTableDirectory.
Used to set directory where engine should put data of temporary tables and temporary blobs."
2) https://github.com/FirebirdSQL/firebird/commit/fd0fa8a3a58fbfe7fdc0641b4e48258643d72127
"Let include file name into error message when creation of temp file failed."
Test verifies that:
* we can use 'TempTableDirectory' as per-database parameter;
* we will able to see in firebird.log messages about failure of fb_table* file creation
Section in databases.conf related to test DB must contain definition of 'TempTableDirectory' with value
that for sure will be *incorrect* both on Windows and Linux. It was decided to use following value:
'|DEFINITELY|INACCESSIBLE|' (no such folder can exist in either OS).
Then we establish connection to the test DB and run SQL which creates GTT and adds several rows in it.
NO exception must be raised in this case: GTT must be fulfilled w/o problems and FB must create temporary
file (fb_table_*) in some existing folder (defined by FIREBIRD_TMP variable; if it is undefined then such
file will be created in C:\\TEMP or /tmp - depending on OS).
But firebird.log must contain message about problem with creating file (fb_table_*) in the directory which
could not be accessed. We check old and new content of firebird.log with expecting to see message that
did appear about this problem.
Initially checked on 5.0.0.40, 4.0.0.2436.
JIRA: CORE-1241
FBTEST: bugs.gh_1665
NOTES:
[17.08.2022] pzotov
1. One need to be sure that firebird.conf does NOT contain DatabaseAccess = None.
2. Test uses pre-created databases.conf which has alias defvined by variable REQUIRED_ALIAS.
Database file for that alias must NOT exist in the QA_root/files/qa/ subdirectory: it will be created here.
Content of databases.conf must be taken from $QA_ROOT/files/qa-databases.conf (one need to replace
it before every test session).
Discussed with pcisar, letters since 30-may-2022 13:48, subject:
"new qa, core_4964_test.py: strange outcome when use... shutil.copy() // comparing to shutil.copy2()"
3. Value of REQUIRED_ALIAS must be EXACTLY the same as alias specified in the pre-created databases.conf
(for LINUX this equality is case-sensitive, even when aliases are compared!)
Checked on 5.0.0.623, 4.0.1.2692 - both on Windows and Linux.
"""
import locale
import re
from difflib import unified_diff
import time
import pytest
from firebird.qa import *
REQUIRED_ALIAS = 'tmp_gh_1665_alias'
db = db_factory(filename = '#' + REQUIRED_ALIAS)
act = python_act('db', substitutions=[('[ \t]+', ' '), ('"\\|DEFINITELY\\|INACCESSIBLE\\|"', '')])
FLD_WIDTH=100
NUM_ROWS=100
@pytest.mark.version('>=4.0')
def test_1(act: Action, capsys):
fblog_1 = act.get_firebird_log()
init_sql = f'''
set bail on;
connect '{REQUIRED_ALIAS}' user {act.db.user};
set list on;
select rdb$config_name, rdb$config_value from rdb$config g where upper(g.rdb$config_name) = upper('TempTableDirectory');
recreate global temporary table gtt_test(s varchar({FLD_WIDTH}) unique) on commit preserve rows;
commit;
set count on;
insert into gtt_test(s) select lpad('',{FLD_WIDTH},uuid_to_char(gen_uuid())) from rdb$types rows {NUM_ROWS};
commit;
'''
###############################################################################################################
# POINT-1: check that ISQL does NOT raise any error (related to invalid path for TempTableDirectory):
#
act.expected_stdout = f"""
RDB$CONFIG_NAME TempTableDirectory
RDB$CONFIG_VALUE |DEFINITELY|INACCESSIBLE|
Records affected: {NUM_ROWS}
"""
act.isql(switches = ['-q'], input = init_sql, connect_db=False, credentials = False, combine_output = True, io_enc = locale.getpreferredencoding())
assert act.clean_stdout == act.clean_expected_stdout
act.reset()
#-------------------------------------------------------------------
time.sleep(1) # Allow content of firebird log be fully flushed on disk.
fblog_2 = act.get_firebird_log()
###############################################################################################################
# POINT-2: check that diff between firebird.log initial and current content has phrases:
# Error creating file in TempTableDirectory "|DEFINITELY|INACCESSIBLE|"
# I/O error during "CreateFile (create)" operation for file "|DEFINITELY|INACCESSIBLE|\fb_table_mwyjb8"
# Error while trying to create file
#
diff_patterns = [
"\\+\\s+Error creating file in TempTableDirectory",
"\\+\\s+Error while trying to create file"
]
diff_patterns = [re.compile(s) for s in diff_patterns]
for line in unified_diff(fblog_1, fblog_2):
if line.startswith('+'):
if act.match_any(line, diff_patterns):
print(line)
expected_stdout_log_diff = """
+ Error creating file in TempTableDirectory
+ Error while trying to create file
"""
act.expected_stdout = expected_stdout_log_diff
act.stdout = capsys.readouterr().out
assert act.clean_stdout == act.clean_expected_stdout
act.reset()