mirror of
https://github.com/FirebirdSQL/firebird-qa.git
synced 2025-01-22 13:33:07 +01:00
Added/Updated tests\functional\tabloid\test_fd0fa8a3.py: Checked on Windows/Linux, 6.0.0.423, 5.0.2.1477, 4.0.6.3141.
This commit is contained in:
parent
0dda045d63
commit
a363977696
137
tests/functional/tabloid/test_fd0fa8a3.py
Normal file
137
tests/functional/tabloid/test_fd0fa8a3.py
Normal file
@ -0,0 +1,137 @@
|
||||
#coding:utf-8
|
||||
|
||||
"""
|
||||
ID: None
|
||||
ISSUE: https://github.com/FirebirdSQL/firebird/commit/fd0fa8a3a58fbfe7fdc0641b4e48258643d72127
|
||||
TITLE: Let include file name into error message when creation of temp file failed.
|
||||
DESCRIPTION:
|
||||
Test uses pre-created databases.conf which has alias 'tmp_fd0fa8a3_alias' (see variable REQUIRED_ALIAS).
|
||||
Database file for that alias must NOT exist in the $(dir_sampleDb)/qa/ subdirectory: it will be created here.
|
||||
For this alias parameter TempTableDirectory is defined and it points to invalid/inaccessible directory.
|
||||
Currently its value is: '<>' (without single quotes), so there is no way to create any file in it.
|
||||
We check that:
|
||||
* client still has ability to create GTT and put data in it, without getting error;
|
||||
* firebird.log will have appropriate message about problem with creating file ('fb_*****') in TempTableDirectory
|
||||
NOTES:
|
||||
[12.08.2024] pzotov
|
||||
1. One need to be sure that firebird.conf does NOT contain DatabaseAccess = None.
|
||||
2. 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!)
|
||||
3. 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()"
|
||||
4. Invalid value of TempTableDirectory causes appropriate message to appear in firebird.log TWO times: first when QA-plugin prepares
|
||||
test database (and this is out of scope to be checked by this test), and second when we try to insert data in the GTT.
|
||||
DDL statement ('create global temporary table') does NOT cause any message in firebird.log until we do not try to add data in it.
|
||||
Because of that, difference between content of firebird.log will contain only ONE message "Error creating file...".
|
||||
|
||||
Parameter 'TempTableDirectory' exists in FB-4.x since 20.04.2021, commit f2805020a6f34d253c93b8edac6068c1b35f9b89., build 4.0.0.2436.
|
||||
Checked on Windows/Linux, 6.0.0.423, 5.0.2.1477, 4.0.6.3141.
|
||||
"""
|
||||
|
||||
import os
|
||||
import re
|
||||
import locale
|
||||
from difflib import unified_diff
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
from firebird.qa import *
|
||||
|
||||
REQUIRED_ALIAS = 'tmp_fd0fa8a3_alias'
|
||||
|
||||
substitutions = [ ('[ \t]+', ' ')
|
||||
,('Error creating file in TempTableDirectory.*', 'Error creating file in TempTableDirectory')
|
||||
,('I/O error during "((CreateFile\\s+\\(create\\))|open)" operation for file.*', 'I/O error during CreateFile operation for file')
|
||||
]
|
||||
db = db_factory(filename = '#' + REQUIRED_ALIAS)
|
||||
act = python_act('db', substitutions = substitutions)
|
||||
|
||||
@pytest.mark.version('>=4.0')
|
||||
def test_1(act: Action, capsys):
|
||||
|
||||
# Scan line-by-line through databases.conf, find line starting with REQUIRED_ALIAS and extract name of file that
|
||||
# must be created in the $(dir_sampleDb)/qa/ folder. This name will be used further as target database (tmp_fdb).
|
||||
# NOTE: we have to SKIP lines which are commented out, i.e. if they starts with '#':
|
||||
p_required_alias_ptn = re.compile( '^(?!#)((^|\\s+)' + REQUIRED_ALIAS + ')\\s*=\\s*\\$\\(dir_sampleDb\\)/qa/', re.IGNORECASE )
|
||||
fname_in_dbconf = None
|
||||
|
||||
with open(act.home_dir/'databases.conf', 'r') as f:
|
||||
for line in f:
|
||||
if p_required_alias_ptn.search(line):
|
||||
# If databases.conf contains line like this:
|
||||
# tmp_NNNN_alias = $(dir_sampleDb)/qa/tmp_qa_NNNN.fdb
|
||||
# - then we extract filename: 'tmp_qa_NNNN.fdb' (see below):
|
||||
fname_in_dbconf = Path(line.split('=')[1].strip()).name
|
||||
break
|
||||
|
||||
# if 'fname_in_dbconf' remains undefined here then propably REQUIRED_ALIAS not equals to specified in the databases.conf!
|
||||
#
|
||||
assert fname_in_dbconf
|
||||
|
||||
check_sql = f"""
|
||||
set bail on;
|
||||
recreate global temporary table test(x int);
|
||||
set count on;
|
||||
insert into test(x) values(1);
|
||||
"""
|
||||
|
||||
# Check-1: no error must be issued on client-side, all records have to be inserted:
|
||||
#
|
||||
expected_stdout = f"""
|
||||
Records affected: 1
|
||||
"""
|
||||
|
||||
# Get content of firebird.log BEFORE test.
|
||||
# ::: NB :::
|
||||
# At this point firebird.log must already contain message about unable to create file because of inaccessible TempTableDirectory value.
|
||||
# This message was added when test database have been created by QA-plugin, i.e. out of this test code. So, the difference between
|
||||
# log content will NOT contain this message!
|
||||
#
|
||||
log_before = act.get_firebird_log()
|
||||
|
||||
act.expected_stdout = expected_stdout
|
||||
act.isql(switches=['-q'], input = check_sql, combine_output = True, io_enc = locale.getpreferredencoding())
|
||||
assert act.clean_stdout == act.clean_expected_stdout
|
||||
act.reset()
|
||||
|
||||
# Get content of firebird.log AFTER test.
|
||||
# ONLY ONE message about invalid TempTableDirectory value will be taken in account!
|
||||
#
|
||||
log_after = act.get_firebird_log()
|
||||
|
||||
#----------------------------------------------------
|
||||
|
||||
# Check-2: firebird.log must have message (partially localized):
|
||||
# on Windows:
|
||||
# Database: ...
|
||||
# Error creating file in TempTableDirectory "..."
|
||||
# I/O error during "CreateFile (create)" operation for file "..."
|
||||
# Error while trying to create file
|
||||
# Syntax error in file name, folder name, or volume label [ NB: THIS LINE CAN BE LOCALIZED ]
|
||||
#
|
||||
# on LINUX:
|
||||
# Database: ...
|
||||
# Error creating file in TempTableDirectory "..."
|
||||
# I/O error during "open" operation for file "..."
|
||||
# Error while trying to create file
|
||||
# No such file or directory
|
||||
|
||||
allowed_patterns = [ re.compile('Error creating file in TempTableDirectory',re.IGNORECASE),
|
||||
re.compile('I/O error during "((CreateFile\\s+\\(create\\))|open)" operation for file',re.IGNORECASE),
|
||||
re.compile('Error while trying to create file',re.IGNORECASE)
|
||||
]
|
||||
|
||||
for line in unified_diff(log_before, log_after):
|
||||
if (msg := line.strip()):
|
||||
if msg.startswith('+') and act.match_any(msg, allowed_patterns):
|
||||
print(msg[1:])
|
||||
|
||||
act.expected_stdout = """
|
||||
Error creating file in TempTableDirectory
|
||||
I/O error during "CreateFile (create)" operation for file
|
||||
Error while trying to create file
|
||||
"""
|
||||
act.stdout = capsys.readouterr().out
|
||||
assert act.clean_stdout == act.clean_expected_stdout
|
||||
act.reset()
|
Loading…
Reference in New Issue
Block a user