Ping: Re: testcase for "absolute source" patch

Baurzhan Ismagulov baurzhan.ismagulov@sbs.com.tr
Fri Oct 15 14:51:00 GMT 2004


Hello Michael,

On Tue, Oct 12, 2004 at 09:37:07AM -0400, Michael Chastain wrote:
> These would make good comments to add to the test script.
...
> Okay, I am looking at gdb.log and there is not enough trace information
> about what directory is being tested.

Added.


> I'm getting four FAIL results with gdb HEAD:
> 
>   gdb.base/openp.exp: openp s1-da (non-existent source, basename, find in <dir>/$cdir/basename)
>   gdb.base/openp.exp: openp s3-da (non-existent source, relative name, find in <dir>/$cdir/relative)
>   gdb.base/openp.exp: openp s4-da (non-existent source, in the current dir, find in <dir>/$cdir/basename)
>   gdb.base/openp.exp: openp s5-da (non-existent source, in the upper dir, find in <dir>/$cdir/relative)
> 
> Are these bugs in gdb or problems with the test script?

These are cases I was not sure about and asked for help in
http://sources.redhat.com/ml/gdb-patches/2004-08/msg00539.html . At the
moment, gdb performs the following sequence while looking for a source
file in case s1-da (compiled in $cdir as basename, <dir> in source path
(i.e., "directory <dir>" has been previously executed), we are in $cwd):

1. try basename;

2. try <dir>/basename;

3. fail.

The question is, should gdb try <dir>/$cdir/basename after step 2? This
is not implemented right now, but could help people compiling the
sources as basename in each directory (i.e., they call make recursively
and do "gcc foo.c" without a path) and having the compilation tree under
some directory on the gdb host (which, I think, was the idea behind the
"directory" command).

As the file opening mechanism gets more and more complex, we should have
a clear policy what we do and what we don't. That is why I wanted to
hear others' opinions. If you say "no, we shouldn't append $cdir after
<dir>", then I convert these FAILs into PASSes.


With kind regards,
Baurjan.


2004-10-15  Baurjan Ismagulov  <ibr@ata.cs.hun.edu.tr>

	* gdb.base/openp.c: New testcase.
	* gdb.base/openp.exp: New testcase checking for source, binary
	and compilation directory handling.
-------------- next part --------------
#   Copyright (C) 2004 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# This file was written by Baurjan Ismagulov <ibr@ata.cs.hun.edu.tr>.
# $Id: openp.exp,v 1.8 2004/10/15 13:58:28 ibr Exp $

# This file tests whether gdb finds the files properly given the
# following file names:
# 1. basename:   file
# 2. absolute:   /dir/file
# 3. relative:   dir/file
# 4. in current: ./file
# 5. in upper:   ../file

# This is checked for binaries as well as for sources. To do that, we
# place them in some specific locations, such as compilation directory,
# $PATH, gdb source path ("directory" command), etc. As the files from
# the previous tests could interfere with the test currently running
# (sometimes we expect gdb to find a file, sometimes -- not), we define
# a certain state of files and directories as canonical, move the files
# around before each test, and move them back thereafter.


# Resolve possibe /./ and /../ within the given path. We are paranoid
# about cases like "mkdir -p a/../b" (although GNU coreutils and Solaris
# 8 seem to handle this particular case).
# XXX: Can this be replaced with tcl path manipulation routines?
proc canonize_path {dir} {
    set old_dir [pwd]
    cd $dir
    set new_dir [pwd]
    cd $old_dir
    return $new_dir
}

# Compile $src to $bin in $cdir.
# XXX: build == host.
proc cdir_compile {cdir src bin} {
    if [catch {set old_dir [pwd]} msg] {
	perror $msg
	return -1
    }
    if [catch {cd $cdir} msg] {
	perror $msg
	return -1
    }
    if {[gdb_compile $src $bin executable debug] != ""} {
	perror "Testcase compile failed."
	return -1
    }
    if [catch {cd $old_dir} msg] {
	perror $msg
	return -1
    }
    return 0
}

