Skip to content

Commit 2da735e

Browse files
gordthompsonmkleehammer
authored andcommitted
update sqlservertests.py for FreeTDS known issue with test_tvp
1 parent 84e9d5d commit 2da735e

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

tests2/sqlservertests.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@
3636
from warnings import warn
3737
from testutils import *
3838

39+
# Some tests have fallback code for known driver issues.
40+
# Change this value to False to bypass the fallback code, e.g., to see
41+
# if a newer version of the driver has fixed the underlying issue.
42+
#
43+
handle_known_issues = True
44+
3945
_TESTSTR = '0123456789-abcdefghijklmnopqrstuvwxyz-'
4046

4147
def _generate_test_string(length):
@@ -87,6 +93,54 @@ def driver_type_is(self, type_name):
8793
elif type_name == 'freetds':
8894
return ('tdsodbc' in driver_name)
8995

96+
def handle_known_issues_for(self, type_name, print_reminder=False):
97+
"""
98+
Checks driver `type_name` and "killswitch" variable `handle_known_issues` to see if
99+
known issue handling should be bypassed. Optionally prints a reminder message to
100+
help identify tests that previously had issues but may have been fixed by a newer
101+
version of the driver.
102+
103+
Usage examples:
104+
105+
# 1. print reminder at beginning of test (before any errors can occur)
106+
#
107+
def test_some_feature(self):
108+
self.handle_known_issues_for('freetds', print_reminder=True)
109+
# (continue with test code)
110+
111+
# 2. conditional execution of fallback code
112+
#
113+
try:
114+
# (some test code)
115+
except pyodbc.DataError:
116+
if self.handle_known_issues_for('freetds'):
117+
# FREETDS_KNOWN_ISSUE
118+
#
119+
# (fallback code to work around exception)
120+
else:
121+
raise
122+
"""
123+
if self.driver_type_is(type_name):
124+
if handle_known_issues:
125+
return True
126+
else:
127+
if print_reminder:
128+
print("Known issue handling is disabled. Does this test still fail?")
129+
return False
130+
131+
def driver_type_is(self, type_name):
132+
recognized_types = {
133+
'msodbcsql': '(Microsoft) ODBC Driver xx for SQL Server',
134+
'freetds': 'FreeTDS ODBC',
135+
}
136+
if not type_name in recognized_types.keys():
137+
raise KeyError('"{0}" is not a recognized driver type: {1}'.format(type_name, list(recognized_types.keys())))
138+
driver_name = self.cnxn.getinfo(pyodbc.SQL_DRIVER_NAME).lower()
139+
if type_name == 'msodbcsql':
140+
return ('msodbcsql' in driver_name) or ('sqlncli' in driver_name) or ('sqlsrv32.dll' == driver_name)
141+
elif type_name == 'freetds':
142+
return ('tdsodbc' in driver_name)
143+
90144
def get_sqlserver_version(self):
91145
"""
92146
Returns the major version: 8-->2000, 9-->2005, 10-->2008
@@ -1651,6 +1705,10 @@ def test_tvp(self):
16511705
# pyodbc supports queries with table valued parameters in sql server
16521706
#
16531707

1708+
if self.handle_known_issues_for('freetds', print_reminder=True):
1709+
warn('FREETDS_KNOWN_ISSUE - test_tvp: test cancelled.')
1710+
return
1711+
16541712
# (Don't use "if exists" since older SQL Servers don't support it.)
16551713
try:
16561714
self.cursor.execute("drop procedure SelectTVP")

tests3/sqlservertests.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1631,6 +1631,10 @@ def test_tvp(self):
16311631
# pyodbc supports queries with table valued parameters in sql server
16321632
#
16331633

1634+
if self.handle_known_issues_for('freetds', print_reminder=True):
1635+
warn('FREETDS_KNOWN_ISSUE - test_tvp: test cancelled.')
1636+
return
1637+
16341638
# (Don't use "if exists" since older SQL Servers don't support it.)
16351639
try:
16361640
self.cursor.execute("drop procedure SelectTVP")

0 commit comments

Comments
 (0)