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
|
|
|
|
|
|
|
|
|
|