# Move the binary to $bin_dir, add $path_dir to PATH, gdb_test in the
# $gdb_wd directory.
# XXX: build == host.
proc test_bin {gdb_wd bin_dir path_dir gdb_test_cmd gdb_resp txt} {
    global binname
    global binfile
    global env
    if {$bin_dir != ""} {
	if {[lindex [remote_exec host "mv $binfile $bin_dir"] 0] != 0} {
	    unresolved "Failed to move $binfile to $bin_dir."
	    return -1
	}
	set our_bin $bin_dir/$binname
    } else {
	set our_bin $binfile
    }
    if {$path_dir != "" && [info exists env(PATH)]} {
	if [catch {set old_path $env(PATH)} msg] {
	    perror $msg
	    return -1
	}
	# XXX: Directory separator in PATH?
	if [catch {set env(PATH) $env(PATH):$path_dir} msg] {
	    perror $msg
	    return -1
	}
    }
    if [catch {set old_dir [pwd]} msg] {
	perror $msg
	return -1
    }
    if [catch {cd $gdb_wd} msg] {
	perror $msg
	return -1
    }
    pass "test_bin: We are in $gdb_wd, our binary is $our_bin, and we've added \"$path_dir\" to PATH."
    gdb_start
    gdb_test $gdb_test_cmd $gdb_resp $txt
    gdb_exit
    if [catch {cd $old_dir} msg] {
	perror $msg
	return -1
    }
    if [info exists old_path] {
	if [catch {set env(PATH) $old_path} msg] {
	    perror $msg
	    return -1
	}
    }
    if {$bin_dir != ""} {
	if {[lindex [remote_exec host "mv $bin_dir/$binname $binfile"] 0] != 0} {
	    unresolved "Failed to move $bin_dir/$binname to $binfile."
	    return -1
	}
    }
    return 0
}

# Compile in $comp_dir, move the source to $srcfile_dir, perform $cmd1
# and $cmd2, gdb_test in $gdb_wd.
# XXX: build == host.
proc test_src {comp_dir comp_srcfile comp_binfile srcfile_dir
	       gdb_wd cmd1 cmd2 gdb_test_cmd gdb_resp txt} {
    global srcname
    global srcfile

    if [catch {set old_dir [pwd]} msg] {
	perror $msg
	return -1
    }
    if {[cdir_compile $comp_dir $comp_srcfile $comp_binfile] != 0} {
	unresolved "Failed to compile $comp_srcfile to $comp_binfile in $comp_dir."
	return -1
    }
    if {$srcfile_dir != ""} {
	if {[lindex [remote_exec host "mv $srcfile $srcfile_dir"] 0] != 0} {
	    unresolved "Failed to move $srcfile to $srcfile_dir."
	    return -1
	}
	set our_src $srcfile_dir/$srcname
    } else {
	set our_src $srcfile
    }
    if [catch {cd $gdb_wd} msg] {
	perror $msg
	return -1
    }
    pass "test_src: We are in $gdb_wd, our source is $our_src and was compiled under $comp_dir as $comp_srcfile."
    gdb_start
    if {$cmd1 != ""} {
	gdb_test $cmd1 ""
    }
    if {$cmd2 != ""} {
	gdb_test $cmd2 ""
    }
    gdb_test $gdb_test_cmd $gdb_resp $txt
    gdb_exit
    if [catch {cd $old_dir} msg] {
	perror $msg
	return -1
    }
    if {$srcfile_dir != ""} {
	if {[lindex [remote_exec host "mv $srcfile_dir/$srcname $srcfile"] 0] != 0} {
	    unresolved "Failed to move $srcfile_dir/$srcname to $srcfile."
	    return -1
	}
    }
    return 0
}


if {[is_remote host]} {
    unresolved "This test script does not work on a remote host."
    return -1
}

if $tracelevel then {
    strace $tracelevel
}

set prms_id 0
set bug_id 0

set testname "openp"
set srcname $testname.c
set binname $testname.bin
set testtmpdir [canonize_path $objdir/$subdir]/$testname
set srcfile $testtmpdir/subdir/src/$srcname
set binfile $testtmpdir/subdir/bin/$binname

set src_txt {1.int main\(\){return 0;}.*}

if {[lindex [remote_exec host "mkdir -p \
$testtmpdir/subdir/src/subdir \
$testtmpdir/subdir/bin/subdir \
$testtmpdir/subdir/cwd/bin \
$testtmpdir/subdir/cwd/src \
$testtmpdir/subdir/dir$testtmpdir/subdir/src/subdir \
$testtmpdir/subdir/dir$testtmpdir/subdir/bin \
$testtmpdir/subdir/dir/src"] 0] != 0} {
    unresolved "Failed to create the directories under $testtmpdir/subdir."
    return -1
}
if {[lindex [remote_exec host "cp $srcdir/$subdir/$testname.c $srcfile"] 0] != 0} {
    unresolved "Failed to copy $srcdir/$subdir/$testname.c to $srcfile."
    return -1
}
if {[cdir_compile $testtmpdir $srcfile $binfile] != 0} {
    unresolved "Failed to compile $srcfile to $binfile in $testtmpdir."
    return -1
}
gdb_exit

