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

547 lines
28 KiB
Python
Raw Normal View History

2021-04-26 20:07:00 +02:00
#coding:utf-8
#
# id: bugs.core_2981
# title: Error in Trace plugin (use local symbols in query)
2021-11-16 19:44:53 +01:00
# decription:
2021-04-26 20:07:00 +02:00
# Test prepares trace config as it was mentioned in the ticket, then creates .sql with russian text in UTF8 encoding
# and run trace and ISQL.
# Finally, we compare content of firebird.log before and after running this query (it should be empty) and check that
# size of error log of trace session is zero.
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# Checked on: WI-V2.5.7.27024, WI-V3.0.1.32570, WI-T4.0.0.316 -- all works OK.
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# tracker_id: CORE-2981
# min_versions: ['2.5.1']
# versions: 2.5.1
# qmid: None
import pytest
2021-11-17 19:43:06 +01:00
from threading import Thread, Barrier
2021-11-16 19:44:53 +01:00
from difflib import unified_diff
from firebird.qa import db_factory, python_act, Action
2021-04-26 20:07:00 +02:00
# version: 2.5.1
# resources: None
substitutions_1 = []
init_script_1 = """"""
db_1 = db_factory(sql_dialect=3, init=init_script_1)
# test_script_1
#---
# import os
# import time
# import subprocess
# import difflib
# from subprocess import Popen
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# os.environ["ISC_USER"] = user_name
# os.environ["ISC_PASSWORD"] = user_password
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# engine = str(db_conn.engine_version)
# db_conn.close()
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# #--------------------------------------------
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# def flush_and_close(file_handle):
# # https://docs.python.org/2/library/os.html#os.fsync
2021-11-16 19:44:53 +01:00
# # If you're starting with a Python file object f,
# # first do f.flush(), and
2021-04-26 20:07:00 +02:00
# # then do os.fsync(f.fileno()), to ensure that all internal buffers associated with f are written to disk.
# global os
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# file_handle.flush()
# if file_handle.mode not in ('r', 'rb'):
# # otherwise: "OSError: [Errno 9] Bad file descriptor"!
# os.fsync(file_handle.fileno())
# file_handle.close()
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# #--------------------------------------------
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# def cleanup( f_names_list ):
# global os
# for i in range(len( f_names_list )):
# if os.path.isfile( f_names_list[i]):
# os.remove( f_names_list[i] )
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# #--------------------------------------------
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# def svc_get_fb_log( engine, f_fb_log ):
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# global subprocess
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# if engine.startswith('2.5'):
# get_firebird_log_key='action_get_ib_log'
# else:
# get_firebird_log_key='action_get_fb_log'
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# subprocess.call([ context['fbsvcmgr_path'],
# "localhost:service_mgr",
# get_firebird_log_key
# ],
2021-11-16 19:44:53 +01:00
# stdout=f_fb_log,
2021-04-26 20:07:00 +02:00
# stderr=subprocess.STDOUT
# )
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# return
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# #--------------------------------------------
2021-11-16 19:44:53 +01:00
#
#
2021-04-26 20:07:00 +02:00
# txt25 = '''# Trace config, format for 2.5. Generated auto, do not edit!
# <database %[\\\\\\\\/]bugs.core_2981.fdb>
# enabled true
# #connection_id 7
# include_filter %(SELECT|INSERT|UPDATE|DELETE)%
# log_connections true
# log_transactions true
# log_statement_prepare true
# log_statement_free true
# log_statement_start true
# log_statement_finish true
# log_procedure_start true
# log_procedure_finish true
# log_trigger_start true
# log_trigger_finish true
# log_context true
# print_plan true
# print_perf true
# log_blr_requests false
# print_blr false
# log_dyn_requests false
# print_dyn false
# time_threshold 0
# max_sql_length 5000
# max_blr_length 500
# max_dyn_length 500
# max_arg_length 80
2021-11-16 19:44:53 +01:00
# max_arg_count 30
2021-04-26 20:07:00 +02:00
# </database>
# <services>
# enabled false
# log_services false
# log_service_query false
2021-11-16 19:44:53 +01:00
# </services>
2021-04-26 20:07:00 +02:00
# '''
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# # NOTES ABOUT TRACE CONFIG FOR 3.0:
# # 1) Header contains `database` clause in different format vs FB 2.5: its data must be enclosed with '{' '}'
# # 2) Name and value must be separated by EQUALITY sign ('=') in FB-3 trace.conf, otherwise we get runtime error:
# # element "<. . .>" have no attribute value set
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# txt30 = '''# Trace config, format for 3.0. Generated auto, do not edit!
# database=%[\\\\\\\\/]bugs.core_2981.fdb
# {
# enabled = true
# include_filter = %(SELECT|INSERT|UPDATE|DELETE)%
# log_connections = true
# log_transactions= true
# log_statement_prepare = true
# log_statement_free = true
# log_statement_start = true
# log_statement_finish = true
# log_procedure_start = true
# log_procedure_finish = true
# log_trigger_start = true
# log_trigger_finish = true
# log_context = true
# print_plan = true
# print_perf = true
# log_blr_requests = false
# print_blr = false
# log_dyn_requests = false
# print_dyn = false
# time_threshold = 0
# max_sql_length = 5000
# max_blr_length = 500
# max_dyn_length = 500
# max_arg_length = 80
2021-11-16 19:44:53 +01:00
# max_arg_count = 30
2021-04-26 20:07:00 +02:00
# }
# services {
# enabled = false
# log_services = false
# log_service_query = false
# }
# '''
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# f_trccfg=open( os.path.join(context['temp_directory'],'tmp_trace_2981.cfg'), 'w')
# if engine.startswith('2.5'):
# f_trccfg.write(txt25)
# else:
# f_trccfg.write(txt30)
# flush_and_close( f_trccfg )
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# # Get content of firebird.log BEFORE test:
# ##########################################
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# f_fblog_before=open( os.path.join(context['temp_directory'],'tmp_2981_fblog_before.txt'), 'w')
# svc_get_fb_log( engine, f_fblog_before )
# flush_and_close( f_fblog_before )
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# # Starting trace session in new child process (async.):
# #######################################################
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# f_trclog=open( os.path.join(context['temp_directory'],'tmp_trace_2981.log'), 'w')
# f_trcerr=open( os.path.join(context['temp_directory'],'tmp_trace_2981.err'), 'w')
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# # Execute a child program in a new process, redirecting STDERR to the same target as of STDOUT:
# p_trace=Popen([context['fbsvcmgr_path'], "localhost:service_mgr",
# "action_trace_start",
# "trc_cfg", f_trccfg.name],
2021-11-16 19:44:53 +01:00
# stdout=f_trclog,
2021-04-26 20:07:00 +02:00
# stderr=f_trcerr
# )
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# # Wait! Trace session is initialized not instantly!
# time.sleep(2)
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# localized_query='''
# set list on;
# select '*Лев Николаевич Толстой *
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# *Анна Каренина *
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# /Мне отмщение, и аз воздам/
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# *ЧАСТЬ ПЕРВАЯ*
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# *I *
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# Все счастливые семьи похожи друг на друга, каждая несчастливая
2021-11-16 19:44:53 +01:00
# семья несчастлива по-своему.
2021-04-26 20:07:00 +02:00
# Все смешалось в доме Облонских. Жена узнала, что муж был в связи
# с бывшею в их доме француженкою-гувернанткой, и объявила мужу, что
# не может жить с ним в одном доме. Положение это продолжалось уже
# третий день и мучительно чувствовалось и самими супругами, и всеми
# членами семьи, и домочадцами. Все члены семьи и домочадцы
# чувствовали, что нет смысла в их сожительстве и что на каждом
# постоялом дворе случайно сошедшиеся люди более связаны между собой,
# чем они, члены семьи и домочадцы Облонских. Жена не выходила из
# своих комнат, мужа третий день не было дома. Дети бегали по всему
# дому, как потерянные; англичанка поссорилась с экономкой и написала
# записку приятельнице, прося приискать ей новое место; повар ушел еще
2021-11-16 19:44:53 +01:00
# вчера со двора, во время обеда; черная кухарка и кучер просили расчета.
2021-04-26 20:07:00 +02:00
# На третий день после ссоры князь Степан Аркадьич Облонский --
# Стива, как его звали в свете, -- в обычный час, то есть в восемь
# часов утра, проснулся не в спальне жены, а в своем кабинете, на
# сафьянном диване... Он повернул свое полное, выхоленное тело на
# пружинах дивана, как бы желая опять заснуть надолго, с другой
# стороны крепко обнял подушку и прижался к ней щекой; но вдруг
2021-11-16 19:44:53 +01:00
# вскочил, сел на диван и открыл глаза.
2021-04-26 20:07:00 +02:00
# "Да, да, как это было? -- думал он, вспоминая сон. -- Да, как это
# было? Да! Алабин давал обед в Дармштадте; нет, не в Дармштадте, а
# что-то американское. Да, но там Дармштадт был в Америке. Да, Алабин
# давал обед на стеклянных столах, да, -- и столы пели: Il mio tesoro,
# и не Il mio tesoro, а что-то лучше, и какие-то маленькие графинчики,
2021-11-16 19:44:53 +01:00
# и они же женщины", -- вспоминал он.
2021-04-26 20:07:00 +02:00
# Глаза Степана Аркадьича весело заблестели, и он задумался,
# улыбаясь. "Да, хорошо было, очень хорошо. Много еще там было
# отличного, да не скажешь словами и мыслями даже наяву не выразишь".
# И, заметив полосу света, пробившуюся сбоку одной из суконных стор,
# он весело скинул ноги с дивана, отыскал ими шитые женой (подарок ко
# дню рождения в прошлом году), обделанные в золотистый сафьян туфли и
# по старой, девятилетней привычке, не вставая, потянулся рукой к тому
# месту, где в спальне у него висел халат. И тут он вспомнил вдруг,
# как и почему он спит не в спальне жены, а в кабинете; улыбка исчезла
2021-11-16 19:44:53 +01:00
# с его лица, он сморщил лоб.
2021-04-26 20:07:00 +02:00
# "Ах, ах, ах! Ааа!.." -- замычал он, вспоминая все, что было. И
# его воображению представились опять все подробности ссоры с женою,
# вся безвыходность его положения и мучительнее всего собственная вина
2021-11-16 19:44:53 +01:00
# его.
2021-04-26 20:07:00 +02:00
# "Да! она не простит и не может простить. И всего ужаснее то, что
# виной всему я, виной я, а не виноват. В этом-то вся драма, -- думал
# он. -- Ах, ах, ах!" -- приговаривал он с отчаянием, вспоминая самые
2021-11-16 19:44:53 +01:00
# тяжелые для себя впечатления из этой ссоры.
2021-04-26 20:07:00 +02:00
# Неприятнее всего была та первая минута, когда он, вернувшись из
# театра, веселый и довольный, с огромною грушей для жены в руке, не
# нашел жены в гостиной; к удивлению, не нашел ее и в кабинете и,
# наконец, увидал ее в спальне с несчастною, открывшею все, запиской в
2021-11-16 19:44:53 +01:00
# руке.
2021-04-26 20:07:00 +02:00
# Она, эта вечно озабоченная, и хлопотливая, и недалекая, какою он
# считал ее, Долли, неподвижно сидела с запиской в руке и с выражением
2021-11-16 19:44:53 +01:00
# ужаса, отчаяния и гнева смотрела на него.
# -- Что это? это? -- спрашивала она, указывая на записку.
2021-04-26 20:07:00 +02:00
# И при этом воспоминании, как это часто бывает, мучала Степана
# Аркадьича не столько самое событие, сколько то, как он ответил на
2021-11-16 19:44:53 +01:00
# эти слова жены.
2021-04-26 20:07:00 +02:00
# С ним случилось в эту минуту то, что случается с людьми, когда
# они неожиданно уличены в чем-нибудь слишком постыдном. Он не сумел
# приготовить свое лицо к тому положению, в которое он становился
# перед женой после открытия его вины. Вместо того чтоб оскорбиться,
# отрекаться, оправдываться, просить прощения, оставаться даже
# равнодушным -- все было бы лучше того, что он сделал! -- его лицо
# совершенно невольно ("рефлексы головного мозга", -- подумал Степан
# Аркадьич, который любил физиологию), совершенно невольно вдруг
2021-11-16 19:44:53 +01:00
# улыбнулось привычною, доброю и потому глупою улыбкой.
2021-04-26 20:07:00 +02:00
# Эту глупую улыбку он не мог простить себе. Увидав эту улыбку,
# Долли вздрогнула, как от физической боли, разразилась, со
# свойственною ей горячностью, потоком жестоких слов и выбежала из
2021-11-16 19:44:53 +01:00
# комнаты. С тех пор она не хотела видеть мужа.
# "Всему виной эта глупая улыбка", -- думал Степан Аркадьич.
2021-04-26 20:07:00 +02:00
# "Но что же делать? что делать?" -- с отчаянием говорил он себе и
2021-11-16 19:44:53 +01:00
# не находил ответа.
2021-04-26 20:07:00 +02:00
# ' from rdb$database;
# '''
# f_utf8 = open( os.path.join(context['temp_directory'],'tmp_2981_run.sql'), 'w')
# f_utf8.write(localized_query)
# flush_and_close( f_utf8 )
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# # RUN QUERY WITH NON-ASCII CHARACTERS
# #####################################
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# f_run_log = open( os.path.join(context['temp_directory'],'tmp_2981_run.log'), 'w')
# f_run_err = open( os.path.join(context['temp_directory'],'tmp_2981_run.err'), 'w')
# subprocess.call( [context['isql_path'], dsn, "-q", "-i", f_utf8.name, '-ch', 'utf8' ],
# stdout = f_run_log,
# stderr = f_run_err
# )
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# flush_and_close( f_run_log )
# flush_and_close( f_run_err )
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# #####################################################
# # Getting ID of launched trace session and STOP it:
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# # Save active trace session info into file for further parsing it and obtain session_id back (for stop):
# f_trclst=open( os.path.join(context['temp_directory'],'tmp_trace_2981.lst'), 'w')
# subprocess.call([context['fbsvcmgr_path'], "localhost:service_mgr",
# "action_trace_list"],
2021-11-16 19:44:53 +01:00
# stdout=f_trclst,
2021-04-26 20:07:00 +02:00
# stderr=subprocess.STDOUT
# )
# flush_and_close( f_trclst )
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# trcssn=0
# with open( f_trclst.name,'r') as f:
# for line in f:
# i=1
# if 'Session ID' in line:
# for word in line.split():
# if i==3:
# trcssn=word
# i=i+1
# break
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# # Result: `trcssn` is ID of active trace session. Now we have to terminate it:
# f_trclst=open(f_trclst.name,'a')
# f_trclst.seek(0,2)
# subprocess.call([context['fbsvcmgr_path'], "localhost:service_mgr",
# "action_trace_stop",
# "trc_id",trcssn],
# stdout=f_trclst, stderr=subprocess.STDOUT
# )
# flush_and_close( f_trclst )
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# # do NOT remove this delay: trase session can not be stopped immediatelly:
# time.sleep(2)
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# # Terminate child process of launched trace session (though it should already be killed):
# p_trace.terminate()
# flush_and_close( f_trclog )
# flush_and_close( f_trcerr )
2021-11-16 19:44:53 +01:00
#
#
2021-04-26 20:07:00 +02:00
# # Get content of firebird.log AFTER test:
# #########################################
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# f_fblog_after=open( os.path.join(context['temp_directory'],'tmp_2981_fblog_after.txt'), 'w')
# svc_get_fb_log( engine, f_fblog_after )
# flush_and_close( f_fblog_after )
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# # STDERR for ISQL (that created DB) and trace session - they both must be EMPTY:
# #################
# f_list=[f_run_err, f_trcerr]
# for i in range(len(f_list)):
# f_name=f_list[i].name
# if os.path.getsize(f_name) > 0:
# with open( f_name,'r') as f:
# for line in f:
# print("Unexpected STDERR, file "+f_name+": "+line)
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# # DIFFERENCE in the content of firebird.log should be EMPTY:
# ####################
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# oldfb=open(f_fblog_before.name, 'r')
# newfb=open(f_fblog_after.name, 'r')
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# difftext = ''.join(difflib.unified_diff(
2021-11-16 19:44:53 +01:00
# oldfb.readlines(),
2021-04-26 20:07:00 +02:00
# newfb.readlines()
# ))
# oldfb.close()
# newfb.close()
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# f_diff_txt=open( os.path.join(context['temp_directory'],'tmp_2981_diff.txt'), 'w')
# f_diff_txt.write(difftext)
# flush_and_close( f_diff_txt )
2021-11-16 19:44:53 +01:00
#
2021-04-26 20:07:00 +02:00
# with open( f_diff_txt.name,'r') as f:
# for line in f:
# print("Unexpected DIFF in firebird.log: "+line)
2021-11-16 19:44:53 +01:00
#
#
#
2021-04-26 20:07:00 +02:00
# # Cleanup:
# ###########
# time.sleep(1)
# cleanup( [i.name for i in (f_run_log, f_run_err, f_trccfg, f_trclst, f_trcerr, f_fblog_before,f_fblog_after, f_diff_txt, f_trclog, f_utf8)] )
2021-11-16 19:44:53 +01:00
#
#
2021-04-26 20:07:00 +02:00
#---
2021-11-16 19:44:53 +01:00
act_1 = python_act('db_1', substitutions=substitutions_1)
test_script_1 = """
set list on;
select '*Лев Николаевич Толстой *
*Анна Каренина *
/Мне отмщение, и аз воздам/
*ЧАСТЬ ПЕРВАЯ*
*I *
Все счастливые семьи похожи друг на друга, каждая несчастливая
семья несчастлива по-своему.
Все смешалось в доме Облонских. Жена узнала, что муж был в связи
с бывшею в их доме француженкою-гувернанткой, и объявила мужу, что
не может жить с ним в одном доме. Положение это продолжалось уже
третий день и мучительно чувствовалось и самими супругами, и всеми
членами семьи, и домочадцами. Все члены семьи и домочадцы
чувствовали, что нет смысла в их сожительстве и что на каждом
постоялом дворе случайно сошедшиеся люди более связаны между собой,
чем они, члены семьи и домочадцы Облонских. Жена не выходила из
своих комнат, мужа третий день не было дома. Дети бегали по всему
дому, как потерянные; англичанка поссорилась с экономкой и написала
записку приятельнице, прося приискать ей новое место; повар ушел еще
вчера со двора, во время обеда; черная кухарка и кучер просили расчета.
На третий день после ссоры князь Степан Аркадьич Облонский --
Стива, как его звали в свете, -- в обычный час, то есть в восемь
часов утра, проснулся не в спальне жены, а в своем кабинете, на
сафьянном диване... Он повернул свое полное, выхоленное тело на
пружинах дивана, как бы желая опять заснуть надолго, с другой
стороны крепко обнял подушку и прижался к ней щекой; но вдруг
вскочил, сел на диван и открыл глаза.
"Да, да, как это было? -- думал он, вспоминая сон. -- Да, как это
было? Да! Алабин давал обед в Дармштадте; нет, не в Дармштадте, а
что-то американское. Да, но там Дармштадт был в Америке. Да, Алабин
давал обед на стеклянных столах, да, -- и столы пели: Il mio tesoro,
и не Il mio tesoro, а что-то лучше, и какие-то маленькие графинчики,
и они же женщины", -- вспоминал он.
Глаза Степана Аркадьича весело заблестели, и он задумался,
улыбаясь. "Да, хорошо было, очень хорошо. Много еще там было
отличного, да не скажешь словами и мыслями даже наяву не выразишь".
И, заметив полосу света, пробившуюся сбоку одной из суконных стор,
он весело скинул ноги с дивана, отыскал ими шитые женой (подарок ко
дню рождения в прошлом году), обделанные в золотистый сафьян туфли и
по старой, девятилетней привычке, не вставая, потянулся рукой к тому
месту, где в спальне у него висел халат. И тут он вспомнил вдруг,
как и почему он спит не в спальне жены, а в кабинете; улыбка исчезла
с его лица, он сморщил лоб.
"Ах, ах, ах! Ааа!.." -- замычал он, вспоминая все, что было. И
его воображению представились опять все подробности ссоры с женою,
вся безвыходность его положения и мучительнее всего собственная вина
его.
"Да! она не простит и не может простить. И всего ужаснее то, что
виной всему я, виной я, а не виноват. В этом-то вся драма, -- думал
он. -- Ах, ах, ах!" -- приговаривал он с отчаянием, вспоминая самые
тяжелые для себя впечатления из этой ссоры.
Неприятнее всего была та первая минута, когда он, вернувшись из
театра, веселый и довольный, с огромною грушей для жены в руке, не
нашел жены в гостиной; к удивлению, не нашел ее и в кабинете и,
наконец, увидал ее в спальне с несчастною, открывшею все, запиской в
руке.
Она, эта вечно озабоченная, и хлопотливая, и недалекая, какою он
считал ее, Долли, неподвижно сидела с запиской в руке и с выражением
ужаса, отчаяния и гнева смотрела на него.
-- Что это? это? -- спрашивала она, указывая на записку.
И при этом воспоминании, как это часто бывает, мучала Степана
Аркадьича не столько самое событие, сколько то, как он ответил на
эти слова жены.
С ним случилось в эту минуту то, что случается с людьми, когда
они неожиданно уличены в чем-нибудь слишком постыдном. Он не сумел
приготовить свое лицо к тому положению, в которое он становился
перед женой после открытия его вины. Вместо того чтоб оскорбиться,
отрекаться, оправдываться, просить прощения, оставаться даже
равнодушным -- все было бы лучше того, что он сделал! -- его лицо
совершенно невольно ("рефлексы головного мозга", -- подумал Степан
Аркадьич, который любил физиологию), совершенно невольно вдруг
улыбнулось привычною, доброю и потому глупою улыбкой.
Эту глупую улыбку он не мог простить себе. Увидав эту улыбку,
Долли вздрогнула, как от физической боли, разразилась, со
свойственною ей горячностью, потоком жестоких слов и выбежала из
комнаты. С тех пор она не хотела видеть мужа.
"Всему виной эта глупая улыбка", -- думал Степан Аркадьич.
"Но что же делать? что делать?" -- с отчаянием говорил он себе и
не находил ответа.
' from rdb$database;
"""
2021-11-17 19:43:06 +01:00
def trace_session(act: Action, b: Barrier):
2021-11-16 19:44:53 +01:00
cfg30 = ['# Trace config, format for 3.0. Generated auto, do not edit!',
f'database=%[\\\\/]{act.db.db_path.name}',
'{',
' enabled = true',
' include_filter = %(SELECT|INSERT|UPDATE|DELETE)%',
' exclude_filter = %no_trace%',
' log_connections = true',
' log_transactions = true',
' log_statement_prepare = true',
' log_statement_free = true',
' log_statement_start = true',
' log_statement_finish = true',
' log_trigger_start = true',
' log_trigger_finish = true',
' log_context = true',
' print_plan = true',
' print_perf = true',
' time_threshold = 0',
' max_sql_length = 5000',
' max_blr_length = 500',
' max_dyn_length = 500',
' max_arg_length = 80',
' max_arg_count = 30',
'}',
'services {',
' enabled = false',
' log_services = false',
' log_service_query = false',
'}']
with act.connect_server() as srv:
srv.encoding = 'utf8'
srv.trace.start(config='\n'.join(cfg30))
2021-11-17 19:43:06 +01:00
b.wait()
2021-11-16 19:44:53 +01:00
for line in srv:
pass # we are not interested in trace output
2021-04-26 20:07:00 +02:00
@pytest.mark.version('>=2.5.1')
2021-11-16 19:44:53 +01:00
def test_1(act_1: Action):
2021-11-17 19:43:06 +01:00
b = Barrier(2)
2021-11-16 19:44:53 +01:00
# Get content of firebird.log BEFORE test
with act_1.connect_server() as srv:
srv.info.get_log()
log_before = srv.readlines()
2021-11-17 19:43:06 +01:00
trace_thread = Thread(target=trace_session, args=[act_1, b])
2021-11-16 19:44:53 +01:00
trace_thread.start()
2021-11-17 19:43:06 +01:00
b.wait()
2021-11-16 19:44:53 +01:00
# RUN QUERY WITH NON-ASCII CHARACTERS
act_1.isql(switches=['-n', '-q'], input=test_script_1)
with act_1.connect_server() as srv:
for session in list(srv.trace.sessions.keys()):
srv.trace.stop(session_id=session)
trace_thread.join(1.0)
if trace_thread.is_alive():
pytest.fail('Trace thread still alive')
# Get content of firebird.log AFTER test
with act_1.connect_server() as srv:
srv.info.get_log()
log_after = srv.readlines()
assert '\n'.join(unified_diff(log_before, log_after)) == ''
2021-04-26 20:07:00 +02:00