@@ -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