@@ -49,6 +49,23 @@ def setUpClass(self):
49
49
encoding = self .encoding )
50
50
self .sch = self .con .schema
51
51
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
+
52
69
def setUp (self ):
53
70
# prevent a remote tarantool from clean our session
54
71
if self .srv .is_started ():
@@ -73,6 +90,17 @@ def fetch_count(self):
73
90
res += self .fetch_index_counter .call_count ()
74
91
return res
75
92
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
+
76
104
def test_00_authenticate (self ):
77
105
self .assertIsNone (self .srv .admin ("box.schema.user.create('test', { password = 'test' })" ))
78
106
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):
122
150
self .assertEqual (space .name , '_index' )
123
151
self .assertEqual (space .arity , 1 )
124
152
153
+ space = self .sch .get_space (self .unicode_space_name_literal )
154
+ self .verify_unicode_space (space )
155
+
125
156
def test_03_02_space_number (self ):
126
157
self .con .flush_schema ()
127
158
space = self .sch .get_space (272 )
@@ -137,6 +168,9 @@ def test_03_02_space_number(self):
137
168
self .assertEqual (space .name , '_index' )
138
169
self .assertEqual (space .arity , 1 )
139
170
171
+ space = self .sch .get_space (self .unicode_space_id )
172
+ self .verify_unicode_space (space )
173
+
140
174
def test_04_space_cached (self ):
141
175
space = self .sch .get_space ('_schema' )
142
176
self .assertEqual (space .sid , 272 )
@@ -154,6 +188,12 @@ def test_04_space_cached(self):
154
188
# Verify that no schema fetches occurs.
155
189
self .assertEqual (self .fetch_count , 0 )
156
190
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
+
157
197
def test_05_01_index_name___name__ (self ):
158
198
self .con .flush_schema ()
159
199
index = self .sch .get_index ('_index' , 'primary' )
@@ -177,6 +217,10 @@ def test_05_01_index_name___name__(self):
177
217
self .assertEqual (index .name , 'name' )
178
218
self .assertEqual (len (index .parts ), 1 )
179
219
220
+ index = self .sch .get_index (self .unicode_space_name_literal ,
221
+ self .unicode_index_name_literal )
222
+ self .verify_unicode_index (index )
223
+
180
224
def test_05_02_index_name___number (self ):
181
225
self .con .flush_schema ()
182
226
index = self .sch .get_index ('_index' , 0 )
@@ -200,6 +244,10 @@ def test_05_02_index_name___number(self):
200
244
self .assertEqual (index .name , 'name' )
201
245
self .assertEqual (len (index .parts ), 1 )
202
246
247
+ index = self .sch .get_index (self .unicode_space_name_literal ,
248
+ self .unicode_index_id )
249
+ self .verify_unicode_index (index )
250
+
203
251
def test_05_03_index_number_name__ (self ):
204
252
self .con .flush_schema ()
205
253
index = self .sch .get_index (288 , 'primary' )
@@ -223,6 +271,10 @@ def test_05_03_index_number_name__(self):
223
271
self .assertEqual (index .name , 'name' )
224
272
self .assertEqual (len (index .parts ), 1 )
225
273
274
+ index = self .sch .get_index (self .unicode_space_id ,
275
+ self .unicode_index_name_literal )
276
+ self .verify_unicode_index (index )
277
+
226
278
def test_05_04_index_number_number (self ):
227
279
self .con .flush_schema ()
228
280
index = self .sch .get_index (288 , 0 )
@@ -246,6 +298,10 @@ def test_05_04_index_number_number(self):
246
298
self .assertEqual (index .name , 'name' )
247
299
self .assertEqual (len (index .parts ), 1 )
248
300
301
+ index = self .sch .get_index (self .unicode_space_id ,
302
+ self .unicode_index_id )
303
+ self .verify_unicode_index (index )
304
+
249
305
def test_06_index_cached (self ):
250
306
index = self .sch .get_index ('_index' , 'primary' )
251
307
self .assertEqual (index .space .name , '_index' )
@@ -271,6 +327,19 @@ def test_06_index_cached(self):
271
327
# Verify that no schema fetches occurs.
272
328
self .assertEqual (self .fetch_count , 0 )
273
329
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
+
274
343
def test_07_schema_version_update (self ):
275
344
_space_len = len (self .con .select ('_space' ))
276
345
self .srv .admin ("box.schema.create_space('ttt22')" )
0 commit comments