blob: a21fca5b290ec1d2b4d3a4731c6e52b61739c5c7 [file] [log] [blame]
danielk1977e1cd9872004-05-22 10:33:04 +00001# 2002 May 24
2#
3# The author disclaims copyright to this source code. In place of
4# a legal notice, here is a blessing:
5#
6# May you do good and not evil.
7# May you find forgiveness for yourself and forgive others.
8# May you share freely, never taking more than you give.
9#
10#***********************************************************************
11# This file implements regression tests for SQLite library. The focus of
12# this file is testing the SQLite routines used for converting between the
13# various suported unicode encodings (UTF-8, UTF-16, UTF-16le and
14# UTF-16be).
15#
danielk1977b82e7ed2006-01-11 14:09:31 +000016# $Id: enc2.test,v 1.26 2006/01/11 14:09:32 danielk1977 Exp $
danielk1977e1cd9872004-05-22 10:33:04 +000017
18set testdir [file dirname $argv0]
19source $testdir/tester.tcl
20
drh5436dc22004-11-14 04:04:17 +000021# If UTF16 support is disabled, ignore the tests in this file
22#
23ifcapable {!utf16} {
24 finish_test
25 return
26}
27
danielk1977f9d19a62004-06-14 08:26:35 +000028# The rough organisation of tests in this file is:
29#
30# enc2.1.*: Simple tests with a UTF-8 db.
31# enc2.2.*: Simple tests with a UTF-16LE db.
32# enc2.3.*: Simple tests with a UTF-16BE db.
33# enc2.4.*: Test that attached databases must have the same text encoding
34# as the main database.
35# enc2.5.*: Test the behaviour of the library when a collation sequence is
36# not available for the most desirable text encoding.
danielk1977bc6ada42004-06-30 08:20:16 +000037# enc2.6.*: Similar test for user functions.
38# enc2.7.*: Test that the VerifyCookie opcode protects against assuming the
danielk1977f9d19a62004-06-14 08:26:35 +000039# wrong text encoding for the database.
danielk1977bc6ada42004-06-30 08:20:16 +000040# enc2.8.*: Test sqlite3_complete16()
41#
danielk1977f9d19a62004-06-14 08:26:35 +000042
danielk1977e1cd9872004-05-22 10:33:04 +000043db close
44
45# Return the UTF-8 representation of the supplied UTF-16 string $str.
46proc utf8 {str} {
47 # If $str ends in two 0x00 0x00 bytes, knock these off before
48 # converting to UTF-8 using TCL.
49 binary scan $str \c* vals
50 if {[lindex $vals end]==0 && [lindex $vals end-1]==0} {
51 set str [binary format \c* [lrange $vals 0 end-2]]
52 }
53
54 set r [encoding convertfrom unicode $str]
55 return $r
56}
57
58#
59# This proc contains all the tests in this file. It is run
60# three times. Each time the file 'test.db' contains a database
61# with the following contents:
62set dbcontents {
63 CREATE TABLE t1(a PRIMARY KEY, b, c);
64 INSERT INTO t1 VALUES('one', 'I', 1);
65}
66# This proc tests that we can open and manipulate the test.db
67# database, and that it is possible to retreive values in
68# various text encodings.
69#
danielk19778e227872004-06-07 07:52:17 +000070proc run_test_script {t enc} {
danielk1977e1cd9872004-05-22 10:33:04 +000071
72# Open the database and pull out a (the) row.
73do_test $t.1 {
drhdddca282006-01-03 00:33:50 +000074 sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk1977e1cd9872004-05-22 10:33:04 +000075 execsql {SELECT * FROM t1}
76} {one I 1}
77
78# Insert some data
79do_test $t.2 {
80 execsql {INSERT INTO t1 VALUES('two', 'II', 2);}
81 execsql {SELECT * FROM t1}
82} {one I 1 two II 2}
83
drh5f3b4ab2004-05-27 17:22:54 +000084# Insert some data
danielk1977e1cd9872004-05-22 10:33:04 +000085do_test $t.3 {
drh5f3b4ab2004-05-27 17:22:54 +000086 execsql {
87 INSERT INTO t1 VALUES('three','III',3);
88 INSERT INTO t1 VALUES('four','IV',4);
89 INSERT INTO t1 VALUES('five','V',5);
90 }
danielk1977e1cd9872004-05-22 10:33:04 +000091 execsql {SELECT * FROM t1}
92} {one I 1 two II 2 three III 3 four IV 4 five V 5}
93
94# Use the index
95do_test $t.4 {
96 execsql {
97 SELECT * FROM t1 WHERE a = 'one';
98 }
99} {one I 1}
100do_test $t.5 {
101 execsql {
102 SELECT * FROM t1 WHERE a = 'four';
103 }
104} {four IV 4}
danielk1977e61b9f42005-01-21 04:25:47 +0000105ifcapable subquery {
106 do_test $t.6 {
107 execsql {
108 SELECT * FROM t1 WHERE a IN ('one', 'two');
109 }
110 } {one I 1 two II 2}
111}
danielk1977e1cd9872004-05-22 10:33:04 +0000112
113# Now check that we can retrieve data in both UTF-16 and UTF-8
114do_test $t.7 {
115 set STMT [sqlite3_prepare $DB "SELECT a FROM t1 WHERE c>3;" -1 TAIL]
116 sqlite3_step $STMT
drheb2e1762004-05-27 01:53:56 +0000117 sqlite3_column_text $STMT 0
danielk1977e1cd9872004-05-22 10:33:04 +0000118} {four}
119
120do_test $t.8 {
121 sqlite3_step $STMT
drheb2e1762004-05-27 01:53:56 +0000122 utf8 [sqlite3_column_text16 $STMT 0]
danielk1977e1cd9872004-05-22 10:33:04 +0000123} {five}
124
125do_test $t.9 {
126 sqlite3_finalize $STMT
danielk19773cf86062004-05-26 10:11:05 +0000127} SQLITE_OK
danielk1977e1cd9872004-05-22 10:33:04 +0000128
drh802d69a2005-02-13 23:34:24 +0000129ifcapable vacuum {
130 execsql VACUUM
131}
132
danielk19778e227872004-06-07 07:52:17 +0000133do_test $t.10 {
134 db eval {PRAGMA encoding}
135} $enc
danielk1977e1cd9872004-05-22 10:33:04 +0000136
137}
138
139# The three unicode encodings understood by SQLite.
danielk19778e227872004-06-07 07:52:17 +0000140set encodings [list UTF-8 UTF-16le UTF-16be]
danielk1977e1cd9872004-05-22 10:33:04 +0000141
drh59eb6762004-06-13 23:07:04 +0000142set sqlite_os_trace 0
danielk1977e1cd9872004-05-22 10:33:04 +0000143set i 1
144foreach enc $encodings {
145 file delete -force test.db
drhef4ac8f2004-06-19 00:16:31 +0000146 sqlite3 db test.db
danielk19778e227872004-06-07 07:52:17 +0000147 db eval "PRAGMA encoding = \"$enc\""
danielk1977e1cd9872004-05-22 10:33:04 +0000148 execsql $dbcontents
149 db close
danielk19778e227872004-06-07 07:52:17 +0000150 run_test_script enc2-$i $enc
drh59eb6762004-06-13 23:07:04 +0000151 db close
danielk1977e1cd9872004-05-22 10:33:04 +0000152 incr i
153}
154
danielk1977c0391392004-06-09 12:30:04 +0000155# Test that it is an error to try to attach a database with a different
156# encoding to the main database.
157do_test enc2-4.1 {
158 file delete -force test.db
drhef4ac8f2004-06-19 00:16:31 +0000159 sqlite3 db test.db
danielk1977c0391392004-06-09 12:30:04 +0000160 db eval "PRAGMA encoding = 'UTF-8'"
161 db eval "CREATE TABLE abc(a, b, c);"
162} {}
163do_test enc2-4.2 {
164 file delete -force test2.db
drhef4ac8f2004-06-19 00:16:31 +0000165 sqlite3 db2 test2.db
danielk1977c0391392004-06-09 12:30:04 +0000166 db2 eval "PRAGMA encoding = 'UTF-16'"
167 db2 eval "CREATE TABLE abc(a, b, c);"
168} {}
169do_test enc2-4.3 {
170 catchsql {
171 ATTACH 'test2.db' as aux;
172 }
173} {1 {attached databases must use the same text encoding as main database}}
174
danielk19770de0bb32004-06-10 05:59:24 +0000175db2 close
danielk19774e6af132004-06-10 14:01:08 +0000176db close
177
178# The following tests - enc2-5.* - test that SQLite selects the correct
179# collation sequence when more than one is available.
180
181set ::values [list one two three four five]
182set ::test_collate_enc INVALID
183proc test_collate {enc lhs rhs} {
184 set ::test_collate_enc $enc
185 set l [lsearch -exact $::values $lhs]
186 set r [lsearch -exact $::values $rhs]
187 set res [expr $l - $r]
drh4db38a72005-09-01 12:16:28 +0000188 # puts "enc=$enc lhs=$lhs/$l rhs=$rhs/$r res=$res"
danielk19774e6af132004-06-10 14:01:08 +0000189 return $res
190}
191
192file delete -force test.db
drhdddca282006-01-03 00:33:50 +0000193sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk19774e6af132004-06-10 14:01:08 +0000194do_test enc2-5.0 {
195 execsql {
196 CREATE TABLE t5(a);
197 INSERT INTO t5 VALUES('one');
198 INSERT INTO t5 VALUES('two');
199 INSERT INTO t5 VALUES('five');
200 INSERT INTO t5 VALUES('three');
201 INSERT INTO t5 VALUES('four');
202 }
203} {}
204do_test enc2-5.1 {
205 add_test_collate $DB 1 1 1
drh268803a2005-12-14 20:11:30 +0000206 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate;}]
danielk19774e6af132004-06-10 14:01:08 +0000207 lappend res $::test_collate_enc
208} {one two three four five UTF-8}
209do_test enc2-5.2 {
210 add_test_collate $DB 0 1 0
211 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}]
212 lappend res $::test_collate_enc
213} {one two three four five UTF-16LE}
danielk19774e6af132004-06-10 14:01:08 +0000214do_test enc2-5.3 {
215 add_test_collate $DB 0 0 1
216 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}]
217 lappend res $::test_collate_enc
218} {one two three four five UTF-16BE}
219
drh59eb6762004-06-13 23:07:04 +0000220db close
danielk19774e6af132004-06-10 14:01:08 +0000221file delete -force test.db
drhdddca282006-01-03 00:33:50 +0000222sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk19774e6af132004-06-10 14:01:08 +0000223execsql {pragma encoding = 'UTF-16LE'}
224do_test enc2-5.4 {
225 execsql {
226 CREATE TABLE t5(a);
227 INSERT INTO t5 VALUES('one');
228 INSERT INTO t5 VALUES('two');
229 INSERT INTO t5 VALUES('five');
230 INSERT INTO t5 VALUES('three');
231 INSERT INTO t5 VALUES('four');
232 }
233} {}
234do_test enc2-5.5 {
235 add_test_collate $DB 1 1 1
236 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}]
237 lappend res $::test_collate_enc
238} {one two three four five UTF-16LE}
239do_test enc2-5.6 {
240 add_test_collate $DB 1 0 1
241 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}]
242 lappend res $::test_collate_enc
243} {one two three four five UTF-16BE}
danielk19774e6af132004-06-10 14:01:08 +0000244do_test enc2-5.7 {
245 add_test_collate $DB 1 0 0
246 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}]
247 lappend res $::test_collate_enc
248} {one two three four five UTF-8}
249
drh59eb6762004-06-13 23:07:04 +0000250db close
danielk19774e6af132004-06-10 14:01:08 +0000251file delete -force test.db
drhdddca282006-01-03 00:33:50 +0000252sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk19774e6af132004-06-10 14:01:08 +0000253execsql {pragma encoding = 'UTF-16BE'}
254do_test enc2-5.8 {
255 execsql {
256 CREATE TABLE t5(a);
257 INSERT INTO t5 VALUES('one');
258 INSERT INTO t5 VALUES('two');
259 INSERT INTO t5 VALUES('five');
260 INSERT INTO t5 VALUES('three');
261 INSERT INTO t5 VALUES('four');
262 }
263} {}
264do_test enc2-5.9 {
265 add_test_collate $DB 1 1 1
266 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}]
267 lappend res $::test_collate_enc
268} {one two three four five UTF-16BE}
269do_test enc2-5.10 {
270 add_test_collate $DB 1 1 0
271 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}]
272 lappend res $::test_collate_enc
273} {one two three four five UTF-16LE}
danielk19774e6af132004-06-10 14:01:08 +0000274do_test enc2-5.11 {
275 add_test_collate $DB 1 0 0
276 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}]
277 lappend res $::test_collate_enc
278} {one two three four five UTF-8}
danielk19770de0bb32004-06-10 05:59:24 +0000279
danielk1977312d6b32004-06-29 13:18:23 +0000280# Also test that a UTF-16 collation factory works.
danielk1977bc6ada42004-06-30 08:20:16 +0000281do_test enc2-5-12 {
danielk1977312d6b32004-06-29 13:18:23 +0000282 add_test_collate $DB 0 0 0
283 catchsql {
284 SELECT * FROM t5 ORDER BY 1 COLLATE test_collate
285 }
286} {1 {no such collation sequence: test_collate}}
287do_test enc2-5.13 {
288 add_test_collate_needed $DB
drh268803a2005-12-14 20:11:30 +0000289 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate; }]
danielk1977312d6b32004-06-29 13:18:23 +0000290 lappend res $::test_collate_enc
291} {one two three four five UTF-16BE}
drh268803a2005-12-14 20:11:30 +0000292do_test enc2-5.14 {
293 set ::sqlite_last_needed_collation
294} test_collate
danielk1977312d6b32004-06-29 13:18:23 +0000295
danielk1977f9d19a62004-06-14 08:26:35 +0000296db close
297file delete -force test.db
298
drh268803a2005-12-14 20:11:30 +0000299do_test enc2-5.15 {
drhdddca282006-01-03 00:33:50 +0000300 sqlite3 db test.db; set ::DB [sqlite3_connection_pointer db]
drh268803a2005-12-14 20:11:30 +0000301 add_test_collate_needed $::DB
302 set ::sqlite_last_needed_collation
303} {}
304do_test enc2-5.16 {
305 execsql {CREATE TABLE t1(a varchar collate test_collate);}
306} {}
307do_test enc2-5.17 {
308 set ::sqlite_last_needed_collation
309} {test_collate}
310
danielk1977bc6ada42004-06-30 08:20:16 +0000311# The following tests - enc2-6.* - test that SQLite selects the correct
312# user function when more than one is available.
danielk19779d951762004-06-23 12:15:55 +0000313
314proc test_function {enc arg} {
315 return "$enc $arg"
316}
317
318file delete -force test.db
drhdddca282006-01-03 00:33:50 +0000319sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk19779d951762004-06-23 12:15:55 +0000320execsql {pragma encoding = 'UTF-8'}
321do_test enc2-6.0 {
322 execsql {
323 CREATE TABLE t5(a);
324 INSERT INTO t5 VALUES('one');
325 }
326} {}
327do_test enc2-6.1 {
328 add_test_function $DB 1 1 1
329 execsql {
330 SELECT test_function('sqlite')
331 }
332} {{UTF-8 sqlite}}
danielk1977e12c17b2004-06-23 12:35:14 +0000333db close
drhdddca282006-01-03 00:33:50 +0000334sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk19779d951762004-06-23 12:15:55 +0000335do_test enc2-6.2 {
336 add_test_function $DB 0 1 0
337 execsql {
338 SELECT test_function('sqlite')
339 }
340} {{UTF-16LE sqlite}}
danielk1977e12c17b2004-06-23 12:35:14 +0000341db close
drhdddca282006-01-03 00:33:50 +0000342sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk19779d951762004-06-23 12:15:55 +0000343do_test enc2-6.3 {
344 add_test_function $DB 0 0 1
345 execsql {
346 SELECT test_function('sqlite')
347 }
348} {{UTF-16BE sqlite}}
349
drh2ec81642004-06-28 11:52:45 +0000350db close
danielk19779d951762004-06-23 12:15:55 +0000351file delete -force test.db
drhdddca282006-01-03 00:33:50 +0000352sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk19779d951762004-06-23 12:15:55 +0000353execsql {pragma encoding = 'UTF-16LE'}
354do_test enc2-6.3 {
355 execsql {
356 CREATE TABLE t5(a);
357 INSERT INTO t5 VALUES('sqlite');
358 }
359} {}
360do_test enc2-6.4 {
361 add_test_function $DB 1 1 1
362 execsql {
363 SELECT test_function('sqlite')
364 }
365} {{UTF-16LE sqlite}}
danielk1977e12c17b2004-06-23 12:35:14 +0000366db close
drhdddca282006-01-03 00:33:50 +0000367sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk19779d951762004-06-23 12:15:55 +0000368do_test enc2-6.5 {
369 add_test_function $DB 0 1 0
370 execsql {
371 SELECT test_function('sqlite')
372 }
373} {{UTF-16LE sqlite}}
danielk1977e12c17b2004-06-23 12:35:14 +0000374db close
drhdddca282006-01-03 00:33:50 +0000375sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk19779d951762004-06-23 12:15:55 +0000376do_test enc2-6.6 {
377 add_test_function $DB 0 0 1
378 execsql {
379 SELECT test_function('sqlite')
380 }
381} {{UTF-16BE sqlite}}
382
drh2ec81642004-06-28 11:52:45 +0000383db close
danielk19779d951762004-06-23 12:15:55 +0000384file delete -force test.db
drhdddca282006-01-03 00:33:50 +0000385sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk19779d951762004-06-23 12:15:55 +0000386execsql {pragma encoding = 'UTF-16BE'}
387do_test enc2-6.7 {
388 execsql {
389 CREATE TABLE t5(a);
390 INSERT INTO t5 VALUES('sqlite');
391 }
392} {}
393do_test enc2-6.8 {
394 add_test_function $DB 1 1 1
395 execsql {
396 SELECT test_function('sqlite')
397 }
398} {{UTF-16BE sqlite}}
danielk1977e12c17b2004-06-23 12:35:14 +0000399db close
drhdddca282006-01-03 00:33:50 +0000400sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk19779d951762004-06-23 12:15:55 +0000401do_test enc2-6.9 {
402 add_test_function $DB 0 1 0
403 execsql {
404 SELECT test_function('sqlite')
405 }
406} {{UTF-16LE sqlite}}
danielk1977e12c17b2004-06-23 12:35:14 +0000407db close
drhdddca282006-01-03 00:33:50 +0000408sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk19779d951762004-06-23 12:15:55 +0000409do_test enc2-6.10 {
410 add_test_function $DB 0 0 1
411 execsql {
412 SELECT test_function('sqlite')
413 }
414} {{UTF-16BE sqlite}}
415
danielk1977312d6b32004-06-29 13:18:23 +0000416
danielk19779d951762004-06-23 12:15:55 +0000417db close
418file delete -force test.db
419
danielk1977bc6ada42004-06-30 08:20:16 +0000420# The following tests - enc2-7.* - function as follows:
danielk1977f9d19a62004-06-14 08:26:35 +0000421#
422# 1: Open an empty database file assuming UTF-16 encoding.
423# 2: Open the same database with a different handle assuming UTF-8. Create
424# a table using this handle.
425# 3: Read the sqlite_master table from the first handle.
426# 4: Ensure the first handle recognises the database encoding is UTF-8.
427#
danielk19779d951762004-06-23 12:15:55 +0000428do_test enc2-7.1 {
drhef4ac8f2004-06-19 00:16:31 +0000429 sqlite3 db test.db
danielk1977f9d19a62004-06-14 08:26:35 +0000430 execsql {
431 PRAGMA encoding = 'UTF-16';
432 SELECT * FROM sqlite_master;
433 }
434} {}
danielk19779d951762004-06-23 12:15:55 +0000435do_test enc2-7.2 {
danielk1977f9d19a62004-06-14 08:26:35 +0000436 set enc [execsql {
437 PRAGMA encoding;
438 }]
439 string range $enc 0 end-2 ;# Chop off the "le" or "be"
440} {UTF-16}
danielk19779d951762004-06-23 12:15:55 +0000441do_test enc2-7.3 {
drhef4ac8f2004-06-19 00:16:31 +0000442 sqlite3 db2 test.db
danielk1977f9d19a62004-06-14 08:26:35 +0000443 execsql {
444 PRAGMA encoding = 'UTF-8';
445 CREATE TABLE abc(a, b, c);
446 } db2
447} {}
danielk19779d951762004-06-23 12:15:55 +0000448do_test enc2-7.4 {
danielk1977f9d19a62004-06-14 08:26:35 +0000449 execsql {
450 SELECT * FROM sqlite_master;
451 }
danielk197745901d62004-11-10 15:27:38 +0000452} "table abc abc [expr $AUTOVACUUM?3:2] {CREATE TABLE abc(a, b, c)}"
danielk19779d951762004-06-23 12:15:55 +0000453do_test enc2-7.5 {
danielk1977f9d19a62004-06-14 08:26:35 +0000454 execsql {
455 PRAGMA encoding;
456 }
457} {UTF-8}
458
459db close
460db2 close
461
danielk1977bc6ada42004-06-30 08:20:16 +0000462proc utf16 {utf8} {
463 set utf16 [encoding convertto unicode $utf8]
464 append utf16 "\x00\x00"
465 return $utf16
466}
drhccae6022005-02-26 17:31:26 +0000467ifcapable {complete} {
468 do_test enc2-8.1 {
469 sqlite3_complete16 [utf16 "SELECT * FROM t1;"]
470 } {1}
471 do_test enc2-8.2 {
472 sqlite3_complete16 [utf16 "SELECT * FROM"]
473 } {0}
474}
danielk1977f9d19a62004-06-14 08:26:35 +0000475
danielk1977b82e7ed2006-01-11 14:09:31 +0000476# Test that the encoding of an empty database may still be set after the
477# (empty) schema has been initialized.
478file delete -force test.db
479do_test enc2-9.1 {
480 sqlite3 db test.db
481 execsql {
482 PRAGMA encoding = 'UTF-8';
483 PRAGMA encoding;
484 }
485} {UTF-8}
486do_test enc2-9.2 {
487 sqlite3 db test.db
488 execsql {
489 PRAGMA encoding = 'UTF-16le';
490 PRAGMA encoding;
491 }
492} {UTF-16le}
493do_test enc2-9.3 {
494 sqlite3 db test.db
495 execsql {
496 SELECT * FROM sqlite_master;
497 PRAGMA encoding = 'UTF-8';
498 PRAGMA encoding;
499 }
500} {UTF-8}
501do_test enc2-9.4 {
502 sqlite3 db test.db
503 execsql {
504 PRAGMA encoding = 'UTF-16le';
505 CREATE TABLE abc(a, b, c);
506 PRAGMA encoding;
507 }
508} {UTF-16le}
509do_test enc2-9.5 {
510 sqlite3 db test.db
511 execsql {
512 PRAGMA encoding = 'UTF-8';
513 PRAGMA encoding;
514 }
515} {UTF-16le}
516
danielk1977e1cd9872004-05-22 10:33:04 +0000517finish_test