# At this point our canonical environment is ready. The binary is in
# $binfile. It can be moved by some test if necessary, but must be moved
# back after the test; leaving it where it was during the test may cause
# false passes or failures in the next tests. Since we test where gdb
# should find or not find a given file, we should have exactly one
# binary for the binary tests, otherwise we cannot be sure which one was
# found by gdb.

# Likewise, the source is in $srcfile, and we should have exactly one
# source for the source tests. The binaries are compiled by every test
# and deleted afterwards.


# b1+
test_bin $testtmpdir/subdir/bin \
    "" \
    "" \
    "file $binname" \
    "Reading symbols from $binfile\\.\\.\\.done\\..*" \
    "openp b1+ (existing binary, basename)"

# b1-
test_bin $testtmpdir/subdir/cwd \
    "" \
    $testtmpdir/subdir/bin \
    "file $binname" \
    "Reading symbols from $binfile\\.\\.\\..*done\\..*" \
    "openp b1- (non-existent binary, basename, find in PATH)"

# b2+
test_bin $testtmpdir/subdir/cwd \
    "" \
    "" \
    "file $binfile" \
    "Reading symbols from $binfile\\.\\.\\.done\\..*" \
    "openp b2+ (existing binary, absolute name)"

# b2-a
# XXX: Should we match locale-specific messages?
test_bin $testtmpdir/subdir/cwd \
    $testtmpdir/subdir/dir$testtmpdir/subdir/bin \
    $testtmpdir/subdir/dir \
    "file $binfile" \
    "$binfile: .*" \
    "openp b2-a (non-existent binary, absolute name, don't look in <PATH_dir>/absolute)"

# b2-
# XXX: Should we match locale-specific messages?
test_bin $testtmpdir/subdir/cwd \
    $testtmpdir/subdir/dir \
    $testtmpdir/subdir/dir \
    "file $binfile" \
    "$binfile: .*" \
    "openp b2- (non-existent binary, absolute name, don't look for <PATH_dir>/basename)"

# b3+
test_bin $testtmpdir/subdir \
    "" \
    "" \
    "file bin/$binname" \
    "Reading symbols from $binfile\\.\\.\\.done\\..*" \
    "openp b3+ (existing binary, relative name)"

# b3-r
# XXX: locale
test_bin $testtmpdir/subdir/cwd \
    "" \
    $testtmpdir/subdir \
    "file bin/$binname" \
    "bin/$binname: .*" \
    "openp b3-r (non-existent binary, relative name, don't look in <PATH_dir>/relative)"

# b3-
# XXX: locale
test_bin $testtmpdir/subdir/cwd \
    "" \
    $testtmpdir/subdir/bin \
    "file bin/$binname" \
    "bin/$binname: .*" \
    "openp b3- (non-existent binary, relative name, don't look in <PATH_dir>/basename)"

# b4+
test_bin $testtmpdir/subdir/bin \
    "" \
    "" \
    "file ./$binname" \
    "Reading symbols from $binfile\\.\\.\\.done\\..*" \
    "openp b4+ (existing binary, in the current dir)"

# b4-
# XXX: locale
test_bin $testtmpdir/subdir/cwd \
    "" \
    $testtmpdir/subdir/bin \
    "file ./$binname" \
    "\\./$binname: .*" \
    "openp b4- (non-existent binary, in the current dir, don't look in PATH)"

# b5+
test_bin $testtmpdir/subdir/bin/subdir \
    "" \
    "" \
    "file ../$binname" \
    "Reading symbols from $binfile\\.\\.\\.done\\..*" \
    "openp b5+ (existing binary, in the upper dir)"

# b5-r
# XXX: locale
test_bin $testtmpdir/subdir/cwd \
    "" \
    $testtmpdir/subdir/bin/subdir \
    "file ../$binname" \
    "\\.\\./$binname: .*" \
    "openp b5-r (non-existent binary, in the upper dir name, don't look in <PATH_dir>/relative)"

# b5-
# XXX: locale
test_bin $testtmpdir/subdir/cwd \
    "" \
    $testtmpdir/subdir/bin \
    "file ../$binname" \
    "\\.\\./$binname: .*" \
    "openp b5- (non-existent binary, in the upper dir name, don't look in <PATH_dir>/basename)"


