old-cross-binutils/binutils/testsuite/binutils-all/ar.exp
Nick Clifton 9bc24099c8 If the binutils testsuite is run on an installed toolchain the tests involving
the bfdtest1 and bfdtest2 executables will fail because they are not installed.
 Since the programs only exist to be used by the testsuite it does not make sense
to install them, so instead I have chosen to create a patch which skips the tests
when they are not present.

	* binutils-all/ar.exp: Skip tests involving bfdtest1 and bfdtest2
	if these executables are not present.
2014-06-03 08:40:39 +01:00

582 lines
13 KiB
Text

# Copyright (C) 1995-2014 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 3 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
# Please email any bugs, comments, and/or additions to this file to:
# bug-dejagnu@prep.ai.mit.edu
# Written by Ian Lance Taylor <ian@cygnus.com>
if ![is_remote host] {
if {[which $AR] == 0} then {
perror "$AR does not exist"
return
}
}
# send_user "Version [binutil_version $AR]"
# Test long file name support
proc long_filenames { bfdtests } {
global AR
global host_triplet
global base_dir
set testname "ar long file names"
set n1 "abcdefghijklmnopqrstuvwxyz1"
set n2 "abcdefghijklmnopqrstuvwxyz2"
set file1 tmpdir/$n1
set file2 tmpdir/$n2
remote_file build delete $file1
remote_file host delete $n1
# Some file systems truncate file names at 14 characters, which
# makes it impossible to run this test. Check for that now.
set status [catch "set f [open tmpdir/$n1 w]" errs]
if { $status != 0 } {
verbose -log "open tmpdir/$n1 returned $errs"
unsupported $testname
return
}
puts $f "first"
close $f
remote_file build delete $file2
remote_file host delete $n2
set status [catch "set f [open tmpdir/$n2 w]" errs]
if { $status != 0 } {
verbose -log "open tmpdir/$n2 returned $errs"
unsupported $testname
return
}
puts $f "second"
close $f
if [is_remote host] {
set file1 [remote_download host $file1]
set file2 [remote_download host $file2]
set dest artest.a
} else {
set dest tmpdir/artest.a
}
remote_file host delete $dest
set got [binutils_run $AR "rc $dest $file1 $file2"]
if [is_remote host] {
remote_upload host $file1 tmpdir/$n1
}
set f [open tmpdir/$n1 r]
gets $f string
close $f
if ![string match "first" $string] {
verbose -log "reading tmpdir/$n1 returned $string"
unsupported $testname
return
}
remote_file host delete $dest
set got [binutils_run $AR "rc $dest $file1 $file2"]
if ![string match "" $got] {
fail $testname
return
}
remote_file build delete tmpdir/$n1
remote_file build delete tmpdir/$n2
set got [binutils_run $AR "t $dest"]
regsub "\[\r\n \t\]*$" "$got" "" got
if ![string match "$n1*$n2" $got] {
fail $testname
return
}
if [is_remote host] {
remote_file host delete $file1
remote_file host delete $file2
}
set exec_output [binutils_run $AR "x $dest"]
set exec_output [prune_warnings $exec_output]
if ![string match "" $exec_output] {
verbose -log $exec_output
fail $testname
return
}
foreach bfdtest $bfdtests {
set exec_output [binutils_run "$base_dir/$bfdtest" "$dest"]
if ![string match "" $exec_output] {
verbose -log $exec_output
fail "$testname ($bfdtest)"
return
}
}
if [is_remote host] {
remote_upload host $n1 tmpdir/$n1
remote_upload host $n2 tmpdir/$n2
set file1 tmpdir/$n1
set file2 tmpdir/$n2
} else {
set file1 $n1
set file2 $n2
}
if ![file exists $file1] {
verbose -log "$file1 does not exist"
fail $testname
return
}
if ![file exists $file2] {
verbose -log "$file2 does not exist"
fail $testname
return
}
set f [open $file1 r]
if { [gets $f line] == -1 || $line != "first" } {
verbose -log "$file1 contents:"
verbose -log "$line"
close $f
fail $testname
return
}
close $f
set f [open $file2 r]
if { [gets $f line] == -1 || $line != "second" } {
verbose -log "$file2 contents:"
verbose -log "$line"
close $f
fail $testname
return
}
close $f
file delete $file1 $file2
pass $testname
}
# Test building the symbol table.
proc symbol_table { } {
global AR
global AS
global NM
global srcdir
global subdir
set testname "ar symbol table"
if ![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o] {
unresolved $testname
return
}
if [is_remote host] {
set archive artest.a
set objfile [remote_download host tmpdir/bintest.o]
remote_file host delete $archive
} else {
set archive tmpdir/artest.a
set objfile tmpdir/bintest.o
}
remote_file build delete tmpdir/artest.a
set got [binutils_run $AR "rc $archive ${objfile}"]
if ![string match "" $got] {
fail $testname
return
}
set got [binutils_run $NM "--print-armap $archive"]
if { ![string match "*text_symbol in bintest.o*" $got] \
|| ![string match "*data_symbol in bintest.o*" $got] \
|| ![string match "*common_symbol in bintest.o*" $got] \
|| [string match "*static_text_symbol in bintest.o*" $got] \
|| [string match "*static_data_symbol in bintest.o*" $got] \
|| [string match "*external_symbol in bintest.o*" $got] } {
fail $testname
return
}
pass $testname
}
# Test building a thin archive.
proc thin_archive { bfdtests } {
global AR
global AS
global NM
global srcdir
global subdir
global base_dir
set testname "ar thin archive"
if ![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o] {
unresolved $testname
return
}
if [is_remote host] {
set archive artest.a
set objfile [remote_download host tmpdir/bintest.o]
remote_file host delete $archive
} else {
set archive tmpdir/artest.a
set objfile tmpdir/bintest.o
}
remote_file build delete tmpdir/artest.a
set got [binutils_run $AR "rcT $archive ${objfile}"]
if ![string match "" $got] {
fail $testname
return
}
foreach bfdtest $bfdtests {
set exec_output [binutils_run "$base_dir/$bfdtest" "$archive"]
if ![string match "" $exec_output] {
verbose -log $exec_output
fail "$testname ($bfdtest)"
return
}
}
set got [binutils_run $NM "--print-armap $archive"]
if { ![string match "*text_symbol in *bintest.o*" $got] \
|| ![string match "*data_symbol in *bintest.o*" $got] \
|| ![string match "*common_symbol in *bintest.o*" $got] \
|| [string match "*static_text_symbol in *bintest.o*" $got] \
|| [string match "*static_data_symbol in *bintest.o*" $got] \
|| [string match "*external_symbol in *bintest.o*" $got] } {
fail $testname
return
}
pass $testname
}
# Test building a thin archive with a nested archive.
proc thin_archive_with_nested { bfdtests } {
global AR
global AS
global NM
global srcdir
global subdir
global base_dir
set testname "ar thin archive with nested archive"
if ![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o] {
unresolved $testname
return
}
if [is_remote host] {
set archive artest.a
set archive2 artest2.a
set objfile [remote_download host tmpdir/bintest.o]
remote_file host delete $archive
} else {
set archive tmpdir/artest.a
set archive2 tmpdir/artest2.a
set objfile tmpdir/bintest.o
}
remote_file build delete tmpdir/artest.a
set got [binutils_run $AR "rc $archive ${objfile}"]
if ![string match "" $got] {
fail $testname
return
}
remote_file build delete tmpdir/artest2.a
set got [binutils_run $AR "rcT $archive2 ${archive}"]
if ![string match "" $got] {
fail $testname
return
}
foreach bfdtest $bfdtests {
set exec_output [binutils_run "$base_dir/$bfdtest" "$archive"]
if ![string match "" $exec_output] {
verbose -log $exec_output
fail "$testname ($bfdtest)"
return
}
set exec_output [binutils_run "$base_dir/$bfdtest" "$archive2"]
if ![string match "" $exec_output] {
verbose -log $exec_output
fail "$testname ($bfdtest)"
return
}
}
set got [binutils_run $NM "--print-armap $archive"]
if { ![string match "*text_symbol in *bintest.o*" $got] \
|| ![string match "*data_symbol in *bintest.o*" $got] \
|| ![string match "*common_symbol in *bintest.o*" $got] \
|| [string match "*static_text_symbol in *bintest.o*" $got] \
|| [string match "*static_data_symbol in *bintest.o*" $got] \
|| [string match "*external_symbol in *bintest.o*" $got] } {
fail $testname
return
}
pass $testname
}
# Test POSIX-compatible argument parsing.
proc argument_parsing { } {
global AR
global AS
global srcdir
global subdir
set testname "ar argument parsing"
if ![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o] {
unresolved $testname
return
}
if [is_remote host] {
set archive artest.a
set objfile [remote_download host tmpdir/bintest.o]
remote_file host delete $archive
} else {
set archive tmpdir/artest.a
set objfile tmpdir/bintest.o
}
remote_file build delete tmpdir/artest.a
set got [binutils_run $AR "-r -c $archive ${objfile}"]
if ![string match "" $got] {
fail $testname
return
}
pass $testname
}
# Test building a deterministic archive.
proc deterministic_archive { } {
global AR
global AS
global NM
global srcdir
global subdir
set testname "ar deterministic archive"
if ![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o] {
unresolved $testname
return
}
if [is_remote host] {
set archive artest.a
set objfile [remote_download host tmpdir/bintest.o]
remote_file host delete $archive
} else {
set archive tmpdir/artest.a
set objfile tmpdir/bintest.o
}
remote_file build delete tmpdir/artest.a
set got [binutils_run $AR "rcD $archive ${objfile}"]
if ![string match "" $got] {
fail $testname
return
}
set got [binutils_run $AR "tv $archive"]
# This only checks the file mode and uid/gid. We can't easily match
# date because it's printed with the user's timezone.
if ![string match "rw-r--r-- 0/0 *bintest.o*" $got] {
fail $testname
return
}
pass $testname
}
proc unique_symbol { } {
global AR
global AS
global NM
global srcdir
global subdir
set testname "ar unique symbol in archive"
if ![binutils_assemble $srcdir/$subdir/unique.s tmpdir/unique.o] {
unresolved $testname
}
if [is_remote host] {
set archive artest.a
set objfile [remote_download host tmpdir/unique.o]
remote_file host delete $archive
} else {
set archive tmpdir/artest.a
set objfile tmpdir/unique.o
}
remote_file build delete tmpdir/artest.a
set got [binutils_run $AR "-s -r -c $archive ${objfile}"]
if ![string match "" $got] {
fail $testname
return
}
set got [binutils_run $NM "--print-armap $archive"]
if ![string match "*foo in *unique.o*" $got] {
fail $testname
return
}
pass $testname
}
# Test deleting an element.
proc delete_an_element { } {
global AR
global AS
global srcdir
global subdir
set testname "ar deleting an element"
if ![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o] {
unresolved $testname
return
}
if [is_remote host] {
set archive artest.a
set objfile [remote_download host tmpdir/bintest.o]
remote_file host delete $archive
} else {
set archive tmpdir/artest.a
set objfile tmpdir/bintest.o
}
remote_file build delete tmpdir/artest.a
set got [binutils_run $AR "-r -c $archive ${objfile}"]
if ![string match "" $got] {
fail $testname
return
}
set got [binutils_run $AR "-d $archive ${objfile}"]
if ![string match "" $got] {
fail $testname
return
}
pass $testname
}
# Test moving an element.
proc move_an_element { } {
global AR
global AS
global srcdir
global subdir
set testname "ar moving an element"
if ![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o] {
unresolved $testname
return
}
if [is_remote host] {
set archive artest.a
set objfile [remote_download host tmpdir/bintest.o]
remote_file host delete $archive
} else {
set archive tmpdir/artest.a
set objfile tmpdir/bintest.o
}
remote_file build delete tmpdir/artest.a
set got [binutils_run $AR "-r -c $archive ${objfile}"]
if ![string match "" $got] {
fail $testname
return
}
set got [binutils_run $AR "-m $archive ${objfile}"]
if ![string match "" $got] {
fail $testname
return
}
pass $testname
}
# Run the tests.
# Only run the bfdtest checks if the programs exist. Since these
# programs are built but not installed, running the testsuite on an
# installed toolchain will produce ERRORs about missing bfdtest1 and
# bfdtest2 executables.
if { [file exists $base_dir/bfdtest1] && [file exists $base_dir/bfdtest2] } {
set bfdtests [list bfdtest1 bfdtest2]
long_filenames $bfdtests
thin_archive $bfdtests
thin_archive_with_nested $bfdtests
}
symbol_table
argument_parsing
deterministic_archive
delete_an_element
move_an_element
if { [is_elf_format]
&& ![istarget "*-*-hpux*"]
&& ![istarget "msp*-*-*"] } {
unique_symbol
}