6
0
mirror of https://github.com/FirebirdSQL/firebird-qa.git synced 2025-01-22 13:33:07 +01:00
firebird-qa/tests/bugs/gh_8353_test.py

74 lines
2.6 KiB
Python

#coding:utf-8
"""
ID: issue-8353
ISSUE: https://github.com/FirebirdSQL/firebird/issues/8353
TITLE: Report unique usernames for isc_info_user_names
DESCRIPTION:
Test uses DbInfoCode.USER_NAMES property to obtain AGGREGATED info for every connected user (instead of getting list).
This info looks like:
<USERNAME> : <N_COUNT>
- where:
<USERNAME> = name of connected user
<N_COUNT> = number of attachments created by <USERNAME>, total for BOTH auth plugins: Srp + Legacy.
NOTES:
[19.12.2024] pzotov
Confirmed ticket issue on 6.0.0.552: N_COUNT > 1 are shown for both SYSDBA and non-dba users when they make more than one attachment.
Checked on 6.0.0.553-7ebb66b, 5.0.2.1580-7961de2, 4.0.6.3172-4119f625: every user is specified only once, i.e. N_COUNT = 1
[21.12.2024] pzotov
Added pytest.skip() directive if ServerMode is not Super because there is no way to get info about other users for NON-dba.
See letter from Vlad, 21.12.2024 13:07.
"""
import pytest
from firebird.qa import *
from firebird.driver import DatabaseError, DbInfoCode
db = db_factory()
act = python_act('db', substitutions = [('[ \t]+', ' ')])
N_CONNECTIONS = 3
TMP_USER_NAME = 'TMP$8353'
tmp_user_leg = user_factory('db', name = TMP_USER_NAME, password = '123', plugin = 'Legacy_UserManager')
tmp_user_srp = user_factory('db', name = TMP_USER_NAME, password = '456', plugin = 'Srp')
# set width mon_user 16;
# set width auth_method 20;
# select mon$attachment_id, trim(mon$user) as mon_user, mon$auth_method as auth_method, count(*)over(partition by mon$user), count(*)over(partition by mon$user, mon$auth_method) from mon$attachments;
#-----------------------------------------------------------------------
@pytest.mark.version('>=4.0.6')
def test_1(act: Action, tmp_user_leg: User, tmp_user_srp: User, capsys):
if act.vars['server-arch'] != 'SuperServer':
pytest.skip("Can not be checked on CS/SC.")
try:
with act.db.connect() as con1, \
act.db.connect() as con2:
conn_lst = []
for i in range(N_CONNECTIONS):
for u in (tmp_user_leg, tmp_user_srp):
conn_lst.append( act.db.connect(user = u.name, password = u.password) )
for k,v in sorted(con1.info.get_info(DbInfoCode.USER_NAMES).items()):
print(k,':',v)
for c in conn_lst:
c.close()
except DatabaseError as e:
print(e.__str__())
act.expected_stdout = f"""
{act.db.user} : 1
{TMP_USER_NAME} : 1
"""
act.stdout = capsys.readouterr().out
assert act.clean_stdout == act.clean_expected_stdout