| # 2019 November 18 |
| # |
| # 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 symlink2 |
| |
| # This only runs on Windows. |
| if {$::tcl_platform(platform)!="windows"} { |
| finish_test |
| return |
| } |
| |
| proc createWin32Symlink { link target } { |
| exec -- $::env(ComSpec) /c mklink \ |
| [file nativename $link] [file nativename $target] |
| return "" |
| } |
| |
| proc deleteWin32Symlink { link } { |
| exec -- $::env(ComSpec) /c del [file nativename $link] |
| return "" |
| } |
| |
| proc canCreateWin32Symlink {} { |
| set link [file join $::testdir lnk[pid].sym] |
| if {[file exists $link]} { return 0 } |
| set target [info nameofexecutable] |
| if {[catch {createWin32Symlink $link $target}] == 0} { |
| deleteWin32Symlink $link |
| return 1 |
| } |
| return 0 |
| } |
| |
| # Creating symlinks may require administrator privileges on Windows. |
| if {![canCreateWin32Symlink]} { |
| finish_test |
| return |
| } |
| |
| # Ensure that test.db has been created. |
| # |
| do_execsql_test 1.0 { |
| CREATE TABLE t1(x, y); |
| INSERT INTO t1 VALUES(1,9999); |
| } |
| |
| do_test 2.0 { |
| createWin32Symlink link.db test.db |
| } {} |
| |
| do_test 2.1 { |
| file exists test.db |
| } {1} |
| |
| do_test 2.2 { |
| file exists link.db |
| } {1} |
| |
| do_test 3.1 { |
| execsql { SELECT x, y FROM t1; } db |
| } {1 9999} |
| |
| do_test 3.2 { |
| sqlite3 db2 link.db |
| execsql { SELECT x, y FROM t1; } db2 |
| } {1 9999} |
| |
| do_test 3.3 { |
| sqlite3 db3 test.db -nofollow true |
| execsql { SELECT x, y FROM t1; } db3 |
| } {1 9999} |
| |
| do_test 3.4 { |
| db3 close |
| } {} |
| |
| do_test 3.5 { |
| list [catch { |
| sqlite3 db4 link.db -nofollow true |
| execsql { SELECT x, y FROM t1; } db4 |
| } res] $res |
| } {1 {unable to open database file}} |
| |
| catch {db4 close} |
| |
| do_test 4.0 { |
| db2 close |
| deleteWin32Symlink link.db |
| } {} |
| |
| do_test 4.1 { |
| file exists test.db |
| } {1} |
| |
| do_test 4.2 { |
| file exists link.db |
| } {0} |
| |
| do_test 5.1 { |
| execsql { SELECT x, y FROM t1; } db |
| } {1 9999} |
| |
| finish_test |