6
0
mirror of https://github.com/FirebirdSQL/firebird-qa.git synced 2025-01-23 05:53:06 +01:00
firebird-qa/tests/bugs/core_5673_test.py

129 lines
4.5 KiB
Python

#coding:utf-8
"""
ID: issue-5939
ISSUE: 5939
TITLE: Unique constraint not working in encrypted database on first command
DESCRIPTION:
We create new database ('tmp_core_5673.fdb') and try to encrypt it using IBSurgeon Demo Encryption package
( https://ib-aid.com/download-demo-firebird-encryption-plugin/ ; https://ib-aid.com/download/crypt/CryptTest.zip )
License file plugins\\dbcrypt.conf with unlimited expiration was provided by IBSurgeon to Firebird Foundation (FF).
This file was preliminary stored in FF Test machine.
Test assumes that this file and all neccessary libraries already were stored into FB_HOME and %FB_HOME%\\plugins.
We create table with UNIQUE constraint, add some data to it and try to encrypt database using 'alter database encrypt with <plugin_name> ...'
command (where <plugin_name> = dbcrypt - name of .dll in FB_HOME\\plugins\\ folder that implements encryption).
Then we allow engine to complete this job - take delay about 1..2 seconds BEFORE detach from database.
After this we make TWO attempts to insert duplicates and catch exceptions for each of them and print exception details.
Expected result: TWO exception must occur here.
::: NB ::::
Could not check reproducing of bug on FB 3.0.2 because there is no encryption plugin for this (too old) version.
Decided only to ensure that exception will be catched on recent FB version for each attempt to insert duplicate.
Checked on:
4.0.0.1524: OK, 4.056s ; 4.0.0.1421: OK, 6.160s.
3.0.5.33139: OK, 2.895s ; 3.0.5.33118: OK, 2.837s.
15.04.2021. Adapted for run both on Windows and Linux. Checked on:
Windows: 4.0.0.2416
Linux: 4.0.0.2416
JIRA: CORE-5673
FBTEST: bugs.core_5673
"""
import pytest
from firebird.qa import *
db = db_factory()
act = python_act('db')
expected_stdout = """
Error while executing SQL statement:
- SQLCODE: -803
- violation of PRIMARY or UNIQUE KEY constraint "TEST_X_UNQ" on table "TEST"
- Problematic key value is ("X" = 1)
-803
335544665
Error while executing SQL statement:
- SQLCODE: -803
- violation of PRIMARY or UNIQUE KEY constraint "TEST_X_UNQ" on table "TEST"
- Problematic key value is ("X" = 2)
-803
335544665
"""
@pytest.mark.skip('FIXME: encryption plugin')
@pytest.mark.version('>=3.0.3')
def test_1(act: Action):
pytest.fail("Not IMPLEMENTED")
# test_script_1
#---
#
# import os
# import time
# import subprocess
# import re
# import fdb
#
# os.environ["ISC_USER"] = user_name
# os.environ["ISC_PASSWORD"] = user_password
# engine = db_conn.engine_version
# db_conn.close()
#
# # 14.04.2021.
# # Name of encryption plugin depends on OS:
# # * for Windows we (currently) use plugin by IBSurgeon, its name is 'dbcrypt';
# # * for Linux we use:
# # ** 'DbCrypt_example' for FB 3.x
# # ** 'fbSampleDbCrypt' for FB 4.x+
# #
# PLUGIN_NAME = 'dbcrypt' if os.name == 'nt' else ( '"fbSampleDbCrypt"' if engine >= 4.0 else '"DbCrypt_example"')
# KHOLDER_NAME = 'KeyHolder' if os.name == 'nt' else "fbSampleKeyHolder"
#
#
# con = fdb.connect( dsn = dsn )
# con.execute_immediate( 'recreate table test(x int, constraint test_x_unq unique(x))' )
# con.commit()
#
# cur = con.cursor()
# cur.execute( 'insert into test(x) select row_number()over() from rdb$types rows 10' )
# con.commit()
#
# ##############################################
# # WARNING! Do NOT use 'connection_obj.execute_immediate()' for ALTER DATABASE ENCRYPT... command!
# # There is bug in FB driver which leads this command to fail with 'token unknown' message
# # The reason is that execute_immediate() silently set client dialect = 0 and any encryption statement
# # can not be used for such value of client dialect.
# # One need to to use only cursor_obj.execute() for encryption!
# # See letter from Pavel Cisar, 20.01.20 10:36
# ##############################################
# cur.execute('alter database encrypt with %(PLUGIN_NAME)s key Red' % locals())
# con.commit()
#
# time.sleep(2)
# # ^
# # +-------- !! ALLOW BACKGROUND ENCRYPTION PROCESS TO COMPLETE ITS JOB !!
#
# try:
# cur.execute( 'insert into test(x) values(1)' )
# except Exception as e:
# for x in e.args:
# print( x )
#
# try:
# cur.execute( 'insert into test(x) values(2)' )
# except Exception as e:
# for x in e.args:
# #print( x.replace(chr(92),"/") if type(x)=='str' else x )
# print( x )
#
#
# cur.close()
# con.close()
#
#---