# # filelock.test -- # nca-073-9 # # Copyright (c) 1996-2000 by Netcetera AG. # Copyright (c) 2001 by Apache Software Foundation. # All rights reserved. # # See the file "license.terms" for information on usage and # redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # @(#) $Id$ # # ----------------------------------------------------------------------------- # tcltest package # ----------------------------------------------------------------------------- if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest namespace import ::tcltest::* } web::tempfile -remove # ----------------------------------------------------------------------------- # truncatefile # ----------------------------------------------------------------------------- test truncatefile-1.1 {create file, truncate it, and test size} { set fh [open [set fn [web::tempfile]] w] puts -nonewline $fh [string repeat "a" 10000] flush $fh set res [file size $fn] web::truncatefile $fh close $fh lappend res [file size $fn] } {10000 0} test truncatefile-1.2 {wrong args} { catch { web::truncatefile } msg set msg } {wrong # args: should be "web::truncatefile channel"} set fn [web::tempfile] test truncatefile-1.3 {called with a file name} { catch { web::truncatefile $fn } msg set msg } "can not find channel named \"$fn\"" # ----------------------------------------------------------------------------- # test the actual locking # ----------------------------------------------------------------------------- set processes 10 set tests 100 set expect [expr $processes * $tests] test filelock-1.3 {test file locking (mulitple processes)} {unixOnly} { set script locktest.tcl set seqno locktest.SEQNO # temporary test script set fh [open $script "w"] global argv0 puts $fh "#![info nameofexecutable]" puts $fh {set c [lindex $argv 0]} puts $fh {puts "starting [pid] for $c"} puts $fh "if {\$c < $processes} {exec \$argv0 \[incr c\] &}" puts $fh "web::filecounter idgen -filename $seqno -seed 0 -incr 1" puts $fh "for {set i 0} {\$i < $tests} {incr i} {" puts $fh " set a \[idgen nextval\]" puts $fh "}" close $fh file attributes $script -permissions 0755 ## re-open/truncate hack (advisory lock) set fh [open $seqno {CREAT WRONLY}] web::lockfile $fh flush $fh set fh2 [open $seqno {CREAT WRONLY TRUNC}] close $fh2 seek $fh 0 start puts $fh "0" web::unlockfile $fh close $fh # exec some concurrent processes (script is recursive) puts "testing file locking: $processes concurrent processes with $tests file locks each" puts -nonewline "(this may take a while...) " flush stdout exec "./$script" 1 # test result web::readfile $seqno result # cleanup file delete -force -- $script $seqno puts "done" set result } "$expect " unset processes tests expect # cleanup ::tcltest::cleanupTests