# s1+
test_src $testtmpdir/subdir/src $srcname $binfile \
    "" \
    $testtmpdir/subdir/cwd \
    "file $binfile" "" \
    "l main" \
    $src_txt \
    "openp s1+ (existing source, basename)"

# s1-.
test_src $testtmpdir/subdir/src $srcname $binfile \
    $testtmpdir/subdir/cwd \
    $testtmpdir/subdir/cwd \
    "file $binfile" "" \
    "l main" \
    $src_txt \
    "openp s1-. (non-existent source, basename, find in \$cwd/basename)"

# s1-da
test_src $testtmpdir/subdir/src $srcname $binfile \
    $testtmpdir/subdir/dir$testtmpdir/subdir/src \
    $testtmpdir/subdir/cwd \
    "dir $testtmpdir/subdir/dir" "file $binfile" \
    "l main" \
    $src_txt \
    "openp s1-da (non-existent source, basename, find in <dir>/\$cdir/basename)"

# s1-d
test_src $testtmpdir/subdir/src $srcname $binfile \
    $testtmpdir/subdir/dir \
    $testtmpdir/subdir/cwd \
    "dir $testtmpdir/subdir/dir" "file $binfile" \
    "l main" \
    $src_txt \
    "openp s1-d (non-existent source, basename, find in <dir>/basename)"

# s2+
test_src $testtmpdir $srcfile $binfile \
    "" \
    $testtmpdir/subdir/cwd \
    "file $binfile" ""\
    "l main" \
    $src_txt \
    "openp s2+ (existing source, absolute name)"

# s2-.
test_src $testtmpdir $srcfile $binfile \
    $testtmpdir/subdir/cwd \
    $testtmpdir/subdir/cwd \
    "file $binfile" "" \
    "l main" \
    $src_txt \
    "openp s2-. (non-existent source, absolute name, find in \$cwd/basename)"

# s2-da
test_src $testtmpdir $srcfile $binfile \
    $testtmpdir/subdir/dir$testtmpdir/subdir/src \
    $testtmpdir/subdir/cwd \
    "dir $testtmpdir/subdir/dir" "file $binfile" \
    "l main" \
    $src_txt \
    "openp s2-da (non-existent source, absolute name, find in <dir>/absolute)"

# s2-d
test_src $testtmpdir $srcfile $binfile \
    $testtmpdir/subdir/dir \
    $testtmpdir/subdir/cwd \
    "dir $testtmpdir/subdir/dir" "file $binfile" \
    "l main" \
    $src_txt \
    "openp s2-d (non-existent source, absolute name, find in <dir>/basename)"

# s3+
test_src $testtmpdir/subdir src/$srcname $binfile \
    "" \
    $testtmpdir/subdir/cwd \
    "file $binfile" "" \
    "l main" \
    $src_txt \
    "openp s3+ (existing source, relative name)"

# s3-.r
test_src $testtmpdir/subdir src/$srcname $binfile \
    $testtmpdir/subdir/cwd/src \
    $testtmpdir/subdir/cwd \
    "file $binfile" "" \
    "l main" \
    $src_txt \
    "openp s3-.r (non-existent source, relative name, find in \$cwd/relative)"

# s3-c
test_src $testtmpdir/subdir src/$srcname $binfile \
    $testtmpdir/subdir \
    $testtmpdir/subdir/cwd \
    "file $binfile" "" \
    "l main" \
    $src_txt \
    "openp s3-c (non-existent source, relative name, find in \$cdir/basename)"

# s3-.
test_src $testtmpdir/subdir src/$srcname $binfile \
    $testtmpdir/subdir/cwd \
    $testtmpdir/subdir/cwd \
    "file $binfile" "" \
    "l main" \
    $src_txt \
    "openp s3-. (non-existent source, relative name, find in \$cwd/basename)"

# s3-da
test_src $testtmpdir/subdir src/$srcname $binfile \
    $testtmpdir/subdir/dir$testtmpdir/subdir \
    $testtmpdir/subdir/cwd \
    "dir $testtmpdir/subdir/dir" "file $binfile" \
    "l main" \
    $src_txt \
    "openp s3-da (non-existent source, relative name, find in <dir>/\$cdir/relative)"

# s3-dr
test_src $testtmpdir/subdir src/$srcname $binfile \
    $testtmpdir/subdir/dir/src \
    $testtmpdir/subdir/cwd \
    "dir $testtmpdir/subdir/dir" "file $binfile" \
    "l main" \
    $src_txt \
    "openp s3-dr (non-existent source, relative name, find in <dir>/relative)"

