1b47e4c28Slarrybr# 2021-03-06 2b47e4c28Slarrybr# 3b47e4c28Slarrybr# The author disclaims copyright to this source code. In place of 4b47e4c28Slarrybr# a legal notice, here is a blessing: 5b47e4c28Slarrybr# 6b47e4c28Slarrybr# May you do good and not evil. 7b47e4c28Slarrybr# May you find forgiveness for yourself and forgive others. 8b47e4c28Slarrybr# May you share freely, never taking more than you give. 9b47e4c28Slarrybr# 10b47e4c28Slarrybr#*********************************************************************** 11b47e4c28Slarrybr# 12b47e4c28Slarrybr# This file implements tests for the appendvfs extension. 13b47e4c28Slarrybr# 14b47e4c28Slarrybr# Tests performed: 15ddf49720Slarrybr# avfs-1.0. Test that an appendvfs DB can be added to an empty (ZLF) file. 16b47e4c28Slarrybr# avfs-1.1. Test that the DB can be read with correct content upon reopen. 17b47e4c28Slarrybr# avfs-1.2. Test that an appendvfs DB can be added to a simple text file. 18b47e4c28Slarrybr# avfs-1.3. Test that the DB can be read with correct content upon reopen. 19ddf49720Slarrybr# avfs-1.4. Test that appended DB is aligned to default page boundary. 20b47e4c28Slarrybr# avfs-2.1. Test that the simple text file retains its initial text. 21b47e4c28Slarrybr# avfs-3.1. Test that the appendvfs can grow and shrink, remaining intact. 22b47e4c28Slarrybr# avfs-3.2. Test that appendvfs is intact after grow/shrink/close/reopen. 23*5cad178bSlarrybr# avfs-3.3. Test that appendvfs can grow by many pages and be written. 24*5cad178bSlarrybr# avfs-3.4. Test that grown appendvfs can be reopened and appear intact. 25*5cad178bSlarrybr# avfs-3.5. Test that much grown appendvfs can shrink and reopen intact. 26b47e4c28Slarrybr# avfs-4.1. Test shell's ability to append to a non-appendvfs file. 27b47e4c28Slarrybr# avfs-4.2. Test shell's ability to append to empty or nonexistent file. 28b47e4c28Slarrybr# avfs-4.3. Test shell's ability to reopen and alter an appendvfs file. 29ddf49720Slarrybr# avfs-5.1. Test appendvfs refusal to open too-tiny DB appended onto ZLF. 30ddf49720Slarrybr# avfs-5.2. Test appendvfs refusal to open too-tiny DB appended on other. 31b47e4c28Slarrybr# ... 32b47e4c28Slarrybr# (more to come) 33b47e4c28Slarrybr 34b47e4c28Slarrybrset testdir [file dirname $argv0] 35b47e4c28Slarrybrsource $testdir/tester.tcl 36b47e4c28Slarrybrset ::testprefix avfs 37ba34b79fSdan 38ba34b79fSdan# Do not attempt this test if SQLITE_OMIT_VIRTUALTABLE is defined. 39ba34b79fSdan# 40ba34b79fSdanifcapable !vtab { 41ba34b79fSdan finish_test 42ba34b79fSdan return 43ba34b79fSdan} 44ba34b79fSdan 45b47e4c28Slarrybrset CLI [test_find_cli] 46b47e4c28Slarrybrdb close 47c5edbd1cSlarrybr# forcedelete test.db 48b47e4c28Slarrybr 49b47e4c28Slarrybrload_static_extension db appendvfs 50b47e4c28Slarrybr 51b47e4c28Slarrybrset ::fa avfs.adb 52b47e4c28Slarrybrset ::fza avfs.sdb 53b47e4c28Slarrybrforcedelete $::fa $::fza 54b47e4c28Slarrybrset ::result {} 55b47e4c28Slarrybr 56c5edbd1cSlarrybrproc shellDoesAr {} { 57c5edbd1cSlarrybr set shdo "sh_app1.sql" 58c5edbd1cSlarrybr forcedelete $shdo 59c5edbd1cSlarrybr set fd [open $shdo w] 60c5edbd1cSlarrybr puts $fd ".help\n.q" 61c5edbd1cSlarrybr close $fd 62c5edbd1cSlarrybr set res [catchcmd "-batch -cmd \".read $shdo\""] 63c5edbd1cSlarrybr return [regexp {^.archive} [lindex $res 1]] 64c5edbd1cSlarrybr} 65c5edbd1cSlarrybr 66b47e4c28Slarrybrset ::vf "&vfs=apndvfs" 67b47e4c28Slarrybr 68b47e4c28Slarrybr# Return file offset of appendvfs portion of a file, or {} if none such. 69b47e4c28Slarrybrproc fosAvfs {fname} { 70b47e4c28Slarrybr if {[file size $fname] < 25} { 71b47e4c28Slarrybr return {} 72b47e4c28Slarrybr } 73b47e4c28Slarrybr if {[catch {set fd [open $fname rb]}]} { 74b47e4c28Slarrybr return {} 75b47e4c28Slarrybr } 76b47e4c28Slarrybr seek $fd -25 end 77b47e4c28Slarrybr set am [read $fd 17] 78b47e4c28Slarrybr set ao [read $fd 8] 79b47e4c28Slarrybr close $fd 80b47e4c28Slarrybr if {$am ne "Start-Of-SQLite3-"} { 81b47e4c28Slarrybr return {} 82b47e4c28Slarrybr } 83b47e4c28Slarrybr binary scan $ao "W" rvo 84b47e4c28Slarrybr return $rvo 85b47e4c28Slarrybr} 86b47e4c28Slarrybr 87b47e4c28Slarrybrdo_test 1.0 { 88b47e4c28Slarrybr set results {} 89b47e4c28Slarrybr set out [open $::fza wb] 90b47e4c28Slarrybr close $out 91b47e4c28Slarrybr sqlite3 adb "file:$::fza?mode=rwc$::vf" -uri 1 92b47e4c28Slarrybr adb eval { 93b47e4c28Slarrybr PRAGMA page_size=1024; 94b47e4c28Slarrybr PRAGMA cache_size=10; 95b47e4c28Slarrybr CREATE TABLE t1(a TEXT); 96b47e4c28Slarrybr INSERT INTO t1 VALUES ('dog'),('cat'); 97b47e4c28Slarrybr SELECT group_concat(a) as pets FROM (SELECT a FROM t1 ORDER BY a); 98b47e4c28Slarrybr } { lappend results $pets } 99b47e4c28Slarrybr adb close 100b47e4c28Slarrybr lappend results [fosAvfs $fza] 101b47e4c28Slarrybr set ::result [join $results " | "] 102b47e4c28Slarrybr} {cat,dog | 0} 103b47e4c28Slarrybr 104b47e4c28Slarrybrdo_test 1.1 { 105b47e4c28Slarrybr set results {} 106b47e4c28Slarrybr sqlite3 adb "file:$::fza?mode=rw$::vf" -uri 1 107b47e4c28Slarrybr adb eval { 108b47e4c28Slarrybr SELECT group_concat(a) as pets FROM (SELECT a FROM t1 ORDER BY a DESC); 109b47e4c28Slarrybr } { lappend results $pets } 110b47e4c28Slarrybr adb close 111b47e4c28Slarrybr set ::result [join $results " | "] 112b47e4c28Slarrybr} {dog,cat} 113b47e4c28Slarrybr 114b47e4c28Slarrybrdo_test 1.2 { 115b47e4c28Slarrybr set results {} 116b47e4c28Slarrybr set out [open $::fa wb] 117b47e4c28Slarrybr set ::tlo { "Just some text," "and more text," "ending at 3 lines." } 118b47e4c28Slarrybr puts $out [join $::tlo "\n"] 119b47e4c28Slarrybr close $out 120b47e4c28Slarrybr set adbSz [file size $::fa] 121b47e4c28Slarrybr sqlite3 adb "file:$::fa?mode=rwc$::vf" -uri 1 122b47e4c28Slarrybr adb eval { 123bc3c4e08Sdan PRAGMA auto_vacuum = 0; 124b47e4c28Slarrybr PRAGMA page_size=512; 125b47e4c28Slarrybr PRAGMA cache_size=0; 126b47e4c28Slarrybr CREATE TABLE t1(a TEXT); 127b47e4c28Slarrybr INSERT INTO t1 VALUES ('dog'),('cat'),('pig'); 128b47e4c28Slarrybr SELECT group_concat(a) as pets FROM (SELECT a FROM t1 ORDER BY a); 129b47e4c28Slarrybr } { lappend results $pets } 130b47e4c28Slarrybr adb close 131b47e4c28Slarrybr set adaSz [file size $::fa] 132b47e4c28Slarrybr lappend results "Bytes before/after $adbSz/$adaSz" 133b47e4c28Slarrybr set ::result [join $results " | "] 134b47e4c28Slarrybr} {cat,dog,pig | Bytes before/after 50/5145} 135b47e4c28Slarrybr 136b47e4c28Slarrybrdo_test 1.3 { 137b47e4c28Slarrybr set results {} 138b47e4c28Slarrybr sqlite3 adb "file:$::fa?mode=rw$::vf" -uri 1 139b47e4c28Slarrybr adb eval { 140b47e4c28Slarrybr SELECT group_concat(a) as pets FROM (SELECT a FROM t1 ORDER BY a DESC); 141b47e4c28Slarrybr } { lappend results $pets } 142b47e4c28Slarrybr adb close 143b47e4c28Slarrybr set ::result [join $results " | "] 144ddf49720Slarrybr} {pig,dog,cat} 145ddf49720Slarrybr 146ddf49720Slarrybrdo_test 1.4 { 147ddf49720Slarrybr set ::result [fosAvfs $fa] 148ddf49720Slarrybr} {4096} 149b47e4c28Slarrybr 150b47e4c28Slarrybrdo_test 2.1 { 151b47e4c28Slarrybr set in [open $::fa r] 152b47e4c28Slarrybr set tli {} 153b47e4c28Slarrybr for {set i [llength $::tlo]} {$i > 0} {incr i -1} { 154b47e4c28Slarrybr lappend tli [gets $in] 155b47e4c28Slarrybr } 156b47e4c28Slarrybr close $in 157b47e4c28Slarrybr if { [join $tli ":"] ne [join $::tlo ":"] } { 158b47e4c28Slarrybr set ::result "Appendee changed." 159b47e4c28Slarrybr } else { 160b47e4c28Slarrybr set ::result "Appendee intact." 161b47e4c28Slarrybr } 162b47e4c28Slarrybr} {Appendee intact.} 163b47e4c28Slarrybr 164b47e4c28Slarrybr# Set of repeatable random integers for a couple tests. 165*5cad178bSlarrybrset ::nrint 50000 166b47e4c28Slarrybrproc rint {v} { 167b47e4c28Slarrybr return [::tcl::mathfunc::int [expr $v * 100000]] 168b47e4c28Slarrybr} 169b47e4c28Slarrybrarray set ::randints [list 0 [rint [::tcl::mathfunc::srand 0]]] 170*5cad178bSlarrybrfor {set i 1} {$i < $::nrint} {incr i} { 171b47e4c28Slarrybr set ::randints($i) [rint [::tcl::mathfunc::rand]] 172b47e4c28Slarrybr} 173b47e4c28Slarrybr 174b47e4c28Slarrybrdo_test 3.1 { 175b47e4c28Slarrybr set results {} 176b47e4c28Slarrybr sqlite3 adb "file:$::fa?mode=rw$::vf" -uri 1 177b47e4c28Slarrybr adb eval { 178b47e4c28Slarrybr DROP TABLE t1; 179b47e4c28Slarrybr PRAGMA cache_size=10; 180b47e4c28Slarrybr CREATE TABLE ri (i INTEGER); 181b47e4c28Slarrybr BEGIN; 182b47e4c28Slarrybr } 183*5cad178bSlarrybr for {set i 0} {$i < $::nrint} {incr i} { 184b47e4c28Slarrybr set r $::randints($i) 185b47e4c28Slarrybr set s $::randints([incr i]) 186b47e4c28Slarrybr set t $::randints([incr i]) 187b47e4c28Slarrybr set u $::randints([incr i]) 188b47e4c28Slarrybr set v $::randints([incr i]) 189b47e4c28Slarrybr adb eval { 190b47e4c28Slarrybr INSERT INTO ri VALUES ($r),($s),($t),($u),($v) 191b47e4c28Slarrybr } 192b47e4c28Slarrybr } 193b47e4c28Slarrybr adb eval { 194b47e4c28Slarrybr COMMIT; 195b47e4c28Slarrybr SELECT integrity_check as ic FROM pragma_integrity_check(); 196b47e4c28Slarrybr } { lappend results $ic } 197b47e4c28Slarrybr set adbSz [file size $::fa] 198b47e4c28Slarrybr set qr {} 199b47e4c28Slarrybr adb eval { 200b47e4c28Slarrybr SELECT count(*) as ic FROM ri; 201b47e4c28Slarrybr DELETE FROM ri WHERE (i % 50) <> 25; 202b47e4c28Slarrybr SELECT integrity_check as ic FROM pragma_integrity_check(); 203b47e4c28Slarrybr VACUUM; 204b47e4c28Slarrybr SELECT integrity_check as ic FROM pragma_integrity_check(); 205b47e4c28Slarrybr SELECT count(*) as ic FROM ri; 206b47e4c28Slarrybr } { lappend qr $ic } 207b47e4c28Slarrybr adb close 208b47e4c28Slarrybr set adaSz [file size $::fa] 209b47e4c28Slarrybr set adba [expr ($adbSz + 0.1)/$adaSz] 210*5cad178bSlarrybr # lappend results $adba 211b47e4c28Slarrybr set results [concat $results [lrange $qr 0 2]] 212*5cad178bSlarrybr lappend results [expr {$adba > 10.0}] 213b47e4c28Slarrybr set ::result [join $results " | "] 214*5cad178bSlarrybr} "ok | $::nrint | ok | ok | 1" 215b47e4c28Slarrybr 216b47e4c28Slarrybrdo_test 3.2 { 217b47e4c28Slarrybr set results {} 218b47e4c28Slarrybr sqlite3 adb "file:$::fa?mode=rw$::vf" -uri 1 219b47e4c28Slarrybr adb eval { 220b47e4c28Slarrybr SELECT integrity_check as ic FROM pragma_integrity_check(); 221b47e4c28Slarrybr } { lappend results $ic } 222b47e4c28Slarrybr adb close 223b47e4c28Slarrybr set ::result [join $results " | "] 224b47e4c28Slarrybr} {ok} 225b47e4c28Slarrybr 226*5cad178bSlarrybr# avfs-3.3. Test that appendvfs can grow by many pages and be written. 227*5cad178bSlarrybrdo_test 3.3 { 228*5cad178bSlarrybr set results {} 229*5cad178bSlarrybr sqlite3 adb "file:$::fa?mode=rw$::vf" -uri 1 230*5cad178bSlarrybr set npages 300 231*5cad178bSlarrybr adb eval { BEGIN } 232*5cad178bSlarrybr while {$npages > 0} { 233*5cad178bSlarrybr adb eval { INSERT INTO ri VALUES (randomblob(1500)) } 234*5cad178bSlarrybr incr npages -1 235*5cad178bSlarrybr } 236*5cad178bSlarrybr adb eval { COMMIT } 237*5cad178bSlarrybr adb eval { 238*5cad178bSlarrybr SELECT integrity_check as ic FROM pragma_integrity_check(); 239*5cad178bSlarrybr } { lappend results $ic } 240*5cad178bSlarrybr adb close 241*5cad178bSlarrybr set adaSzr [expr [file size $::fa] / 300.0 / 1500 ] 242*5cad178bSlarrybr set okSzr [expr $adaSzr > 1.0 && $adaSzr < 1.3 ] 243*5cad178bSlarrybr lappend results $okSzr 244*5cad178bSlarrybr set ::result [join $results " | "] 245*5cad178bSlarrybr} {ok | 1} 246*5cad178bSlarrybr 247*5cad178bSlarrybr# avfs-3.4. Test that grown appendvfs can be reopened and appear intact. 248*5cad178bSlarrybrdo_test 3.4 { 249*5cad178bSlarrybr set results {} 250*5cad178bSlarrybr sqlite3 adb "file:$::fa?mode=rw$::vf" -uri 1 251*5cad178bSlarrybr adb eval { 252*5cad178bSlarrybr SELECT integrity_check as ic FROM pragma_integrity_check(); 253*5cad178bSlarrybr } { lappend results $ic } 254*5cad178bSlarrybr adb close 255*5cad178bSlarrybr set ::result $ic 256*5cad178bSlarrybr} {ok} 257*5cad178bSlarrybr 258*5cad178bSlarrybr# avfs-3.5. Test that much grown appendvfs can shrink and reopen intact. 259*5cad178bSlarrybrdo_test 3.5 { 260*5cad178bSlarrybr set results {} 261*5cad178bSlarrybr set adbsz [file size $::fa] 262*5cad178bSlarrybr sqlite3 adb "file:$::fa?mode=rw$::vf" -uri 1 263*5cad178bSlarrybr adb eval { 264*5cad178bSlarrybr DELETE FROM ri WHERE rowid % 8 <> 0; 265*5cad178bSlarrybr SELECT integrity_check as ic FROM pragma_integrity_check(); 266*5cad178bSlarrybr VACUUM; 267*5cad178bSlarrybr SELECT integrity_check as ic FROM pragma_integrity_check(); 268*5cad178bSlarrybr } { lappend results $ic } 269*5cad178bSlarrybr adb close 270*5cad178bSlarrybr set adasz [file size $::fa] 271*5cad178bSlarrybr lappend results [expr {$adbsz/$adasz > 5}] 272*5cad178bSlarrybr sqlite3 adb "file:$::fa?mode=rw$::vf" -uri 1 273*5cad178bSlarrybr adb eval { 274*5cad178bSlarrybr SELECT integrity_check as ic FROM pragma_integrity_check(); 275*5cad178bSlarrybr } { lappend results $ic } 276*5cad178bSlarrybr adb close 277*5cad178bSlarrybr set ::result [join $results " | "] 278*5cad178bSlarrybr} {ok | ok | 1 | ok} 279*5cad178bSlarrybr 280c5edbd1cSlarrybrset ::cliDoesAr [shellDoesAr] 281c5edbd1cSlarrybr 282b47e4c28Slarrybrdo_test 4.1 { 283b47e4c28Slarrybr set shdo "sh_app1.sql" 284b47e4c28Slarrybr set shod "sh_app1.adb" 285b47e4c28Slarrybr forcedelete $shdo $shod 286b47e4c28Slarrybr set ofd [open $shdo w] 287c5edbd1cSlarrybr if {$::cliDoesAr} { 288b47e4c28Slarrybr puts $ofd ".ar -c" 289c5edbd1cSlarrybr } else { 290c5edbd1cSlarrybr puts $ofd "pragma page_size=512;" 291c5edbd1cSlarrybr puts $ofd "create table sqlar (a);" 292c5edbd1cSlarrybr } 293b47e4c28Slarrybr puts $ofd ".tables" 294b47e4c28Slarrybr puts $ofd ".q" 295b47e4c28Slarrybr close $ofd 296b47e4c28Slarrybr set ofd [open $shod wb] 297b47e4c28Slarrybr puts $ofd "Some text." 298b47e4c28Slarrybr close $ofd 299b47e4c28Slarrybr set res [catchcmd "-append -batch -init $shdo $shod" ""] 300b47e4c28Slarrybr lappend res [fosAvfs $shod] 301b47e4c28Slarrybr forcedelete $shdo $shod 302b47e4c28Slarrybr set ::result [join $res " | "] 303b47e4c28Slarrybr} {0 | sqlar | 4096} 304b47e4c28Slarrybr 305b47e4c28Slarrybrdo_test 4.2 { 306b47e4c28Slarrybr set shdo "sh_app1.sql" 307b47e4c28Slarrybr set shod "sh_app1.adb" 308b47e4c28Slarrybr forcedelete $shdo $shod 309b47e4c28Slarrybr set ofd [open $shdo w] 310c5edbd1cSlarrybr if {$::cliDoesAr} { 311b47e4c28Slarrybr puts $ofd ".ar -c" 312c5edbd1cSlarrybr } else { 313c5edbd1cSlarrybr puts $ofd "pragma page_size=512;" 314c5edbd1cSlarrybr puts $ofd "create table sqlar (a);" 315c5edbd1cSlarrybr } 316b47e4c28Slarrybr puts $ofd ".tables" 317b47e4c28Slarrybr puts $ofd ".q" 318b47e4c28Slarrybr close $ofd 319b47e4c28Slarrybr set ofd [open $shod wb] 320b47e4c28Slarrybr close $ofd 321b47e4c28Slarrybr set res [catchcmd "-append -batch -init $shdo $shod" ""] 322b47e4c28Slarrybr lappend res [fosAvfs $shod] 323b47e4c28Slarrybr forcedelete $shdo ; # Leave $shod for next test. 324b47e4c28Slarrybr set ::result [join $res " | "] 325b47e4c28Slarrybr} {0 | sqlar | 0} 326b47e4c28Slarrybr 327b47e4c28Slarrybrdo_test 4.3 { 328b47e4c28Slarrybr set shdo "sh_app1.sql" 329b47e4c28Slarrybr set shod "sh_app1.adb" ; # Same as test 4.2, reusing ADB. 330b47e4c28Slarrybr forcedelete $shdo 331b47e4c28Slarrybr set ofd [open $shdo w] 332c5edbd1cSlarrybr if {$::cliDoesAr} { 333b47e4c28Slarrybr puts $ofd ".ar -u $shdo" 334b47e4c28Slarrybr puts $ofd "select count(*) from sqlar where name = '$shdo';" 335c5edbd1cSlarrybr } else { 336c5edbd1cSlarrybr puts $ofd "insert into sqlar values (1);" 337c5edbd1cSlarrybr puts $ofd "select count(*) from sqlar;" 338c5edbd1cSlarrybr } 339b47e4c28Slarrybr puts $ofd ".q" 340b47e4c28Slarrybr close $ofd 341b47e4c28Slarrybr set res [catchcmd "-append -batch -init $shdo $shod" ""] 342b47e4c28Slarrybr sqlite3 adb "file:$shod?mode=rw$::vf" -uri 1 343b47e4c28Slarrybr adb eval { 344b47e4c28Slarrybr SELECT count(*) as n FROM sqlar 345b47e4c28Slarrybr } { lappend res $n } 346b47e4c28Slarrybr adb close 347b47e4c28Slarrybr forcedelete $shdo $shod; 348b47e4c28Slarrybr set ::result [join $res " | "] 349b47e4c28Slarrybr} {0 | 1 | 1} 350b47e4c28Slarrybr 351ddf49720Slarrybrdo_test 5.1 { 352ddf49720Slarrybr set fake "faketiny.sdb" 353ddf49720Slarrybr forcedelete $fake 354ddf49720Slarrybr set ofd [open $fake wb] 355ddf49720Slarrybr puts -nonewline $ofd "SQLite format 3" 356ddf49720Slarrybr puts -nonewline $ofd [binary format "c" 0] 357ddf49720Slarrybr puts -nonewline $ofd "Start-Of-SQLite3-" 358ddf49720Slarrybr puts -nonewline $ofd [binary format "W" 0] 359ddf49720Slarrybr close $ofd 360ddf49720Slarrybr if {[catch {sqlite3 adb "file:$fake?mode=rw$::vf" -uri 1}]} { 361ddf49720Slarrybr set res "Open failed." 362ddf49720Slarrybr } else { 363ddf49720Slarrybr adb close 364ddf49720Slarrybr set res "Opened when should not." 365ddf49720Slarrybr } 366ddf49720Slarrybr forcedelete $fake 367ddf49720Slarrybr set ::result $res 368ddf49720Slarrybr} {Open failed.} 369ddf49720Slarrybr 370ddf49720Slarrybrdo_test 5.2 { 371ddf49720Slarrybr set fake "faketiny.sdb" 372ddf49720Slarrybr forcedelete $fake 373ddf49720Slarrybr set ofd [open $fake wb] 374ddf49720Slarrybr set fakeAppendee "Dog ate my homework.\n" 375ddf49720Slarrybr puts -nonewline $ofd $fakeAppendee 376ddf49720Slarrybr puts -nonewline $ofd "SQLite format 3" 377ddf49720Slarrybr puts -nonewline $ofd [binary format "c" 0] 378ddf49720Slarrybr puts -nonewline $ofd "Start-Of-SQLite3-" 379ddf49720Slarrybr puts -nonewline $ofd [binary format "W" [string length $fakeAppendee]] 380ddf49720Slarrybr close $ofd 381ddf49720Slarrybr if {[catch {sqlite3 adb "file:$fake?mode=rw$::vf" -uri 1}]} { 382ddf49720Slarrybr set res "Open failed." 383ddf49720Slarrybr } else { 384ddf49720Slarrybr adb close 385ddf49720Slarrybr set res "Opened when should not." 386ddf49720Slarrybr } 387ddf49720Slarrybr forcedelete $fake 388ddf49720Slarrybr set ::result $res 389ddf49720Slarrybr} {Open failed.} 390ddf49720Slarrybr 391b47e4c28Slarrybrforcedelete $::fa $::fza 392b47e4c28Slarrybr 393*5cad178bSlarrybrunset -nocomplain ::fa ::fza ::tlo ::result ::randints ::nrint ::cliDoesAr 394b47e4c28Slarrybr 395b47e4c28Slarrybrfinish_test 396