Skip to content

Commit 1de5204

Browse files
committed
test: verify schema reload on unicode names
In Python 2 a binary string and a Unicode string with the same ASCII characters are considered equal: | >>> 'x' == u'x' | True | >>> u'x' == 'x' | True It works seamlessly with dictionary keys too: | >>> d = dict() | >>> d[u'x'] = 42 | >>> d['x'] | 42 This, however, does not work for non-ASCII characters: | >>> 'ч' == u'ч' | False | >>> u'ч' == 'ч' | False | >>> d = dict() | >>> d[u'ч'] = 42 | >>> d['ч'] | Traceback (most recent call last): | File "<stdin>", line 1, in <module> | KeyError: '\xd1\x87' The implemented test cases verify schema loading for a space or an index with a non-ASCII name, when it is passed just as a literal: say, '∞'. The main purpose of the commit is to add test cases that verify that no extra schema fetch is performed for a space / index name given as non-ASCII string literal (which is binary string on Python 2). If a cache is implemented without taking care to this, an already cached value may be missed.
1 parent 973ea60 commit 1de5204

File tree

1 file changed

+69
-0
lines changed

1 file changed

+69
-0
lines changed

Diff for: unit/suites/test_schema.py

+69
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,23 @@ def setUpClass(self):
4949
encoding=self.encoding)
5050
self.sch = self.con.schema
5151

52+
# The relevant test cases mainly target Python 2, where
53+
# a user may want to pass a string literal as a space or
54+
# an index name and don't bother whether all symbols in it
55+
# are ASCII.
56+
self.unicode_space_name_literal = '∞'
57+
self.unicode_index_name_literal = '→'
58+
59+
self.unicode_space_name_u = u'∞'
60+
self.unicode_index_name_u = u'→'
61+
self.unicode_space_id, self.unicode_index_id = self.srv.admin("""
62+
do
63+
local space = box.schema.create_space('\\xe2\\x88\\x9e')
64+
local index = space:create_index('\\xe2\\x86\\x92')
65+
return space.id, index.id
66+
end
67+
""")
68+
5269
def setUp(self):
5370
# prevent a remote tarantool from clean our session
5471
if self.srv.is_started():
@@ -73,6 +90,17 @@ def fetch_count(self):
7390
res += self.fetch_index_counter.call_count()
7491
return res
7592

93+
def verify_unicode_space(self, space):
94+
self.assertEqual(space.sid, self.unicode_space_id)
95+
self.assertEqual(space.name, self.unicode_space_name_u)
96+
self.assertEqual(space.arity, 1)
97+
98+
def verify_unicode_index(self, index):
99+
self.assertEqual(index.space.name, self.unicode_space_name_u)
100+
self.assertEqual(index.iid, self.unicode_index_id)
101+
self.assertEqual(index.name, self.unicode_index_name_u)
102+
self.assertEqual(len(index.parts), 1)
103+
76104
def test_00_authenticate(self):
77105
self.assertIsNone(self.srv.admin("box.schema.user.create('test', { password = 'test' })"))
78106
self.assertIsNone(self.srv.admin("box.schema.user.grant('test', 'read,write', 'space', '_space')"))
@@ -122,6 +150,9 @@ def test_03_01_space_name__(self):
122150
self.assertEqual(space.name, '_index')
123151
self.assertEqual(space.arity, 1)
124152

153+
space = self.sch.get_space(self.unicode_space_name_literal)
154+
self.verify_unicode_space(space)
155+
125156
def test_03_02_space_number(self):
126157
self.con.flush_schema()
127158
space = self.sch.get_space(272)
@@ -137,6 +168,9 @@ def test_03_02_space_number(self):
137168
self.assertEqual(space.name, '_index')
138169
self.assertEqual(space.arity, 1)
139170

171+
space = self.sch.get_space(self.unicode_space_id)
172+
self.verify_unicode_space(space)
173+
140174
def test_04_space_cached(self):
141175
space = self.sch.get_space('_schema')
142176
self.assertEqual(space.sid, 272)
@@ -154,6 +188,12 @@ def test_04_space_cached(self):
154188
# Verify that no schema fetches occurs.
155189
self.assertEqual(self.fetch_count, 0)
156190

191+
space = self.sch.get_space(self.unicode_space_name_literal)
192+
self.verify_unicode_space(space)
193+
194+
# Verify that no schema fetches occurs.
195+
self.assertEqual(self.fetch_count, 0)
196+
157197
def test_05_01_index_name___name__(self):
158198
self.con.flush_schema()
159199
index = self.sch.get_index('_index', 'primary')
@@ -177,6 +217,10 @@ def test_05_01_index_name___name__(self):
177217
self.assertEqual(index.name, 'name')
178218
self.assertEqual(len(index.parts), 1)
179219

220+
index = self.sch.get_index(self.unicode_space_name_literal,
221+
self.unicode_index_name_literal)
222+
self.verify_unicode_index(index)
223+
180224
def test_05_02_index_name___number(self):
181225
self.con.flush_schema()
182226
index = self.sch.get_index('_index', 0)
@@ -200,6 +244,10 @@ def test_05_02_index_name___number(self):
200244
self.assertEqual(index.name, 'name')
201245
self.assertEqual(len(index.parts), 1)
202246

247+
index = self.sch.get_index(self.unicode_space_name_literal,
248+
self.unicode_index_id)
249+
self.verify_unicode_index(index)
250+
203251
def test_05_03_index_number_name__(self):
204252
self.con.flush_schema()
205253
index = self.sch.get_index(288, 'primary')
@@ -223,6 +271,10 @@ def test_05_03_index_number_name__(self):
223271
self.assertEqual(index.name, 'name')
224272
self.assertEqual(len(index.parts), 1)
225273

274+
index = self.sch.get_index(self.unicode_space_id,
275+
self.unicode_index_name_literal)
276+
self.verify_unicode_index(index)
277+
226278
def test_05_04_index_number_number(self):
227279
self.con.flush_schema()
228280
index = self.sch.get_index(288, 0)
@@ -246,6 +298,10 @@ def test_05_04_index_number_number(self):
246298
self.assertEqual(index.name, 'name')
247299
self.assertEqual(len(index.parts), 1)
248300

301+
index = self.sch.get_index(self.unicode_space_id,
302+
self.unicode_index_id)
303+
self.verify_unicode_index(index)
304+
249305
def test_06_index_cached(self):
250306
index = self.sch.get_index('_index', 'primary')
251307
self.assertEqual(index.space.name, '_index')
@@ -271,6 +327,19 @@ def test_06_index_cached(self):
271327
# Verify that no schema fetches occurs.
272328
self.assertEqual(self.fetch_count, 0)
273329

330+
cases = (
331+
(self.unicode_space_name_literal, self.unicode_index_name_literal),
332+
(self.unicode_space_name_literal, self.unicode_index_id),
333+
(self.unicode_space_id, self.unicode_index_name_literal),
334+
(self.unicode_space_id, self.unicode_index_id),
335+
)
336+
for s, i in cases:
337+
index = self.sch.get_index(s, i)
338+
self.verify_unicode_index(index)
339+
340+
# Verify that no schema fetches occurs.
341+
self.assertEqual(self.fetch_count, 0)
342+
274343
def test_07_schema_version_update(self):
275344
_space_len = len(self.con.select('_space'))
276345
self.srv.admin("box.schema.create_space('ttt22')")

0 commit comments

Comments
 (0)