mirror of
https://github.com/hanzo-ds/driver.git
synced 2026-10-30 20:32:40 +00:00
311 lines
11 KiB
Python
311 lines
11 KiB
Python
import ssl
|
|
|
|
from clickhouse_driver import Client
|
|
from clickhouse_driver.compression.lz4 import Compressor as LZ4Compressor
|
|
from clickhouse_driver.compression.lz4hc import Compressor as LZHC4Compressor
|
|
from clickhouse_driver.compression.zstd import Compressor as ZSTDCompressor
|
|
from clickhouse_driver.protocol import Compression
|
|
from tests.numpy.util import check_numpy
|
|
from tests.testcase import TestCase
|
|
|
|
|
|
class ClientFromUrlTestCase(TestCase):
|
|
def assertHostsEqual(self, client, another, msg=None):
|
|
self.assertEqual(list(client.connection.hosts), another, msg=msg)
|
|
|
|
def test_simple(self):
|
|
c = Client.from_url('clickhouse://host')
|
|
|
|
self.assertHostsEqual(c, [('host', 9000)])
|
|
self.assertEqual(c.connection.database, '')
|
|
|
|
c = Client.from_url('clickhouse://host/db')
|
|
|
|
self.assertHostsEqual(c, [('host', 9000)])
|
|
self.assertEqual(c.connection.database, 'db')
|
|
|
|
def test_credentials(self):
|
|
c = Client.from_url('clickhouse://host/db')
|
|
|
|
self.assertEqual(c.connection.user, 'default')
|
|
self.assertEqual(c.connection.password, '')
|
|
|
|
c = Client.from_url('clickhouse://admin:secure@host/db')
|
|
|
|
self.assertEqual(c.connection.user, 'admin')
|
|
self.assertEqual(c.connection.password, 'secure')
|
|
|
|
c = Client.from_url('clickhouse://user:@host/db')
|
|
|
|
self.assertEqual(c.connection.user, 'user')
|
|
self.assertEqual(c.connection.password, '')
|
|
|
|
def test_credentials_unquoting(self):
|
|
c = Client.from_url('clickhouse://ad%3Amin:se%2Fcure@host/db')
|
|
|
|
self.assertEqual(c.connection.user, 'ad:min')
|
|
self.assertEqual(c.connection.password, 'se/cure')
|
|
|
|
def test_schema(self):
|
|
c = Client.from_url('clickhouse://host')
|
|
self.assertFalse(c.connection.secure_socket)
|
|
|
|
c = Client.from_url('clickhouses://host')
|
|
self.assertTrue(c.connection.secure_socket)
|
|
|
|
c = Client.from_url('test://host')
|
|
self.assertFalse(c.connection.secure_socket)
|
|
|
|
def test_port(self):
|
|
c = Client.from_url('clickhouse://host')
|
|
self.assertHostsEqual(c, [('host', 9000)])
|
|
|
|
c = Client.from_url('clickhouses://host')
|
|
self.assertHostsEqual(c, [('host', 9440)])
|
|
|
|
c = Client.from_url('clickhouses://host:1234')
|
|
self.assertHostsEqual(c, [('host', 1234)])
|
|
|
|
def test_secure(self):
|
|
c = Client.from_url('clickhouse://host?secure=n')
|
|
self.assertHostsEqual(c, [('host', 9000)])
|
|
self.assertFalse(c.connection.secure_socket)
|
|
|
|
c = Client.from_url('clickhouse://host?secure=y')
|
|
self.assertHostsEqual(c, [('host', 9440)])
|
|
self.assertTrue(c.connection.secure_socket)
|
|
|
|
c = Client.from_url('clickhouse://host:1234?secure=y')
|
|
self.assertHostsEqual(c, [('host', 1234)])
|
|
self.assertTrue(c.connection.secure_socket)
|
|
|
|
with self.assertRaises(ValueError):
|
|
Client.from_url('clickhouse://host:1234?secure=nonono')
|
|
|
|
def test_compression(self):
|
|
c = Client.from_url('clickhouse://host?compression=n')
|
|
self.assertEqual(c.connection.compression, Compression.DISABLED)
|
|
self.assertIsNone(c.connection.compressor_cls)
|
|
|
|
c = Client.from_url('clickhouse://host?compression=y')
|
|
self.assertEqual(c.connection.compression, Compression.ENABLED)
|
|
self.assertIs(c.connection.compressor_cls, LZ4Compressor)
|
|
|
|
c = Client.from_url('clickhouse://host?compression=lz4')
|
|
self.assertEqual(c.connection.compression, Compression.ENABLED)
|
|
self.assertIs(c.connection.compressor_cls, LZ4Compressor)
|
|
|
|
c = Client.from_url('clickhouse://host?compression=lz4hc')
|
|
self.assertEqual(c.connection.compression, Compression.ENABLED)
|
|
self.assertIs(c.connection.compressor_cls, LZHC4Compressor)
|
|
|
|
c = Client.from_url('clickhouse://host?compression=zstd')
|
|
self.assertEqual(c.connection.compression, Compression.ENABLED)
|
|
self.assertIs(c.connection.compressor_cls, ZSTDCompressor)
|
|
|
|
with self.assertRaises(ValueError):
|
|
Client.from_url('clickhouse://host:1234?compression=custom')
|
|
|
|
def test_client_name(self):
|
|
c = Client.from_url('clickhouse://host?client_name=native')
|
|
self.assertEqual(c.connection.client_name, 'ClickHouse native')
|
|
|
|
def test_timeouts(self):
|
|
with self.assertRaises(ValueError):
|
|
Client.from_url('clickhouse://host?connect_timeout=test')
|
|
|
|
c = Client.from_url('clickhouse://host?connect_timeout=1.2')
|
|
self.assertEqual(c.connection.connect_timeout, 1.2)
|
|
|
|
c = Client.from_url('clickhouse://host?send_receive_timeout=1.2')
|
|
self.assertEqual(c.connection.send_receive_timeout, 1.2)
|
|
|
|
c = Client.from_url('clickhouse://host?sync_request_timeout=1.2')
|
|
self.assertEqual(c.connection.sync_request_timeout, 1.2)
|
|
|
|
def test_compress_block_size(self):
|
|
with self.assertRaises(ValueError):
|
|
Client.from_url('clickhouse://host?compress_block_size=test')
|
|
|
|
c = Client.from_url('clickhouse://host?compress_block_size=100500')
|
|
# compression is not set
|
|
self.assertIsNone(c.connection.compress_block_size)
|
|
|
|
c = Client.from_url(
|
|
'clickhouse://host?'
|
|
'compress_block_size=100500&'
|
|
'compression=1'
|
|
)
|
|
self.assertEqual(c.connection.compress_block_size, 100500)
|
|
|
|
def test_settings(self):
|
|
c = Client.from_url(
|
|
'clickhouse://host?'
|
|
'send_logs_level=trace&'
|
|
'max_block_size=123'
|
|
)
|
|
self.assertEqual(c.settings, {
|
|
'send_logs_level': 'trace',
|
|
'max_block_size': '123'
|
|
})
|
|
|
|
def test_ssl(self):
|
|
c = Client.from_url(
|
|
'clickhouses://host?'
|
|
'verify=false&'
|
|
'ssl_version=PROTOCOL_SSLv23&'
|
|
'ca_certs=/tmp/certs&'
|
|
'ciphers=HIGH:-aNULL:-eNULL:-PSK:RC4-SHA:RC4-MD5'
|
|
)
|
|
self.assertEqual(c.connection.ssl_options, {
|
|
'ssl_version': ssl.PROTOCOL_SSLv23,
|
|
'ca_certs': '/tmp/certs',
|
|
'ciphers': 'HIGH:-aNULL:-eNULL:-PSK:RC4-SHA:RC4-MD5'
|
|
})
|
|
|
|
def test_ssl_key_cert(self):
|
|
base_url = (
|
|
'clickhouses://host?'
|
|
'verify=true&'
|
|
'ssl_version=PROTOCOL_SSLv23&'
|
|
'ca_certs=/tmp/certs&'
|
|
'ciphers=HIGH:-aNULL:-eNULL:-PSK:RC4-SHA:RC4-MD5&'
|
|
)
|
|
base_expected = {
|
|
'ssl_version': ssl.PROTOCOL_SSLv23,
|
|
'ca_certs': '/tmp/certs',
|
|
'ciphers': 'HIGH:-aNULL:-eNULL:-PSK:RC4-SHA:RC4-MD5'
|
|
}
|
|
|
|
c = Client.from_url(
|
|
base_url +
|
|
'keyfile=/tmp/client.key&'
|
|
'certfile=/tmp/client.cert'
|
|
)
|
|
expected = base_expected.copy()
|
|
expected.update({
|
|
'keyfile': '/tmp/client.key',
|
|
'certfile': '/tmp/client.cert'
|
|
})
|
|
self.assertEqual(c.connection.ssl_options, expected)
|
|
|
|
c = Client.from_url(
|
|
base_url +
|
|
'keyfile=/tmp/client.key&'
|
|
'certfile=/tmp/client.cert&'
|
|
'keypass=foobar'
|
|
)
|
|
expected = base_expected.copy()
|
|
expected.update({
|
|
'keyfile': '/tmp/client.key',
|
|
'certfile': '/tmp/client.cert',
|
|
'keypass': 'foobar',
|
|
})
|
|
self.assertEqual(c.connection.ssl_options, expected)
|
|
|
|
c = Client.from_url(
|
|
base_url +
|
|
'certfile=/tmp/client.cert'
|
|
)
|
|
expected = base_expected.copy()
|
|
expected.update({
|
|
'certfile': '/tmp/client.cert'
|
|
})
|
|
self.assertEqual(c.connection.ssl_options, expected)
|
|
|
|
def test_check_hostname(self):
|
|
c = Client.from_url(
|
|
'clickhouses://host?verify=true&check_hostname=false'
|
|
)
|
|
self.assertEqual(c.connection.check_hostname, False)
|
|
|
|
def test_alt_hosts(self):
|
|
c = Client.from_url('clickhouse://host?alt_hosts=host2:1234')
|
|
self.assertHostsEqual(c, [('host', 9000), ('host2', 1234)])
|
|
|
|
c = Client.from_url('clickhouse://host?alt_hosts=host2')
|
|
self.assertHostsEqual(c, [('host', 9000), ('host2', 9000)])
|
|
|
|
def test_parameters_cast(self):
|
|
c = Client.from_url('clickhouse://host?insert_block_size=123')
|
|
self.assertEqual(
|
|
c.connection.context.client_settings['insert_block_size'], 123
|
|
)
|
|
|
|
def test_settings_is_important(self):
|
|
c = Client.from_url('clickhouse://host?settings_is_important=1')
|
|
self.assertEqual(c.connection.settings_is_important, True)
|
|
|
|
with self.assertRaises(ValueError):
|
|
c = Client.from_url('clickhouse://host?settings_is_important=2')
|
|
self.assertEqual(c.connection.settings_is_important, True)
|
|
|
|
c = Client.from_url('clickhouse://host?settings_is_important=0')
|
|
self.assertEqual(c.connection.settings_is_important, False)
|
|
|
|
@check_numpy
|
|
def test_use_numpy(self):
|
|
c = Client.from_url('clickhouse://host?use_numpy=true')
|
|
self.assertTrue(c.connection.context.client_settings['use_numpy'])
|
|
|
|
def test_opentelemetry(self):
|
|
c = Client.from_url(
|
|
'clickhouse://host?opentelemetry_traceparent='
|
|
'00-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbbbbbbbbbb-00'
|
|
)
|
|
self.assertEqual(
|
|
c.connection.context.client_settings['opentelemetry_traceparent'],
|
|
'00-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbbbbbbbbbb-00'
|
|
)
|
|
self.assertEqual(
|
|
c.connection.context.client_settings['opentelemetry_tracestate'],
|
|
''
|
|
)
|
|
|
|
c = Client.from_url(
|
|
'clickhouse://host?opentelemetry_traceparent='
|
|
'00-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbbbbbbbbbb-00&'
|
|
'opentelemetry_tracestate=state'
|
|
)
|
|
self.assertEqual(
|
|
c.connection.context.client_settings['opentelemetry_traceparent'],
|
|
'00-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbbbbbbbbbb-00'
|
|
)
|
|
self.assertEqual(
|
|
c.connection.context.client_settings['opentelemetry_tracestate'],
|
|
'state'
|
|
)
|
|
|
|
def test_quota_key(self):
|
|
c = Client.from_url('clickhouse://host?quota_key=myquota')
|
|
self.assertEqual(
|
|
c.connection.context.client_settings['quota_key'], 'myquota'
|
|
)
|
|
|
|
c = Client.from_url('clickhouse://host')
|
|
self.assertEqual(
|
|
c.connection.context.client_settings['quota_key'], ''
|
|
)
|
|
|
|
def test_round_robin(self):
|
|
c = Client.from_url('clickhouse://host?alt_hosts=host2')
|
|
self.assertEqual(len(c.connections), 0)
|
|
|
|
c = Client.from_url(
|
|
'clickhouse://host?round_robin=true&alt_hosts=host2'
|
|
)
|
|
self.assertEqual(len(c.connections), 1)
|
|
|
|
def test_tcp_keepalive(self):
|
|
c = Client.from_url('clickhouse://host?tcp_keepalive=true')
|
|
self.assertTrue(c.connection.tcp_keepalive)
|
|
|
|
c = Client.from_url('clickhouse://host?tcp_keepalive=10,2,3')
|
|
self.assertEqual(
|
|
c.connection.tcp_keepalive, (10, 2, 3)
|
|
)
|
|
|
|
def test_client_revision(self):
|
|
c = Client.from_url('clickhouse://host?client_revision=54032')
|
|
self.assertEqual(c.connection.client_revision, 54032)
|