--- /dev/null
+#===============================================================================
+#
+# assert.exp
+#
+# Assertion test cases
+#
+#===============================================================================
+######COPYRIGHTBEGIN####
+#
+# ----------------------------------------------------------------------------
+# Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
+#
+# This file is part of the eCos host tools.
+#
+# 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.
+#
+# ----------------------------------------------------------------------------
+#
+######COPYRIGHTEND####
+#===============================================================================
+######DESCRIPTIONBEGIN####
+#
+# Author(s): bartv
+# Contributors: bartv
+# Date: 1998-11-25
+#
+#####DESCRIPTIONEND####
+#===============================================================================
+
+# ----------------------------------------------------------------------------
+# Start with the simple tests.
+${tool}_load tassert1
+${tool}_load tassert2
+${tool}_load tassert3
+${tool}_load tassert4
+
+# tassert5 is not buildable under Linux. It is a C program linked with
+# a C++ library, and there are dependencies on the default new and
+# delete operators which are not satisfied.
+
+if { [string match "cl*" $::hosttest_data(CC)] } {
+ ${tool}_load tassert5
+} else {
+ unsupported "using the infrastructure from C code"
+}
+
+${tool}_load tassert6
+${tool}_load tassert7
+
+# ----------------------------------------------------------------------------
+# tassert8 is a bit more complicated. It involves an assertion which
+# is not caught in any way by the application code. Therefore the
+# output of the program has to be analysed to make sure it is
+# reasonable. There is also going to be a dump file that needs
+# to be analysed and cleaned up.
+
+proc tassert8_filter { name result output } {
+
+ set all_ok 1
+
+ if { $result == 0 } {
+ fail "testcase $name should have a non-zero exit code"
+ set all_ok 0
+ }
+
+ # Convert the output to a list of lines.
+ set lines [split $output "\n"]
+
+ # The first line of interest should contain the phrase
+ # "Assertion failure" and the string embedded in tassert8.cxx
+ while { 1 } {
+ if { [llength $lines] == 0 } {
+ set all_ok 0
+ fail "No \"Assertion failure\" message detected in program output"
+ break
+ }
+ set line [lindex $lines 0]
+ set lines [lreplace $lines 0 0]
+ if { [regexp -nocase -- {^assertion failure.*it seemed like a good idea at the time$} $line] } {
+ break
+ }
+ }
+
+ # The next line should indicate the file and the line number
+ if { [llength $lines] == 0 } {
+ set all_ok 0
+ fail "No file name or line number information"
+ } else {
+ set line [lindex $lines 0]
+ set lines [lreplace $lines 0 0]
+ if { [regexp -nocase -- {^file .*tassert8.cxx.*line number [0-9]+$} $line] == 0} {
+ fail "Output did not contain the expected filename and linenumber"
+ }
+ }
+ # There may or may not be a line containing the function name.
+ # This should not be checked, it depends on compiler support
+ # for __PRETTY_FUNCTION__. The next line of interest is
+ # "Writing additional output to xxx", where xxx is a filename.
+ while { 1 } {
+ if { [llength $lines] == 0 } {
+ set all_ok 0
+ fail "Output did not specify where the dump information was stored"
+ break
+ } else {
+ set line [lindex $lines 0]
+ set lines [lreplace $lines 0 0]
+ set dummy ""
+ set match ""
+ if { [regexp -- {^Writing additional output to (.*)$} $line dummy match] } {
+ tassert8_process_dump $match all_ok
+ break
+ }
+ }
+ }
+
+ if { $all_ok } {
+ pass "Assertions generate sensible output"
+ }
+
+ return 0
+}
+
+proc tassert8_process_dump { filename all_ok_arg } {
+
+ upvar $all_ok_arg all_ok
+ set realname [hosttest_translate_existing_filename $filename]
+ if { $realname == "" } {
+ set all_ok 0
+ fail "Unable to find assertion dump file $filename"
+ return
+ }
+ set lines {}
+ set status [ catch {
+ set fd [open $realname r]
+ set data [read $fd]
+ close $fd
+ set lines [split $data "\n"]
+ if { [llength $lines] == 0 } {
+ set all_ok 0
+ fail "The assertion dump file $realname contains no data"
+ }
+ } message ]
+ if { $status != 0 } {
+ set all_ok 0
+ fail "Unable to open assertion output file $realname, $message"
+ }
+ set status [ catch { file delete $realname } message ]
+ if { $status != 0 } {
+ warning "Unable to delete assertion dump file $realname, $message" 0
+ }
+ if { [llength $lines] == 0 } {
+ return
+ }
+
+ # We have some data to process. The information should include
+ # the following:
+ # 1) a line Assertion failure msg
+ # 2) a line with the filename and the linenumber
+ # 3) optionally a line with the function name. This depends on
+ # compiler support.
+ # 4) information from callback1
+ # 5) information from callback2
+ #
+ # The relative order of (4) and (5) is not defined.
+ while { 1 } {
+ if { [llength $lines] == 0 } {
+ set all_ok 0
+ fail "No \"Assertion failure\" message detected in output file"
+ break
+ }
+ set line [lindex $lines 0]
+ set lines [lreplace $lines 0 0]
+ if { [regexp -nocase -- {^assertion failure.*it seemed like a good idea at the time$} $line] } {
+ break
+ }
+ }
+
+ if { [llength $lines] == 0 } {
+ set all_ok 0
+ fail "No file name or line number information"
+ } else {
+ set line [lindex $lines 0]
+ set lines [lreplace $lines 0 0]
+ if { [regexp -nocase -- {^file .*tassert8.cxx.*line number [0-9]+$} $line] == 0} {
+ set all_ok 0
+ fail "Output did not contain the expected filename and linenumber"
+ }
+ }
+
+ set seen_callback1 0
+ set seen_callback2 0
+ while { [llength $lines] > 0 } {
+
+ set line [lindex $lines 0]
+ set lines [lreplace $lines 0 0]
+
+ if { [regexp -nocase -- {^\# \{\{\{.*callback1.*$} $line] } {
+ if { $seen_callback1 != 0 } {
+ set all_ok 0
+ fail "Output contains multiple occurrences of callback1"
+ continue
+ }
+ set seen_callback1 1
+
+ while { [llength $lines] > 0 } {
+ set line [lindex $lines 0]
+ set lines [lreplace $lines 0 0]
+
+ if { [regexp -nocase -- {^\# \}\}\}.*$} $line] } {
+ break
+ }
+
+ # callback1 should not generate any output so only blank lines
+ # are acceptable
+ if { [regexp -nocase -- {^ *$} $line] != 1} {
+ set all_ok 0
+ fail "Unexpected data in callback1 output: $line"
+ # Do not repeat this failure message. This break will
+ # do near enough the right thing.
+ break
+ }
+ }
+
+ } elseif { [regexp -nocase -- {^\# \{\{\{.*callback2.*$} $line] } {
+ if { $seen_callback2 != 0 } {
+ set all_ok 0
+ fail "Output contains multiple occurrences of callback2"
+ }
+ set seen_callback2 1
+
+ while { [llength $lines] > 0 } {
+ set line [lindex $lines 0]
+ set lines [lreplace $lines 0 0]
+
+ if { [regexp -nocase -- {^\# \}\}\}.*$} $line] } {
+ break
+ }
+
+ # callback2 is allowed to generate blank lines and
+ # fixed lines.
+ if { [regexp -nocase -- {^ *$} $line] == 1 } {
+ continue
+ }
+ if { $line == "callback2 output" } {
+ continue
+ }
+ set all_ok 0
+ fail "Unexpected data in callback2 output: $line"
+ }
+
+ }
+ }
+ if { ($seen_callback1 == 0) || ($seen_callback2 == 0) } {
+ set all_ok 0
+ fail "Output did not contain all the callback information"
+ }
+}
+
+hosttest_run_test_with_filter tassert8 tassert8_filter {} {} {} cyginfra {}
+
+# ----------------------------------------------------------------------------
+# Strictly speaking this is not an assertion test. However there are some
+# support routines in hosttest.exp which are tried closely to the
+# implementation of the assertion code, and it is worthwhile checking
+# these. The tassert8 testcase can be reused for this.
+
+proc tassert9_filter { name result output } {
+
+ if { [hosttest_assert_check $result $output] == 0 } {
+ fail "testcase did not generate a recognised assertion"
+ return
+ }
+
+ set output [hosttest_assert_read_dump $output]
+ if { $output == "" } {
+ fail "testcase did not generate a recognised assertion dump"
+ return
+ }
+
+ set all_ok 1
+
+ set callback1_output [hosttest_assert_extract_callback $output "callback1"]
+ set callback2_output [hosttest_assert_extract_callback $output "callback2"]
+
+ # Callback1 output should be empty, all blank lines should have been filtered
+ # out.
+ if { $callback1_output != "" } {
+ set all_ok 0
+ fail "callback1 output should be empty"
+ }
+ set lines [split $callback2_output "\n"]
+ if { [llength $lines] == 0 } {
+ set all_ok 0
+ fail "callback2 should have produced some output"
+ } elseif { [llength $lines] < 10} {
+ set all_ok 0
+ fail "callback2 is supposted to have at least ten lines of output"
+ } else {
+ # There should be ten lines of output, possibly followed by
+ # some blanks.
+ for { set i 0 } { $i < 10 } { incr i } {
+ set line [lindex $lines 0]
+ set lines [lreplace $lines 0 0]
+ if { $line != "callback2 output" } {
+ set all_ok 0
+ fail "incorrect output from callback2"
+ break
+ }
+ }
+
+ while { [llength $lines] > 0 } {
+ set line [lindex $lines 0]
+ set lines [lreplace $lines 0 0]
+ if { [regexp -- {^ *$} $line] != 1 } {
+ set all_ok 0
+ fail "callback2 output contains unexpected data"
+ break
+ }
+ }
+ }
+
+ if { $all_ok } {
+ pass "assertion output and dump file format match test harness expectations"
+ }
+ return 0
+}
+
+hosttest_run_test_with_filter tassert9 tassert9_filter tassert8.cxx {} {} cyginfra {}
+