Index: third_party/sqlite/sqlite-src-3170000/test/symlink.test |
diff --git a/third_party/sqlite/sqlite-src-3170000/test/symlink.test b/third_party/sqlite/sqlite-src-3170000/test/symlink.test |
new file mode 100644 |
index 0000000000000000000000000000000000000000..949102cf8ad24fb2e6e462b785d7457f9cef7bd4 |
--- /dev/null |
+++ b/third_party/sqlite/sqlite-src-3170000/test/symlink.test |
@@ -0,0 +1,191 @@ |
+# 2015 October 31 |
+# |
+# The author disclaims copyright to this source code. In place of |
+# a legal notice, here is a blessing: |
+# |
+# May you do good and not evil. |
+# May you find forgiveness for yourself and forgive others. |
+# May you share freely, never taking more than you give. |
+# |
+#*********************************************************************** |
+# This file implements regression tests for SQLite library. The |
+# focus of this file is testing that SQLite can follow symbolic links. |
+# |
+ |
+set testdir [file dirname $argv0] |
+source $testdir/tester.tcl |
+set testprefix symlink |
+ |
+# This only runs on unix. |
+if {$::tcl_platform(platform)!="unix"} { |
+ finish_test |
+ return |
+} |
+ |
+# Ensure that test.db has been created. |
+# |
+do_execsql_test 1.0 { |
+ CREATE TABLE t1(x, y); |
+} |
+ |
+# Test that SQLite follows symlinks when opening files. |
+# |
+forcedelete test.db2 |
+do_test 1.1 { |
+ file link test.db2 test.db |
+ sqlite3 db2 test.db2 |
+ sqlite3_db_filename db2 main |
+} [file join [pwd] test.db] |
+ |
+# Test that if the symlink points to a file that does not exists, it is |
+# created when it is opened. |
+# |
+do_test 1.2.1 { |
+ db2 close |
+ db close |
+ forcedelete test.db |
+ file exists test.db |
+} 0 |
+do_test 1.2.2 { |
+ sqlite3 db2 test.db2 |
+ file exists test.db |
+} 1 |
+do_test 1.2.3 { |
+ sqlite3_db_filename db2 main |
+} [file join [pwd] test.db] |
+db2 close |
+ |
+# Test that a loop of symlinks cannot be opened. |
+# |
+do_test 1.3 { |
+ forcedelete test.db |
+ # Note: Tcl [file link] command is too smart to create loops of symlinks. |
+ exec ln -s test.db2 test.db |
+ list [catch { sqlite3 db test.db } msg] $msg |
+} {1 {unable to open database file}} |
+ |
+# Test that overly large paths cannot be opened. |
+# |
+do_test 1.4 { |
+ set name "test.db[string repeat x 502]" |
+ list [catch { sqlite3 db $name } msg] $msg |
+} {1 {unable to open database file}} |
+do_test 1.5 { |
+ set r [expr 510 - [string length test.db] - [string length [pwd]]] |
+ set name "test.db[string repeat x $r]" |
+ list [catch { sqlite3 db $name } msg] $msg |
+} {1 {unable to open database file}} |
+ |
+#------------------------------------------------------------------------- |
+# Test that journal and wal files are created next to the real file, |
+# not the symlink. |
+# |
+do_test 2.0 { |
+ catch { db close } |
+ catch { db2 close } |
+ forcedelete test.db test.db2 test.db3 |
+ sqlite3 db test.db |
+ execsql { CREATE TABLE t1(x) } |
+ file link test.db2 test.db |
+ file link test.db3 test.db2 |
+ set {} {} |
+} {} |
+ |
+foreach {tn f} {1 test.db2 2 test.db3} { |
+ do_test 2.$tn.1 { |
+ sqlite3 db2 $f |
+ file exists test.db-journal |
+ } 0 |
+ do_test 2.$tn.2 { |
+ execsql { |
+ BEGIN; |
+ INSERT INTO t1 VALUES(1); |
+ } db2 |
+ file exists test.db-journal |
+ } 1 |
+ do_test 2.$tn.3 { |
+ list [file exists test2.db-journal] [file exists test3.db-journal] |
+ } {0 0} |
+ do_test 2.$tn.4 { |
+ execsql { |
+ COMMIT; |
+ PRAGMA journal_mode = wal; |
+ INSERT INTO t1 VALUES(2); |
+ } db2 |
+ file exists test.db-wal |
+ } 1 |
+ do_test 2.$tn.5 { |
+ list [file exists test2.db-wal] [file exists test3.db-wal] |
+ } {0 0} |
+ do_execsql_test 2.$tn.6 { |
+ SELECT * FROM t1; |
+ } {1 2} |
+ db2 close |
+ do_execsql_test 2.$tn.7 { |
+ DELETE FROM t1; |
+ PRAGMA journal_mode = delete; |
+ } delete |
+} |
+ |
+# Try to open a ridiculously long pathname. Bug found by |
+# Kostya Serebryany using libFuzzer on 2015-11-30. |
+# |
+do_test 3.1 { |
+ db close |
+ catch {sqlite3 db [string repeat [string repeat x 100]/ 6]} res |
+ set res |
+} {unable to open database file} |
+ |
+#------------------------------------------------------------------------- |
+# Test that relative symlinks that are not located in the cwd work. |
+# |
+do_test 4.1 { |
+ forcedelete x y z |
+ file mkdir x |
+ file mkdir y |
+ file mkdir z |
+ sqlite3 db x/test.db |
+ file link y/test.db ../x/test.db |
+ file link z/test.db ../y/test.db |
+ execsql { |
+ PRAGMA journal_mode = wal; |
+ CREATE TABLE t1(x, y); |
+ INSERT INTO t1 VALUES('hello', 'world'); |
+ } |
+} {wal} |
+ |
+do_test 4.2.1 { |
+ db close |
+ sqlite3 db y/test.db |
+ db eval { SELECT * FROM t1 } |
+} {hello world} |
+do_test 4.2.2 { |
+ list [file exists x/test.db-wal] [file exists y/test.db-wal] |
+} {1 0} |
+ |
+do_test 4.3.1 { |
+ db close |
+ sqlite3 db z/test.db |
+ db eval { SELECT * FROM t1 } |
+} {hello world} |
+do_test 4.3.2 { |
+ list [file exists x/test.db-wal] [file exists y/test.db-wal] \ |
+ [file exists z/test.db-wal] |
+} {1 0 0} |
+ |
+do_test 4.4.0 { |
+ forcedelete w |
+ file mkdir w |
+ file link w/test.db [file join [pwd] x/test.db] |
+ set {} {} |
+} {} |
+do_test 4.4.1 { |
+ db close |
+ sqlite3 db w/test.db |
+ db eval { SELECT * FROM t1 } |
+} {hello world} |
+do_test 4.4.2 { |
+ list [file exists x/test.db-wal] [file exists w/test.db-wal] |
+} {1 0} |
+ |
+finish_test |