Skip to content

Commit 8a9eff4

Browse files
Add some tests
1 parent aade123 commit 8a9eff4

File tree

2 files changed

+159
-2
lines changed

2 files changed

+159
-2
lines changed

tarantool/__init__.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# pylint: disable=C0301,W0105,W0401,W0614
33

44
from tarantool.connection import Connection
5-
from tarantool.connection_pool import ConnectionPool
5+
from tarantool.connection_pool import ConnectionPool, Mode
66
from tarantool.const import (RECONNECT_DELAY, RECONNECT_MAX_ATTEMPTS,
77
SOCKET_TIMEOUT)
88
from tarantool.error import DatabaseError, Error, NetworkError, NetworkWarning
@@ -60,4 +60,4 @@ def connectmesh(addrs=({'host': 'localhost', 'port': 3301},), user=None,
6060

6161
__all__ = ['connect', 'Connection', 'connectmesh', 'MeshConnection', 'Schema',
6262
'Error', 'DatabaseError', 'NetworkError', 'NetworkWarning',
63-
'SchemaError', 'ConnectionPool', 'dbapi']
63+
'SchemaError', 'ConnectionPool', 'Mode', 'dbapi']

test/suites/test_pool.py

+157
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
# -*- coding: utf-8 -*-
2+
3+
from __future__ import print_function
4+
5+
import sys
6+
import unittest
7+
import warnings
8+
from time import sleep
9+
10+
import tarantool
11+
from tarantool.error import (ClusterDiscoveryWarning, ConfigurationError,
12+
NetworkError, NetworkWarning)
13+
14+
from .lib.tarantool_server import TarantoolServer
15+
16+
17+
def create_server(_id):
18+
srv = TarantoolServer()
19+
srv.script = 'test/suites/box.lua'
20+
srv.start()
21+
srv.admin("box.schema.user.create('test', {password = 'test', " +
22+
"if_not_exists = true})")
23+
srv.admin("box.schema.user.grant('test', 'execute', 'universe')")
24+
25+
# Create srv_id function (for testing purposes).
26+
srv.admin("function srv_id() return %s end" % _id)
27+
return srv
28+
29+
30+
@unittest.skipIf(sys.platform.startswith("win"),
31+
'Pool tests on windows platform are not supported')
32+
class TestSuite_Pool(unittest.TestCase):
33+
# def define_cluster_function(self, func_name, servers):
34+
# addresses = [(srv.host, srv.args['primary']) for srv in servers]
35+
# addresses_lua = ",".join("'%s:%d'" % address for address in addresses)
36+
# func_body = """
37+
# function %s()
38+
# return {%s}
39+
# end
40+
# """ % (func_name, addresses_lua)
41+
# for srv in self.servers:
42+
# srv.admin(func_body)
43+
44+
# def define_custom_cluster_function(self, func_name, retval):
45+
# func_body = """
46+
# function %s()
47+
# return %s
48+
# end
49+
# """ % (func_name, retval)
50+
# for srv in self.servers:
51+
# srv.admin(func_body)
52+
53+
def set_ro(self, srv, read_only):
54+
if read_only:
55+
req = r'box.cfg{read_only = true}'
56+
else:
57+
req = r'box.cfg{read_only = false}'
58+
59+
srv.admin(req)
60+
61+
62+
def set_cluster_ro(self, read_only_list):
63+
assert len(self.servers) == len(read_only_list)
64+
65+
for i in range(len(self.servers)):
66+
self.set_ro(self.servers[i], read_only_list[i])
67+
68+
@classmethod
69+
def setUpClass(self):
70+
print(' POOL '.center(70, '='), file=sys.stderr)
71+
print('-' * 70, file=sys.stderr)
72+
73+
def setUp(self):
74+
# Create five servers and extract helpful fields for tests.
75+
self.servers = []
76+
self.addrs = []
77+
for i in range(5):
78+
srv = create_server(i)
79+
self.servers.append(srv)
80+
self.addrs.append({'host': srv.host, 'port': srv.args['primary']})
81+
82+
def test_00_basic(self):
83+
self.set_cluster_ro([False, False, True, False, True])
84+
85+
conn = tarantool.ConnectionPool(addrs=self.addrs, user='test', password='test')
86+
87+
self.assertSequenceEqual(conn.eval('return box.cfg.read_only', mode=tarantool.Mode.RW), [False])
88+
self.assertSequenceEqual(conn.eval('return box.cfg.read_only', mode=tarantool.Mode.PREFER_RW), [False])
89+
self.assertSequenceEqual(conn.eval('return box.cfg.read_only', mode=tarantool.Mode.PREFER_RO), [True])
90+
91+
def test_01_roundrobin(self):
92+
self.set_cluster_ro([False, False, True, False, True])
93+
RW_ports = set([str(self.addrs[0]['port']), str(self.addrs[1]['port']), str(self.addrs[3]['port'])])
94+
RO_ports = set([str(self.addrs[2]['port']), str(self.addrs[4]['port'])])
95+
96+
conn = tarantool.ConnectionPool(addrs=self.addrs, user='test', password='test')
97+
98+
# Expect RW iterate through all RW instances.
99+
RW_ports_result = set()
100+
for i in range(len(self.servers)):
101+
resp = conn.eval('return box.cfg.listen', mode=tarantool.Mode.RW)
102+
RW_ports_result.add(resp.data[0])
103+
104+
self.assertSetEqual(RW_ports_result, RW_ports)
105+
106+
# Expect PREFER_RW iterate through all RW instances if there is at least one.
107+
PREFER_RW_ports_result = set()
108+
for i in range(len(self.servers)):
109+
resp = conn.eval('return box.cfg.listen', mode=tarantool.Mode.PREFER_RW)
110+
PREFER_RW_ports_result.add(resp.data[0])
111+
112+
self.assertSetEqual(PREFER_RW_ports_result, RW_ports)
113+
114+
# Expect PREFER_RO iterate through all RO instances if there is at least one.
115+
PREFER_RO_ports_result = set()
116+
for i in range(len(self.servers)):
117+
resp = conn.eval('return box.cfg.listen', mode=tarantool.Mode.PREFER_RO)
118+
PREFER_RO_ports_result.add(resp.data[0])
119+
120+
self.assertSetEqual(PREFER_RO_ports_result, RO_ports)
121+
122+
def test_02_roundrobin_all_ro(self):
123+
self.set_cluster_ro([True, True, True, True, True])
124+
all_ports = set()
125+
for addr in self.addrs:
126+
all_ports.add(str(addr['port']))
127+
128+
conn = tarantool.ConnectionPool(addrs=self.addrs, user='test', password='test')
129+
130+
# Expect PREFER_RW iterate through all instances if there are no RW.
131+
PREFER_RW_ports_result = set()
132+
for i in range(len(self.servers)):
133+
resp = conn.eval('return box.cfg.listen', mode=tarantool.Mode.PREFER_RW)
134+
PREFER_RW_ports_result.add(resp.data[0])
135+
136+
self.assertSetEqual(PREFER_RW_ports_result, all_ports)
137+
138+
def test_03_roundrobin_all_rw(self):
139+
self.set_cluster_ro([False, False, False, False, False])
140+
all_ports = set()
141+
for addr in self.addrs:
142+
all_ports.add(str(addr['port']))
143+
144+
conn = tarantool.ConnectionPool(addrs=self.addrs, user='test', password='test')
145+
146+
# Expect PREFER_RO iterate through all instances if there are no RO.
147+
PREFER_RO_ports_result = set()
148+
for i in range(len(self.servers)):
149+
resp = conn.eval('return box.cfg.listen', mode=tarantool.Mode.PREFER_RO)
150+
PREFER_RO_ports_result.add(resp.data[0])
151+
152+
self.assertSetEqual(PREFER_RO_ports_result, all_ports)
153+
154+
def tearDown(self):
155+
for srv in self.servers:
156+
srv.stop()
157+
srv.clean()

0 commit comments

Comments
 (0)