2021-04-26 20:07:00 +02:00
#coding:utf-8
#
# id: bugs.core_6097
# title: Connection does not see itself in the MON$ATTACHMENTS when Domain/Username (using SSPI) is 31 bytes long
# decription:
# Could not reproduce bug on WI-V3.0.4.33054, discussed this with dimitr and alex.
# Problem can appear randomly when some byte in memory contains value not equal to 0x0.
# It was decided to implement test that
# * adds user with name of 31 octets (15 non-ascii, plus 1 ascii character: "К о ва ле вс кий_О ле г ");
# * launches ISQL utility as separate process with trying to connect do test DB using this non-ascii login;
# * count record in mon$attachments table that belongs to current attachment. Result must be: 1.
# ::: NB :::
# As of fdb 2.0.1 and fbtest 1.0.7, there is NO ability to run macros runProgram() with specifying non-ascii user name
# in its parameters list: errror 'invalid user/password' will raise in this case. The same error will be raised if we
# try to launch isql directly in subprocess.call(). For this reason it was decided to create temporary BATCH file (.bat)
# that contains necessary command to run isql.exe, i.e. we actually invoke new instance of cmd.exe.
# The reason of why 'invalid user/password' raises (in other cases) remains unclear for me.
# Checked on:
# 4.0.0.1564: OK, 3.910s.
# 4.0.0.1535: OK, 4.052s.
# 3.0.5.33160: OK, 1.971s.
# 3.0.5.33152: OK, 3.860s.
#
# tracker_id: CORE-6097
# min_versions: ['3.0.5']
# versions: 3.0.5
# qmid: None
import pytest
from firebird . qa import db_factory , isql_act , Action
# version: 3.0.5
# resources: None
substitutions_1 = [ ]
init_script_1 = """ """
db_1 = db_factory ( sql_dialect = 3 , init = init_script_1 )
# test_script_1
#---
#
# import os
# import subprocess
# import time
# import fdb
# from fdb import services
#
# os.environ["ISC_USER"] = user_name
# os.environ["ISC_PASSWORD"] = user_password
# db_conn.close()
#
# fb_home = services.connect(host='localhost', user= user_name, password= user_password).get_home_directory()
#
# sql_txt='''
# -- fb_home = %s
# set bail on;
# set count on;
# set list on;
# create or alter user "К о ва ле вс кий_О ле г " password '123' using plugin Srp;
# commit;
# set list on;
# select sec$user_name, octet_length(trim(sec$user_name)) as octets_in_name from sec$users where sec$user_name = 'К о ва ле вс кий_О ле г ';
# commit;
# ''' % (fb_home,)
#
# f_init_sql=open( os.path.join(context['temp_directory'],'tmp_6097_prepare.sql'), 'w')
# f_init_sql.write( sql_txt )
# f_init_sql.close()
#
# f_init_log=open( os.path.join(context['temp_directory'],'tmp_6097_prepare.log'), 'w')
#
# subprocess.call([ fb_home+"isql", dsn, "-q", "-ch", "utf8", "-i", f_init_sql.name], stdout=f_init_log, stderr=subprocess.STDOUT)
# f_init_log.close()
#
# # does not work, raises 'invalid user/password':
# #runProgram( fb_home+'isql', [dsn, "-q", "-user", "К о ва ле вс кий_О ле г ", "-pas", "123" ], 'set list on; set count on; select * from mon$attachments where mon$attachment_id = current_connection;')
#
# f_check_sql=open( os.path.join(context['temp_directory'],'tmp_6097_check.sql'), 'w')
# #f_check_sql.write( 'set list on; select count(*) as "Can_i_see_myself ?" from mon$attachments where mon$attachment_id = current_connection;' )
# f_check_sql.write( 'set count on; set list on; select mon$user as who_am_i, left(mon$remote_protocol,3) as mon_protocol, mon$auth_method as mon_auth_method from mon$attachments where mon$attachment_id = current_connection;' )
# f_check_sql.close()
#
# f_bat_text='''
# @echo off
# chcp 65001 1>nul
# %s %s -user "К о ва ле вс кий_О ле г " -pas 123 -ch utf8 -q -i %s
# ''' % ( fb_home+'isql.exe', dsn, f_check_sql.name )
# #''' % ( fb_home+'isql.exe', 'localhost:employee', f_check_sql.name )
#
# f_check_bat=open( os.path.join(context['temp_directory'],'tmp_6097_check.bat'), 'w')
# f_check_bat.write( f_bat_text )
# f_check_bat.close()
#
# f_check_log=open( os.path.join(context['temp_directory'],'tmp_6097_check.log'), 'w')
# # does not work, raises 'invalid user/password': subprocess.call(["isql", dsn, "-q", "-user", "К о ва ле вс кий_О ле г ", "-pas", "123", "-ch", "utf8", "-i", f_check_sql.name], stdout=f_run_log, stderr=subprocess.STDOUT)
# subprocess.call([f_check_bat.name], stdout=f_check_log, stderr=subprocess.STDOUT)
# f_check_log.close()
#
# # Let redirected output of isql be flushed on disk:
# time.sleep(1)
#
# with open( f_init_log.name,'r') as f:
# for line in f:
# print(line)
#
# with open( f_check_log.name,'r') as f:
# for line in f:
# print(line)
#
# # Cleanup.
# ##########
#
# f_list = (f_init_sql, f_init_log, f_check_sql, f_check_bat, f_check_log)
# for i in range(len(f_list)):
# if os.path.isfile(f_list[i].name):
# os.remove(f_list[i].name)
#
#
#---
#act_1 = python_act('db_1', test_script_1, substitutions=substitutions_1)
expected_stdout_1 = """
SEC $ USER_NAME К о ва ле вс кий_О ле г
OCTETS_IN_NAME 31
Records affected : 1
WHO_AM_I К о ва ле вс кий_О ле г
MON_PROTOCOL TCP
MON_AUTH_METHOD Srp
Records affected : 1
"""
@pytest.mark.version ( ' >=3.0.5 ' )
@pytest.mark.platform ( ' Windows ' )
@pytest.mark.xfail
2021-04-28 12:42:11 +02:00
def test_1 ( db_1 ) :
2021-04-26 20:07:00 +02:00
pytest . fail ( " Test not IMPLEMENTED " )