# s3-d
test_src $testtmpdir/subdir src/$srcname $binfile \
    $testtmpdir/subdir/dir \
    $testtmpdir/subdir/cwd \
    "dir $testtmpdir/subdir/dir" "file $binfile" \
    "l main" \
    $src_txt \
    "openp s3-d (non-existent source, relative name, find in <dir>/basename)"

# s4+
test_src $testtmpdir/subdir/src ./$srcname $binfile \
    "" \
    $testtmpdir/subdir/cwd \
    "file $binfile" "" \
    "l main" \
    $src_txt \
    "openp s4+ (existing source, in the current dir)"

# s4-.
test_src $testtmpdir/subdir/src ./$srcname $binfile \
    $testtmpdir/subdir/cwd \
    $testtmpdir/subdir/cwd \
    "file $binfile" "" \
    "l main" \
    $src_txt \
    "openp s4-. (non-existent source, in the current dir, find in \$cwd/basename)"

# s4-da
test_src $testtmpdir/subdir/src ./$srcname $binfile \
    $testtmpdir/subdir/dir$testtmpdir/subdir/src \
    $testtmpdir/subdir/cwd \
    "dir $testtmpdir/subdir/dir" "file $binfile" \
    "l main" \
    $src_txt \
    "openp s4-da (non-existent source, in the current dir, find in <dir>/\$cdir/basename)"

# s4-d
test_src $testtmpdir/subdir/src ./$srcname $binfile \
    $testtmpdir/subdir/dir \
    $testtmpdir/subdir/cwd \
    "dir $testtmpdir/subdir/dir" "file $binfile" \
    "l main" \
    $src_txt \
    "openp s4-d (non-existent source, in the current dir, find in <dir>/basename)"

# s5+
test_src $testtmpdir/subdir/src/subdir ../$srcname $binfile \
    "" \
    $testtmpdir/subdir/cwd \
    "file $binfile" "" \
    "l main" \
    $src_txt \
    "openp s5+ (existing source, in the upper dir)"

# s5-.r
test_src $testtmpdir/subdir/src/subdir ../$srcname $binfile \
    $testtmpdir/subdir \
    $testtmpdir/subdir/cwd \
    "file $binfile" "" \
    "l main" \
    $src_txt \
    "openp s5-.r (non-existent source, in the upper dir, find in \$cwd/relative)"

# s5-c
test_src $testtmpdir/subdir/src/subdir ../$srcname $binfile \
    $testtmpdir/subdir/src/subdir \
    $testtmpdir/subdir/cwd \
    "file $binfile" "" \
    "l main" \
    $src_txt \
    "openp s5-c (non-existent source, in the upper dir, find in \$cdir/basename)"

# s5-.
test_src $testtmpdir/subdir/src/subdir ../$srcname $binfile \
    $testtmpdir/subdir/cwd \
    $testtmpdir/subdir/cwd \
    "file $binfile" "" \
    "l main" \
    $src_txt \
    "openp s5-. (non-existent source, in the upper dir, find in \$cdir/basename)"

# s5-da
test_src $testtmpdir/subdir/src/subdir ../$srcname $binfile \
    $testtmpdir/subdir/dir$testtmpdir/subdir/src/subdir \
    $testtmpdir/subdir/cwd \
    "dir $testtmpdir/subdir/dir" "file $binfile" \
    "l main" \
    $src_txt \
    "openp s5-da (non-existent source, in the upper dir, find in <dir>/\$cdir/relative)"

# s5-dr
test_src $testtmpdir/subdir/src/subdir ../$srcname $binfile \
    $testtmpdir/subdir \
    $testtmpdir/subdir/cwd \
    "dir $testtmpdir/subdir/dir" "file $binfile" \
    "l main" \
    $src_txt \
    "openp s5-dr (non-existent source, in the upper dir, find in <dir>/relative)"

# s5-d
test_src $testtmpdir/subdir/src/subdir ../$srcname $binfile \
    $testtmpdir/subdir/dir \
    $testtmpdir/subdir/cwd \
    "dir $testtmpdir/subdir/dir" "file $binfile" \
    "l main" \
    $src_txt \
    "openp s5-d (non-existent source, in the upper dir, find in <dir>/basename)"
-------------- next part --------------
A non-text attachment was scrubbed...
Name: openp.c
Type: text/x-csrc
Size: 22 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/gdb-patches/attachments/20041015/fae65047/attachment.bin>


More information about the Gdb-patches mailing list