2 # Test
-specific TCL procedures required by DejaGNU.
3 # Copyright
(C
) 1994,2003,2004,2005,2006,2007 Free Software Foundation
, Inc.
5 # This
program is free software
: you can redistribute it and
/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation
, either version
3 of the License
, or
8 #
(at your option
) any later version.
10 # This
program is distributed in the hope that it will be useful
,
11 # but WITHOUT
ANY WARRANTY
; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License
for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this
program.
If not
, see
<http
://www.gnu.org
/licenses
/>.
19 # Modified by David MacKenzie
<djm@gnu.org
> from the gcc files
20 # written by Rob Savoye
<rob@cygnus.com
>.
23 # use the local version of find
for updatedb
25 # We normalise
(normalize
for those over the water
) pathnames
26 # because the updatedb
shell script uses
"cd", which means that
27 #
any relative paths no longer point where we thought they did.
28 # Because
"file normalize" requires tcl 8.4, we have a plan B
29 #
for normalising the
name of a directory
, but it is slower.
31 proc normalize_dir
{ dir } {
32 if [ catch
{ file normalize $
dir } result
] then {
33 return [ exec
/bin
/sh
-c
"cd $dir && /bin/pwd" ]
39 set fulldir
[ normalize_dir
"../../find" ]
40 set env
{find
} "$fulldir/find"
42 # use the local help commands
for updatedb
43 set env
(LIBEXECDIR
) [ normalize_dir ..
]
44 # use our local version of find
, too.
46 #
do not ignore
any file systems
for this test
54 set UPDATEDB
[findfile $base_dir
/..
/updatedb $base_dir
/..
/updatedb
[transform updatedb
]]
55 set FRCODE
[findfile $base_dir
/..
/frcode $base_dir
/..
/frcode
[transform frcode
]]
56 set LOCATE
[findfile $base_dir
/..
/locate $base_dir
/..
/locate
[transform locate
]]
57 set FIND
[findfile $base_dir
/..
/..
/find
/find $base_dir
/..
/..
/find
/find
[transform find
]]
58 verbose
"UPDATEDB is $UPDATEDB" 1
59 verbose
"FRCODE is $FRCODE" 1
60 verbose
"LOCATE is $LOCATE" 1
61 verbose
"FIND is $FIND" 1
64 foreach exe
"$UPDATEDB $FRCODE $LOCATE $FIND" {
65 if ![ string match
"/*" $exe ] {
66 error
"Failed to find a binary to test for $exe"
71 if ![info exists UPDATEDBFLAGS
] then {
78 if ![info exists LOCATEFLAGS
] then {
83 # Extract and print the version number of locate.
84 proc locate_version
{} {
90 if {[which $LOCATE
] != 0} then {
91 set tmp
[ eval exec $LOCATE $LOCATEFLAGS
--version
</dev
/null
]
92 regexp
"version.*$" $tmp version
93 if [info exists version
] then {
94 clone_output
"[which $LOCATE] $version\n"
96 warning
"cannot get version from $tmp."
99 warning
"$LOCATE, program does not exist"
104 # Run locate and leave the output in $comp_output.
105 # Called by individual test scripts.
106 proc locate_textonly
{ passfail id intext locateoptions outtext
} {
110 set fail_good
[string match
"f*" $passfail]
112 set scriptname
[uplevel
{info script
}]
113 set testbase
[file rootname $scriptname
]
114 set testname
[file tail $testbase
]
115 set listfile
"updatedb-paths.txt"
116 set dbfile
"locate.db"
117 set outfile "locate.out"
119 # Generate the
"frcode" input.
120 catch
{ file
delete -force $listfle
}
121 set f
[open $listfile w
]
126 exec $FRCODE
< $listfile
> $dbfile
129 set locatecmd
"$LOCATE -d $dbfile $locateoptions"
130 send_log
"Running $locatecmd \n"
131 catch
"exec $locatecmd > $outfile"
134 set f
[open
"$outfile" r]
135 while { [ gets $f line
] >= 0 } {
136 # send_log
"Output fragment is $line\n"
137 append result
"$line\n"
141 # send_log
"Output is $result\n"
143 if {[string equal $result $outtext
]} {
150 send_log
"Output mismatch.\n"
151 send_log
"Expected: $outtext\n"
152 send_log
"Got : $result\n"
158 #
Do a test in which we expect an input
text file to be preserved unchanged.
159 proc locate_roundtrip
{ id intext
} {
160 if ![regexp
"\n$" $intext] {
161 # We like the items to be terminated by newlines.
162 error
"The input text is not terminated by newline"
165 locate_textonly p $id $intext
"-r ." $intext
170 # Run locate and leave the output in $comp_output.
171 # Called by individual test scripts.
172 proc locate_start
{ passfail updatedb_options locate_options
173 {updatedb_infile
""} {locate_infile ""}
183 set fail_good
[string match
"f*" $passfail]
185 set scriptname
[uplevel
{info script
}]
186 set testbase
[file rootname $scriptname
]
187 set testname
[file tail $testbase
]
189 set outfile "$testbase.xo"
190 if {"$updatedb_infile" != ""} then {
191 set updatedb_infile
"[file dirname [file dirname $testbase]]/inputs/$updatedb_infile"
193 set updatedb_infile
/dev
/null
195 if {"$locate_infile" != ""} then {
196 set locate_infile
"[file dirname [file dirname $testbase]]/inputs/$locate_infile"
198 set locate_infile
/dev
/null
201 catch
"exec rm -f locate.out"
203 set updatedb_cmd
"$UPDATEDB $UPDATEDBFLAGS $updatedb_options < $updatedb_infile"
204 send_log
"$updatedb_cmd\n"
206 send_user
"Spawning \"$updatedb_cmd\"\n"
208 catch
"exec $updatedb_cmd" comp_output
210 if {$comp_output
!= ""} then {
211 send_log
"$comp_output\n"
213 send_user
"$comp_output\n"
215 #
If fail_good is
set, that refers to the exit
216 #
status of locate
, not updatedb...
217 fail
"$testname: updatedb is supposed to be silent, $comp_output"
220 send_log
"updatedb: OK.\n"
226 set locate_cmd
"$LOCATE $LOCATEFLAGS $locate_options < $locate_infile > locate.out"
227 send_log
"$locate_cmd\n"
229 send_user
"Spawning \"$locate_cmd\"\n"
232 catch
"exec $locate_cmd" comp_output
233 if {$comp_output
!= ""} then {
234 send_log
"$comp_output\n"
236 send_user
"$comp_output\n"
241 fail
"$testname: locate failed, $comp_output"
246 if [file
exists $
outfile] then {
247 set cmp_cmd
"cmp locate.out $outfile"
248 send_log
"$cmp_cmd\n"
249 catch
"exec $cmp_cmd" cmpout
250 if {$cmpout
!= ""} then {
251 #catch
"exec diff locate.out $outfile" diffout
253 fail
"$testname, $cmpout"
257 if {[file size locate.out
] != 0} then {
258 fail
"$testname, output should be empty"
263 catch
"exec rm -rf tmp"
268 proc locate_from_db
{ passfail locate_options locate_database
} {
273 set fail_good
[string match
"f*" $passfail]
274 set scriptname
[uplevel
{info script
}]
275 set testbase
[file rootname $scriptname
]
276 set testname
[file tail $testbase
]
277 set testdir
[file dirname $scriptname
]
279 set dbpath
"$testdir/$locate_database"
280 set outfile "$testbase.xo"
282 set locate_cmd
"$LOCATE $LOCATEFLAGS -d $dbpath $locate_options > locate.out"
283 send_log
"$locate_cmd\n"
285 send_user
"Spawning \"$locate_cmd\"\n"
288 catch
"exec $locate_cmd 2>/dev/null" comp_output
289 if {$comp_output
!= ""} then {
290 send_log
"$comp_output\n"
292 send_user
"$comp_output\n"
295 # XXX
: in general may want to compare output
, too.
298 fail
"$testname: locate unfortunately failed, $comp_output"
304 if [file
exists $
outfile] then {
305 set cmp_cmd
"cmp locate.out $outfile"
306 send_log
"$cmp_cmd\n"
307 catch
"exec $cmp_cmd" cmpout
308 if {$cmpout
!= ""} then {
309 #catch
"exec diff locate.out $outfile" diffout
311 fail
"$testname, $cmpout"
315 if {[file size locate.out
] != 0} then {
316 fail
"$testname, output should be empty"
328 # Clean up
(remove temporary files
) before runtest exits.
329 proc locate_exit
{} {
330 catch
"exec rm -f locate.out updatedb-paths.txt locate.db"
334 # Extract and print the version number of updatedb.
335 proc updatedb_version
{} {
339 if {[which $UPDATEDB
] != 0} then {
340 set tmp
[ eval exec $UPDATEDB $UPDATEDBFLAGS
--version
</dev
/null
]
341 regexp
"version.*$" $tmp version
342 if [info exists version
] then {
343 clone_output
"[which $UPDATEDB] $version\n"
345 warning
"cannot get version from $tmp."
348 warning
"$UPDATEDB, program does not exist"