python-oracledb/tests/test_4500_connect_params.py

664 lines
32 KiB
Python

#------------------------------------------------------------------------------
# Copyright (c) 2021, 2023, Oracle and/or its affiliates.
#
# This software is dual-licensed to you under the Universal Permissive License
# (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl and Apache License
# 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose
# either license.
#
# If you elect to accept the software under the Apache License, Version 2.0,
# the following applies:
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#------------------------------------------------------------------------------
"""
4500 - Module for testing connection parameters.
"""
import os
import tempfile
import oracledb
import test_env
class TestCase(test_env.BaseTestCase):
requires_connection = False
def __test_writable_parameter(self, name, value):
"""
Tests that a writable parameter can be written to and the modified
value read back successfully.
"""
params = oracledb.ConnectParams()
orig_value = getattr(params, name)
copied_params = params.copy()
args = {}
args[name] = value
params.set(**args)
self.assertEqual(getattr(params, name), value)
self.assertEqual(getattr(copied_params, name), orig_value)
def test_4500_simple_easy_connect_with_port(self):
"4500 - test simple EasyConnect string parsing with port specified"
params = oracledb.ConnectParams()
params.parse_connect_string("my_host:1578/my_service_name")
self.assertEqual(params.host, "my_host")
self.assertEqual(params.port, 1578)
self.assertEqual(params.service_name, "my_service_name")
def test_4501_simple_easy_connect_without_port(self):
"4501 - test simple Easy Connect string parsing with no port specified"
params = oracledb.ConnectParams()
params.parse_connect_string("my_host2/my_service_name2")
self.assertEqual(params.host, "my_host2")
self.assertEqual(params.port, 1521)
self.assertEqual(params.service_name, "my_service_name2")
def test_4502_simple_easy_connect_with_server_type(self):
"4502 - test simple EasyConnect string parsing with DRCP enabled"
params = oracledb.ConnectParams()
params.parse_connect_string("my_host3.org/my_service_name3:pooled")
self.assertEqual(params.host, "my_host3.org")
self.assertEqual(params.service_name, "my_service_name3")
self.assertEqual(params.server_type, "pooled")
params.parse_connect_string("my_host3/my_service_name3:ShArEd")
self.assertEqual(params.server_type, "shared")
def test_4503_simple_connect_descriptor(self):
"4503 - test simple name-value pair format connect string"
connect_string = \
"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=my_host4)(PORT=1589))" \
"(CONNECT_DATA=(SERVICE_NAME=my_service_name4)))"
params = oracledb.ConnectParams()
params.parse_connect_string(connect_string)
self.assertEqual(params.host, "my_host4")
self.assertEqual(params.port, 1589)
self.assertEqual(params.service_name, "my_service_name4")
def test_4504_search_tnsnames(self):
"4504 - test simple tnsnames entry"
connect_string = \
"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=my_host5)(PORT=1624))" \
"(CONNECT_DATA=(SERVICE_NAME=my_service_name5)))"
alias = "tns_alias = " + connect_string
with tempfile.TemporaryDirectory() as temp_dir:
file_name = os.path.join(temp_dir, "tnsnames.ora")
with open(file_name, "w") as f:
f.write(alias)
params = oracledb.ConnectParams(config_dir=temp_dir)
params.parse_connect_string("tns_alias")
self.assertEqual(params.host, "my_host5")
self.assertEqual(params.port, 1624)
self.assertEqual(params.service_name, "my_service_name5")
def test_4505_easy_connect_with_protocol(self):
"4505 - test EasyConnect with protocol"
params = oracledb.ConnectParams()
params.parse_connect_string("tcps://my_host6/my_service_name6")
self.assertEqual(params.host, "my_host6")
self.assertEqual(params.service_name, "my_service_name6")
self.assertEqual(params.protocol, "tcps")
def test_4506_easy_connect_with_invalid_protocol(self):
"4506 - test EasyConnect with invalid protocol"
params = oracledb.ConnectParams()
self.assertRaisesRegex(oracledb.DatabaseError, "^DPY-4021:",
params.parse_connect_string,
"invalid_proto://my_host7/my_service_name7")
def test_4507_exception_on_ipc_protocol(self):
"4507 - confirm an exception is raised if using ipc protocol"
connect_string = \
"(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=my_view8))" \
"(CONNECT_DATA=(SERVICE_NAME=my_service_name8)))"
params = oracledb.ConnectParams()
self.assertRaisesRegex(oracledb.DatabaseError, "^DPY-4021:",
params.parse_connect_string, connect_string)
def test_4508_retry_count_and_delay(self):
"4508 - connect descriptor with retry count and retry delay"
connect_string = \
"(DESCRIPTION=(RETRY_COUNT=6)(RETRY_DELAY=5)" \
"(ADDRESS=(PROTOCOL=TCP)(HOST=my_host9)(PORT=1593))" \
"(CONNECT_DATA=(SERVICE_NAME=my_service_name9)))"
params = oracledb.ConnectParams()
params.parse_connect_string(connect_string)
self.assertEqual(params.retry_count, 6)
self.assertEqual(params.retry_delay, 5)
def test_4509_connect_descriptor_expire_time(self):
"4509 - connect descriptor with expire_time setting"
connect_string = \
"(DESCRIPTION=(EXPIRE_TIME=12)" \
"(ADDRESS=(PROTOCOL=TCP)(HOST=my_host11)(PORT=1594))" \
"(CONNECT_DATA=(SERVICE_NAME=my_service_name11)))"
params = oracledb.ConnectParams()
params.parse_connect_string(connect_string)
self.assertEqual(params.expire_time, 12)
def test_4510_pool_parameters(self):
"4510 - connect descriptor with pool parameters"
connect_string = \
"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=my_host12)(PORT=694))" \
"(CONNECT_DATA=(SERVICE_NAME=my_service_name12)" \
"(POOL_CONNECTION_CLASS=cclass_12)(POOL_PURITY=SELF)))"
params = oracledb.ConnectParams()
params.parse_connect_string(connect_string)
self.assertEqual(params.cclass, "cclass_12")
self.assertEqual(params.purity, oracledb.PURITY_SELF)
connect_string = connect_string.replace("SELF", "NEW")
params.parse_connect_string(connect_string)
self.assertEqual(params.purity, oracledb.PURITY_NEW)
def test_4511_invalid_pool_purity(self):
"4511 - connect descriptor with invalid pool purity"
connect_string = \
"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=my_host13)(PORT=695))" \
"(CONNECT_DATA=(SERVICE_NAME=my_service_name13)" \
"(POOL_CONNECTION_CLASS=cclass_13)(POOL_PURITY=INVALID)))"
params = oracledb.ConnectParams()
self.assertRaisesRegex(oracledb.DatabaseError, "^DPY-4022:",
params.parse_connect_string, connect_string)
def test_4512_tcp_connect_timeout(self):
"4512 - connect descriptor with transport connect timeout values"
connect_string = \
"(DESCRIPTION=(TRANSPORT_CONNECT_TIMEOUT=500 ms)" \
"(ADDRESS=(PROTOCOL=TCP)(HOST=my_host14)(PORT=695))" \
"(CONNECT_DATA=(SERVICE_NAME=my_service_name14)))"
params = oracledb.ConnectParams()
params.parse_connect_string(connect_string)
self.assertEqual(params.tcp_connect_timeout, 0.5)
connect_string = connect_string.replace("500 ms", "15 SEC")
params.parse_connect_string(connect_string)
self.assertEqual(params.tcp_connect_timeout, 15)
connect_string = connect_string.replace("15 SEC", "5 min")
params.parse_connect_string(connect_string)
self.assertEqual(params.tcp_connect_timeout, 300)
connect_string = connect_string.replace("5 min", "34")
params.parse_connect_string(connect_string)
self.assertEqual(params.tcp_connect_timeout, 34)
def test_4513_easy_connect_without_service_name(self):
"4513 - test EasyConnect string parsing with no service name specified"
params = oracledb.ConnectParams()
params.parse_connect_string("my_host15:1578/")
self.assertEqual(params.host, "my_host15")
self.assertEqual(params.port, 1578)
self.assertEqual(params.service_name, "")
def test_4514_missing_entry_in_tnsnames(self):
"4514 - test missing entry in tnsnames"
with tempfile.TemporaryDirectory() as temp_dir:
params = oracledb.ConnectParams(config_dir=temp_dir)
file_name = os.path.join(temp_dir, "tnsnames.ora")
with open(file_name, "w") as f:
f.write("# no entries")
self.assertRaisesRegex(oracledb.DatabaseError, "DPY-4000",
params.parse_connect_string, "tns_alias")
def test_4515_easy_connect_with_port_missing(self):
"4515 - test EasyConnect string parsing with port value missing"
params = oracledb.ConnectParams()
params.parse_connect_string("my_host17:/my_service_name17")
self.assertEqual(params.host, "my_host17")
self.assertEqual(params.port, 1521)
self.assertEqual(params.service_name, "my_service_name17")
def test_4516_invalid_number_in_connect_string(self):
"4516 - test connect descriptor with invalid number"
params = oracledb.ConnectParams()
connect_string = \
"(DESCRIPTION=(RETRY_COUNT=wrong)(RETRY_DELAY=5)" \
"(ADDRESS=(PROTOCOL=TCP)(HOST=my_host18)(PORT=1598))" \
"(CONNECT_DATA=(SERVICE_NAME=my_service_name18)))"
self.assertRaisesRegex(oracledb.DatabaseError, "DPY-4018",
params.parse_connect_string, connect_string)
def test_4517_security_options(self):
"4517 - test connect descriptor with security options"
options = [
("CN=unknown19a", "/tmp/wallet_loc19a", "On", True),
("CN=unknown19b", "/tmp/wallet_loc19b", "False", False),
("CN=unknown19c", "/tmp/wallet_loc19c", "Off", False),
("CN=unknown19d", "/tmp/wallet_loc19d", "True", True),
("CN=unknown19e", "/tmp/wallet_loc19e", "yes", True),
("CN=unknown19f", "/tmp/wallet_loc19f", "no", False)
]
for dn, wallet_loc, match_option, match_value in options:
params = oracledb.ConnectParams()
connect_string = f"""
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=my_host19)(PORT=872))
(CONNECT_DATA=(SERVICE_NAME=my_service_name19))
(SECURITY=(SSL_SERVER_CERT_DN="{dn}")
(SSL_SERVER_DN_MATCH={match_option})
(MY_WALLET_DIRECTORY="{wallet_loc}")))"""
params.parse_connect_string(connect_string)
self.assertEqual(params.ssl_server_cert_dn, dn)
self.assertEqual(params.wallet_location, wallet_loc)
self.assertEqual(params.ssl_server_dn_match, match_value)
def test_4518_easy_connect_security_options(self):
"4518 - test easy connect string with security options"
options = [
("CN=unknown20a", "/tmp/wallet_loc20a", "On", True),
("CN=unknown20b", "/tmp/wallet_loc20b", "False", False),
("CN=unknown20c", "/tmp/wallet_loc20c", "Off", False),
("CN=unknown20d", "/tmp/wallet_loc20d", "True", True),
("CN=unknown20e", "/tmp/wallet_loc20e", "yes", True),
("CN=unknown20f", "/tmp/wallet_loc20f", "no", False)
]
for dn, wallet_loc, match_option, match_value in options:
params = oracledb.ConnectParams()
connect_string = f'''
my_host20/my_server_name20?
ssl_server_cert_dn="{dn}"&
ssl_server_dn_match= {match_option} &
wallet_location = "{wallet_loc}"'''
params = oracledb.ConnectParams()
params.parse_connect_string(connect_string)
self.assertEqual(params.ssl_server_cert_dn, dn)
self.assertEqual(params.ssl_server_dn_match, match_value)
self.assertEqual(params.wallet_location, wallet_loc)
def test_4519_easy_connect_description_options(self):
"4519 - test easy connect string with description options"
params = oracledb.ConnectParams()
connect_string = 'my_host21/my_server_name21?' \
'expire_time=5&' \
'retry_delay=10&' \
'retry_count=12&' \
'transport_connect_timeout=2.5'
params.parse_connect_string(connect_string)
self.assertEqual(params.expire_time, 5)
self.assertEqual(params.retry_delay, 10)
self.assertEqual(params.retry_count, 12)
self.assertEqual(params.tcp_connect_timeout, 2.5)
def test_4520_easy_connect_invalid_parameters(self):
"4520 - test easy connect string with invalid parameters"
params = oracledb.ConnectParams()
connect_string_prefix = 'my_host22/my_server_name22?'
suffixes = [
'expire_time=invalid',
'expire_time'
]
for suffix in suffixes:
self.assertRaisesRegex(oracledb.DatabaseError, "DPY-4018",
params.parse_connect_string,
connect_string_prefix + suffix)
def test_4521_connect_string_with_newlines_and_spaces(self):
"4521 - test connect string containing spaces and newlines"
params = oracledb.ConnectParams()
connect_string = \
'(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP) \n(HOST=my_host23)\n' \
'(PORT=1560))(CONNECT_DATA= (SERVICE_NAME=my_service_name23))' \
'(SECURITY=(MY_WALLET_DIRECTORY="my wallet dir 23")))'
params.parse_connect_string(connect_string)
self.assertEqual(params.host, "my_host23")
self.assertEqual(params.port, 1560)
self.assertEqual(params.service_name, "my_service_name23")
self.assertEqual(params.wallet_location, "my wallet dir 23")
def test_4522_missing_tnsnames(self):
"4522 - test missing tnsnames.ora in configuration directory"
with tempfile.TemporaryDirectory() as temp_dir:
params = oracledb.ConnectParams(config_dir=temp_dir)
self.assertRaisesRegex(oracledb.DatabaseError, "DPY-4026:",
params.parse_connect_string, "tns_alias")
def test_4523_missing_config_dir(self):
"4523 - test missing configuration directory"
params = oracledb.ConnectParams(config_dir="/missing")
self.assertRaisesRegex(oracledb.DatabaseError, "DPY-4026:",
params.parse_connect_string, "tns_alias")
def test_4524_invalid_entries_in_tnsnames(self):
"4524 - test tnsnames.ora with invalid entries"
connect_string = \
"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=my_host24)(PORT=1148))" \
"(CONNECT_DATA=(SERVICE_NAME=my_service_name24)))"
alias = f"tns_alias24 = {connect_string}"
with tempfile.TemporaryDirectory() as temp_dir:
file_name = os.path.join(temp_dir, "tnsnames.ora")
with open(file_name, "w") as f:
print("invalid_alias = something to ignore", file=f)
print("some garbage data which should be ignored", file=f)
print(alias, file=f)
params = oracledb.ConnectParams(config_dir=temp_dir)
params.parse_connect_string("tns_alias24")
self.assertEqual(params.host, "my_host24")
self.assertEqual(params.port, 1148)
self.assertEqual(params.service_name, "my_service_name24")
def test_4525_single_address_list(self):
"4525 - test connect string with an address list"
params = oracledb.ConnectParams()
connect_string = \
'(DESCRIPTION=(LOAD_BALANCE=ON)(RETRY_COUNT=5)(RETRY_DELAY=2)' \
'(ADDRESS_LIST=(LOAD_BALANCE=ON)' \
'(ADDRESS=(PROTOCOL=tcp)(PORT=1521)(HOST=my_host25))' \
'(ADDRESS=(PROTOCOL=tcps)(PORT=222)(HOST=my_host26)))' \
'(CONNECT_DATA=(SERVICE_NAME=my_service_name25)))'
params.parse_connect_string(connect_string)
self.assertEqual(params.host, ["my_host25", "my_host26"])
self.assertEqual(params.port, [1521, 222])
self.assertEqual(params.protocol, ["tcp", "tcps"])
self.assertEqual(params.service_name, "my_service_name25")
self.assertEqual(params.retry_count, 5)
self.assertEqual(params.retry_delay, 2)
def test_4526_multiple_address_lists(self):
"4526 - test connect string with multiple address lists"
params = oracledb.ConnectParams()
connect_string = \
'(DESCRIPTION=(LOAD_BALANCE=ON)(RETRY_COUNT=5)(RETRY_DELAY=2)' \
'(ADDRESS_LIST=(LOAD_BALANCE=ON)' \
'(ADDRESS=(PROTOCOL=tcp)(PORT=1521)(HOST=my_host26))' \
'(ADDRESS=(PROTOCOL=tcp)(PORT=222)(HOST=my_host27)))' \
'(ADDRESS_LIST=(LOAD_BALANCE=ON)' \
'(ADDRESS=(PROTOCOL=tcps)(PORT=5555)(HOST=my_host28))' \
'(ADDRESS=(PROTOCOL=tcps)(PORT=444)(HOST=my_host29)))' \
'(CONNECT_DATA=(SERVICE_NAME=my_service_name26)))'
params.parse_connect_string(connect_string)
hosts = ["my_host26", "my_host27", "my_host28", "my_host29"]
self.assertEqual(params.host, hosts)
self.assertEqual(params.port, [1521, 222, 5555, 444])
self.assertEqual(params.protocol, ["tcp", "tcp", "tcps", "tcps"])
self.assertEqual(params.service_name, "my_service_name26")
self.assertEqual(params.retry_count, 5)
self.assertEqual(params.retry_delay, 2)
def test_4527_multiple_descriptions(self):
"4527 - test connect string with multiple descriptions"
params = oracledb.ConnectParams()
connect_string = \
'(DESCRIPTION_LIST=(FAIL_OVER=ON)(LOAD_BALANCE=OFF)' \
'(DESCRIPTION=(LOAD_BALANCE=OFF)(RETRY_COUNT=1)(RETRY_DELAY=1)' \
'(ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(PORT=5001)' \
'(HOST=my_host30))' \
'(ADDRESS=(PROTOCOL=tcp)(PORT=1521)(HOST=my_host31)))' \
'(ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(PORT=5002) ' \
'(HOST=my_host32))' \
'(ADDRESS=(PROTOCOL=tcp)(PORT=5003)(HOST=my_host33)))' \
'(CONNECT_DATA=(SERVICE_NAME=my_service_name27)))' \
'(DESCRIPTION=(LOAD_BALANCE=OFF)(RETRY_COUNT=2)(RETRY_DELAY=3)' \
'(ADDRESS_LIST = (ADDRESS=(PROTOCOL=tcp)(PORT=5001)' \
'(HOST=my_host34))' \
'(ADDRESS=(PROTOCOL=tcp)(PORT=5001)(HOST=my_host35)))' \
'(ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(PORT=5001)' \
'(HOST=my_host36))' \
'(ADDRESS=(PROTOCOL=tcps)(HOST=my_host37)(PORT=1521)))' \
'(CONNECT_DATA=(SERVICE_NAME=my_service_name28))))'
params.parse_connect_string(connect_string)
hosts = ["my_host30", "my_host31", "my_host32", "my_host33", \
"my_host34", "my_host35", "my_host36", "my_host37"]
ports = [5001, 1521, 5002, 5003, 5001, 5001, 5001, 1521]
protocols = ["tcp", "tcp", "tcp", "tcp", "tcp", "tcp", "tcp", "tcps"]
service_names = ["my_service_name27", "my_service_name28"]
self.assertEqual(params.host, hosts)
self.assertEqual(params.port, ports)
self.assertEqual(params.protocol, protocols)
self.assertEqual(params.service_name, service_names)
self.assertEqual(params.retry_count, [1, 2])
self.assertEqual(params.retry_delay, [1, 3])
def test_4528_https_proxy(self):
"4528 - test connect strings with https_proxy defined"
params = oracledb.ConnectParams()
connect_string = \
"(DESCRIPTION=" \
"(ADDRESS=(HTTPS_PROXY=proxy_4528a)(HTTPS_PROXY_PORT=4528)" \
"(PROTOCOL=TCP)(HOST=my_host4528a)(PORT=8528))" \
"(CONNECT_DATA=(SERVICE_NAME=my_service_name4528a)))"
params.parse_connect_string(connect_string)
self.assertEqual(params.https_proxy, "proxy_4528a")
self.assertEqual(params.https_proxy_port, 4528)
connect_string = "tcps://my_host_4528b/my_service_name_4528b?" \
"https_proxy=proxy_4528b&https_proxy_port=9528"
params.parse_connect_string(connect_string)
self.assertEqual(params.https_proxy, "proxy_4528b")
self.assertEqual(params.https_proxy_port, 9528)
def test_4529_server_type(self):
"4529 - test connect strings with server_type defined"
params = oracledb.ConnectParams()
connect_string = \
"(DESCRIPTION=" \
"(ADDRESS=(PROTOCOL=TCP)(HOST=my_host4529)(PORT=4529))" \
"(CONNECT_DATA=(SERVER=DEDICATED)" \
"(SERVICE_NAME=my_service_name4529)))"
params.parse_connect_string(connect_string)
self.assertEqual(params.server_type, "dedicated")
connect_string = connect_string.replace("DEDICATED", "INVALID")
self.assertRaisesRegex(oracledb.DatabaseError, "^DPY-4028:",
params.parse_connect_string, connect_string)
def test_4530_writable_params(self):
"4530 - test writable parameters"
self.__test_writable_parameter("appcontext", [("a", "b", "c")])
self.__test_writable_parameter("config_dir", "config_dir_4530")
self.__test_writable_parameter("disable_oob", True)
self.__test_writable_parameter("edition", "edition_4530")
self.__test_writable_parameter("events", True)
self.__test_writable_parameter("matchanytag", True)
self.__test_writable_parameter("mode", oracledb.AUTH_MODE_SYSDBA)
self.__test_writable_parameter("shardingkey", [1, 2, 3])
self.__test_writable_parameter("stmtcachesize", 25)
self.__test_writable_parameter("supershardingkey", [1, 2, 3])
self.__test_writable_parameter("tag", "tag_4530")
self.__test_writable_parameter("debug_jdwp", "host=host;port=4530")
self.__test_writable_parameter("externalauth", True)
self.__test_writable_parameter("user", "USER_1")
self.__test_writable_parameter("proxy_user", "PROXY_USER_1")
def test_4531_build_connect_string_with_tcp_connect_timeout(self):
"4531 - test building connect string with TCP connect timeout"
host = "my_host4531"
service_name = "my_service4531"
options = [
(25, "25"),
(120, "2min"),
(2.5, "2500ms"),
(3.4328, "3432ms")
]
for in_val, out_val in options:
params = oracledb.ConnectParams(host=host,
service_name=service_name,
tcp_connect_timeout=in_val)
tcp_timeout_val = f"(TRANSPORT_CONNECT_TIMEOUT={out_val})"
connect_string = f"(DESCRIPTION={tcp_timeout_val}" + \
f"(ADDRESS=(PROTOCOL=tcp)" + \
f"(HOST={host})(PORT=1521))(CONNECT_DATA=" + \
f"(SERVICE_NAME={service_name})))"
self.assertEqual(params.get_connect_string(), connect_string)
def test_4532_multiple_alias_entry_tnsnames(self):
"4532 - test tnsnames.ora with multiple aliases on one line"
connect_string = \
"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=my_host32)(PORT=1132))" \
"(CONNECT_DATA=(SERVICE_NAME=my_service_name32)))"
aliases = f"tns_alias32a,tns_alias32b = {connect_string}"
with tempfile.TemporaryDirectory() as temp_dir:
file_name = os.path.join(temp_dir, "tnsnames.ora")
with open(file_name, "w") as f:
print(aliases, file=f)
params = oracledb.ConnectParams(config_dir=temp_dir)
for name in ("tns_alias32a", "tns_alias32b"):
params.parse_connect_string(name)
self.assertEqual(params.host, "my_host32")
self.assertEqual(params.port, 1132)
self.assertEqual(params.service_name, "my_service_name32")
def test_4533_easy_connect_with_pool_parameters(self):
"4533 - test EasyConnect with pool parameters"
options = [
("cclass_33a", "self", oracledb.PURITY_SELF),
("cclass_33b", "new", oracledb.PURITY_NEW)
]
for cclass, purity_str, purity_int in options:
connect_string = f"my_host_33/my_service_name_33:pooled?" \
f"pool_connection_class={cclass}&" \
f"pool_purity={purity_str}"
params = oracledb.ConnectParams()
params.parse_connect_string(connect_string)
self.assertEqual(params.host, "my_host_33")
self.assertEqual(params.service_name, "my_service_name_33")
self.assertEqual(params.port, 1521)
self.assertEqual(params.server_type, "pooled")
self.assertEqual(params.cclass, cclass)
self.assertEqual(params.purity, purity_int)
def test_4534_connect_descriptor_small_container_first(self):
"4534 - test connect descriptor with different containers (small 1st)"
connect_string = """
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=host1)(PORT=1521))
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=host2a)(PORT=1522))
(ADDRESS=(PROTOCOL=tcp)(HOST=host2b)(PORT=1523)))
(ADDRESS=(PROTOCOL=tcp)(HOST=host3)(PORT=1524))
(CONNECT_DATA=(SERVICE_NAME=my_service_34))
)"""
params = oracledb.ConnectParams()
params.parse_connect_string(connect_string)
self.assertEqual(params.host, ["host1", "host2a", "host2b", "host3"])
def test_4535_connect_descriptor_small_container_second(self):
"4535 - test connect descriptor with different containers (small 2nd)"
connect_string = """
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=host1a)(PORT=1532))
(ADDRESS=(PROTOCOL=tcp)(HOST=host1b)(PORT=1533)))
(ADDRESS=(PROTOCOL=tcp)(HOST=host2)(PORT=1534))
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=host3a)(PORT=1535))
(ADDRESS=(PROTOCOL=tcp)(HOST=host3b)(PORT=1536)))
(CONNECT_DATA=(SERVICE_NAME=my_service_34))
)"""
params = oracledb.ConnectParams()
params.parse_connect_string(connect_string)
self.assertEqual(params.host,
["host1a", "host1b", "host2", "host3a", "host3b"])
def test_4536_build_connect_string_with_source_route(self):
"4536 - test building connect string with source route designation"
host = "my_host4536"
service_name = "my_service4536"
options = [
("on", True),
("off", False),
("true", True),
("false", False),
("yes", True),
("no", False)
]
for in_val, has_section in options:
connect_string = f"""
(DESCRIPTION=
(SOURCE_ROUTE={in_val})
(ADDRESS=(PROTOCOL=tcp)(HOST=host1)(PORT=1521))
(ADDRESS=(PROTOCOL=tcp)(HOST=host2)(PORT=1522))
(CONNECT_DATA=(SERVICE_NAME=my_service_35))
)"""
params = oracledb.ConnectParams()
params.parse_connect_string(connect_string)
source_route_clause = "(SOURCE_ROUTE=ON)" if has_section else ""
connect_string = \
f"(DESCRIPTION={source_route_clause}" + \
f"(ADDRESS_LIST=" + \
f"(ADDRESS=(PROTOCOL=tcp)(HOST=host1)(PORT=1521))" + \
f"(ADDRESS=(PROTOCOL=tcp)(HOST=host2)(PORT=1522)))" + \
f"(CONNECT_DATA=(SERVICE_NAME=my_service_35)))"
self.assertEqual(params.get_connect_string(), connect_string)
def test_4537_no_connect_string(self):
"4537 - test connect parameters which generate no connect string"
params = oracledb.ConnectParams()
self.assertEqual(params.get_connect_string(), None)
params.set(mode=oracledb.SYSDBA)
self.assertEqual(params.get_connect_string(), None)
def test_4538_dsn_with_credentials_and_connect_string(self):
"4538 - test parsing a DSN with credentials and a connect string"
params = oracledb.ConnectParams()
dsn = "my_user4538/my_password4538@localhost:1525/my_service_name"
user, password, dsn = params.parse_dsn_with_credentials(dsn)
self.assertEqual(user, "my_user4538")
self.assertEqual(password, "my_password4538")
self.assertEqual(dsn, "localhost:1525/my_service_name")
def test_4539_dsn_with_only_credentials(self):
"4539 - test parsing a DSN with only credentials"
params = oracledb.ConnectParams()
dsn = "my_user4539/my_password4539"
user, password, dsn = params.parse_dsn_with_credentials(dsn)
self.assertEqual(user, "my_user4539")
self.assertEqual(password, "my_password4539")
self.assertEqual(dsn, None)
def test_4560_dsn_with_empty_credentials(self):
"4560 - test parsing a DSN with empty credentials"
dsns = ["", "/"]
for dsn in ("", "/"):
params = oracledb.ConnectParams()
user, password, dsn = params.parse_dsn_with_credentials(dsn)
self.assertEqual(user, None)
self.assertEqual(password, None)
self.assertEqual(dsn, None)
def test_4561_dsn_with_no_credentials(self):
"4561 - test parsing a DSN with no credentials"
dsn_in = "my_alias_4561"
params = oracledb.ConnectParams()
user, password, dsn_out = params.parse_dsn_with_credentials(dsn_in)
self.assertEqual(user, None)
self.assertEqual(password, None)
self.assertEqual(dsn_out, dsn_in)
def test_4562_connection_id_prefix(self):
"4529 - test connect strings with connection_id_prefix defined"
params = oracledb.ConnectParams()
connect_string = \
"(DESCRIPTION=" \
"(ADDRESS=(PROTOCOL=TCP)(HOST=my_host4562a)(PORT=4562))" \
"(CONNECT_DATA=(CONNECTION_ID_PREFIX=prefix4562a)" \
"(SERVICE_NAME=my_service_name4562a)))"
params.parse_connect_string(connect_string)
self.assertEqual(params.connection_id_prefix, "prefix4562a")
params = oracledb.ConnectParams()
params.set(connection_id_prefix="prefix4562b")
params.parse_connect_string("my_host4562b/my_service_name_4562b")
self.assertEqual(params.connection_id_prefix, "prefix4562b")
def test_4563_override_parameters(self):
"4563 - test overriding parameters with parse_connection_string"
params = oracledb.ConnectParams()
params.parse_connect_string("my_host:3578/my_service_name")
params.set(service_name="new_service_name", port=613)
self.assertEqual(params.service_name, "my_service_name")
self.assertEqual(params.port, 3578)
params = oracledb.ConnectParams()
params.set(service_name="my_service_name", port=613)
params.parse_connect_string("my_host:3578/new_service_name")
self.assertEqual(params.service_name, "new_service_name")
self.assertEqual(params.port, 3578)
if __name__ == "__main__":
test_env.run_test_cases()