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_0733_test.py

359 lines
13 KiB
Python

#coding:utf-8
#
# id: bugs.core_0733
# title: Compress Data over the Network
# decription:
# CHANGED 22.12.2019: CODE REDUCTION: REMOVED MEASURES OT TIME.
# Results are completely opposite to those which were obtained on snapshots when this test was implenmented (3.0.5.33084, 4.0.0.1347).
# Requirement to compress data leads to DEGRADATION of performance when data are stored on local machine, and we have no ability
# to change storage when fbt_run is in work (at least for nowadays).
# After discuss with dimitr it was decided to remove any logging and its analysis.
# We only verify matching of RDB$GET_CONTEXT('SYSTEM', 'WIRE_COMPRESSED') and value that was stored in the firebird.conf
# for current check.
#
# ### NOTE ###
# Changed value of parameter WireCompression (in firebird.conf) will be seen by application if it reloads client library.
# Reconnect is NOT enough for this. For this reason we use subprocess and call ISQL utility to do above mentioned actions
# in new execution context.
#
# See also tests for:
# CORE-5536 - checks that field mon$wire_compressed actually exists in MON$ATTACHMENTS table;
# CORE-5913 - checks that built-in rdb$get_context('SYSTEM','WIRE_ENCRYPTED') is avaliable;
#
# Checked on:
# 4.0.0.1693 SS: 3.031s.
# 4.0.0.1346 SC: 2.890s.
# 4.0.0.1691 CS: 3.678s.
# 3.0.5.33215 SS: 1.452s.
# 3.0.5.33084 SC: 1.344s.
# 3.0.5.33212 CS: 3.175s.
#
#
# tracker_id: CORE-0733
# min_versions: ['3.0.0']
# versions: 3.0
# qmid: None
import pytest
from firebird.qa import db_factory, isql_act, Action
# version: 3.0
# resources: None
substitutions_1 = []
init_script_1 = """
create domain dm_dump varchar(32700) character set none;
recreate table t_log( required_value varchar(5), actual_value varchar(5), elap_ms int );
commit;
set term ^;
create or alter procedure sp_uuid(a_compressable boolean, n_limit int default 1)
returns (b dm_dump) as
declare g char(16) character set octets;
begin
if ( a_compressable ) then
while (n_limit > 0) do
begin
g = gen_uuid();
b = lpad('',32700, 'AAAAAAAAAAAAAAAA' );
n_limit = n_limit - 1;
suspend;
end
else
while (n_limit > 0) do
begin
b = lpad('',32700, gen_uuid() );
n_limit = n_limit - 1;
suspend;
end
end
^
set term ;^
commit;
"""
db_1 = db_factory(sql_dialect=3, init=init_script_1)
# test_script_1
#---
#
# import os
# import time as tm
# import datetime
# from time import time
# import re
# import shutil
# import subprocess
# import platform
#
# from fdb import services
#
# os.environ["ISC_USER"] = user_name
# os.environ["ISC_PASSWORD"] = user_password
#
# DB_NAME = '$(DATABASE_LOCATION)' + 'bugs.core_0733.fdb'
#
# DB_PATH = '$(DATABASE_LOCATION)'
# U_NAME = user_name
# U_PSWD = user_password
# NUL_DEVICE = 'nul' if platform.system() == 'Windows' else '/dev/null'
#
# N_ROWS = 1
#
# F_SQL_NAME=os.path.join(context['temp_directory'],'tmp_core_0733.sql')
#
# fb_home = services.connect(host='localhost', user= user_name, password= user_password).get_home_directory()
# dts = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
# fbconf_bak = fb_home+'firebird_'+dts+'.tmp_0733.bak'
# shutil.copy2( fb_home+'firebird.conf', fbconf_bak )
#
# db_conn.close()
#
# #--------------------------------------------
#
# def flush_and_close(file_handle):
# # https://docs.python.org/2/library/os.html#os.fsync
# # If you're starting with a Python file object f,
# # first do f.flush(), and
# # then do os.fsync(f.fileno()), to ensure that all internal buffers associated with f are written to disk.
# global os
#
# 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()
#
# #--------------------------------------------
#
# def prepare_fb_conf( fb_home, a_required_value ):
#
# f_fbconf=open(fb_home+'firebird.conf','r')
# fbconf_content=f_fbconf.readlines()
# f_fbconf.close()
# for i,s in enumerate( fbconf_content ):
# if s.lower().lstrip().startswith( 'wirecompression'.lower() ):
# fbconf_content[i] = '# <temply commented> ' + s
#
# fbconf_content.append('\\n# Temporarily added by fbtest, CORE-0733. Should be removed auto:')
# fbconf_content.append("\\n#" + '='*30 )
# fbconf_content.append('\\nWireCompression = %s' % a_required_value )
# fbconf_content.append("\\n#" + '='*30 )
# fbconf_content.append("\\n" )
#
# f_fbconf=open(fb_home+'firebird.conf','w')
# f_fbconf.writelines( fbconf_content )
# f_fbconf.close()
# #------------------------------------------------------------------------------------
#
# def prepare_sql_4run( required_compression, db_path, n_rows, sql_file_name ):
# global os
# global U_NAME
# global U_PSWD
# global NUL_DEVICE
#
# sql_dump='tmp_core_0733_compression_%(required_compression)s.dump' % ( locals() )
#
# if os.path.isfile( '%(db_path)s%(sql_dump)s' % (locals()) ):
# os.remove( '%(db_path)s%(sql_dump)s' % (locals()) )
#
# if n_rows is None:
# return
#
# #------------------
#
# sql_text='''
# set list on;
#
# set term ^;
# execute block returns(dts timestamp) as
# begin
# dts = 'now';
# rdb$set_context('USER_SESSION','DTS_BEG', dts);
# suspend;
# end
# ^
# set term ;^
#
# --out %(db_path)s%(sql_dump)s;
# out nul;
#
# set term ^;
# execute block returns(b dm_dump) as
# begin
# /***********
# for
# execute statement 'select b from sp_uuid( true, %(n_rows)s )'
# on external 'localhost:' || rdb$get_context('SYSTEM', 'DB_NAME')
# as user '%(U_NAME)s' password '%(U_PSWD)s'
# into b
# do
# suspend;
# ***********/
# end
# ^
# set term ;^
# out;
#
# set term ^;
# execute block returns(dts timestamp) as
# begin
# dts = 'now';
# rdb$set_context('USER_SESSION','DTS_END', dts);
# suspend;
# end
# ^
# set term ;^
#
# insert into t_log( required_value, actual_value, elap_ms)
# values(
# upper( '%(required_compression)s' )
# ,upper( rdb$get_context('SYSTEM','WIRE_COMPRESSED') )
# ,datediff( millisecond
# from cast(rdb$get_context('USER_SESSION','DTS_BEG') as timestamp)
# to cast(rdb$get_context('USER_SESSION','DTS_END') as timestamp)
# )
# )
# returning required_value, actual_value, elap_ms
# ;
# commit;
# ''' % dict(globals(), **locals())
# # ( locals() )
#
# f_sql=open( sql_file_name, 'w')
# f_sql.write( sql_text )
# f_sql.close()
#
# #-------------------------
#
# # Call for removing dump from disk:
# prepare_sql_4run( 'false', DB_PATH, None, None )
# prepare_sql_4run( 'true', DB_PATH, None, None )
#
#
# REQUIRED_WIRE_COMPRESSION = 'false'
# # ------------------------------------------------------ ###########
# # Generate SQL script for running when WireCompression = |||FALSE|||
# # ------------------------------------------------------ ###########
# prepare_sql_4run( REQUIRED_WIRE_COMPRESSION, DB_PATH, N_ROWS, F_SQL_NAME )
#
# # ------------------------------------------------------ ###########
# # Update content of firebird.conf with WireCompression = |||FALSE|||
# # ------------------------------------------------------ ###########
# prepare_fb_conf( fb_home, REQUIRED_WIRE_COMPRESSION)
#
#
# # --------------------------------------------------------------------------------------
# # Launch ISQL in separate context of execution with job to obtain data and log duration
# # --------------------------------------------------------------------------------------
#
# fn_log = open(os.devnull, 'w')
# #fn_log = open( os.path.join(context['temp_directory'],'tmp_0733_with_compression.log'), 'w')
# f_isql_obtain_data_err = open( os.path.join(context['temp_directory'],'tmp_0733_obtain_data.err'), 'w')
#
# subprocess.call( [ context['isql_path'], dsn, "-i", F_SQL_NAME ],
# stdout = fn_log,
# stderr = f_isql_obtain_data_err
# )
# fn_log.close()
# f_isql_obtain_data_err.close()
#
# # Call for removing dump from disk:
# #prepare_sql_4run( False, DB_PATH, None, None )
# #prepare_sql_4run( True, DB_PATH, None, None )
#
#
# # Update content of firebird.conf with WireCompression = true
# ##############################################################
#
# REQUIRED_WIRE_COMPRESSION = 'true'
# # ------------------------------------------------------ ###########
# # Generate SQL script for running when WireCompression = ||| TRUE|||
# # ------------------------------------------------------ ###########
# prepare_sql_4run( REQUIRED_WIRE_COMPRESSION, DB_PATH, N_ROWS, F_SQL_NAME )
#
# # ------------------------------------------------------ ###########
# # Update content of firebird.conf with WireCompression = ||| TRUE|||
# # ------------------------------------------------------ ###########
# prepare_fb_conf( fb_home, REQUIRED_WIRE_COMPRESSION)
#
# fn_log = open(os.devnull, 'w')
# #fn_log = open( os.path.join(context['temp_directory'],'tmp_0733_without_compress.log'), 'w')
# f_isql_obtain_data_err = open( os.path.join(context['temp_directory'],'tmp_0733_obtain_data.err'), 'a')
#
# subprocess.call( [ context['isql_path'], dsn, "-i", F_SQL_NAME ],
# stdout = fn_log,
# stderr = f_isql_obtain_data_err
# )
# fn_log.close()
# flush_and_close( f_isql_obtain_data_err )
#
# # Call for removing dump from disk:
# #prepare_sql_4run( REQUIRED_WIRE_COMPRESSION, DB_PATH, None, None )
#
# # RESTORE original config:
# ##########################
# shutil.copy2( fbconf_bak , fb_home+'firebird.conf')
#
# sql='''
# -- select * from t_log;
# -- REQUIRED_VALUE ACTUAL_VALUE ELAP_MS
# -- ============== ============ ============
# -- FALSE FALSE 2187
# -- TRUE TRUE 1782
# set list on;
# select
# result_of_req_compare_to_actual
# --,iif( slowest_with_compression < fastest_without_compression,
# -- 'EXPECTED: compression was FASTER.',
# -- 'POOR. slowest_with_compression=' || slowest_with_compression || ', fastest_without_compression=' || fastest_without_compression
# -- ) as result_of_compression_benchmark
# from (
# select
# min( iif( upper(required_value) is distinct from upper(actual_value)
# ,coalesce(required_value,'<null>') || coalesce(actual_value,'<null>')
# ,'EXPECTED: actual values were equal to required.'
# )
# ) as result_of_req_compare_to_actual
# ,min( iif( upper(required_value) = upper('false'), elap_ms, null ) ) fastest_without_compression
# ,max( iif( upper(required_value) = upper('true'), elap_ms, null ) ) slowest_with_compression
# from t_log
# )
# ;
# set list off;
# --select * from t_log;
#
# '''
# runProgram('isql', [ dsn ], sql)
#
#
# # Additional check: STDERR for ISQL must be EMPTY.
# ##################################################
#
# f_list=(f_isql_obtain_data_err,)
# 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)
#
# os.remove(f_isql_obtain_data_err.name)
# os.remove(fbconf_bak)
# os.remove(F_SQL_NAME)
#
#
#---
#act_1 = python_act('db_1', test_script_1, substitutions=substitutions_1)
expected_stdout_1 = """
RESULT_OF_REQ_COMPARE_TO_ACTUAL EXPECTED: actual values were equal to required.
"""
@pytest.mark.version('>=3.0')
@pytest.mark.xfail
def test_1(db_1):
pytest.fail("Test not IMPLEMENTED")