diff host/infra/testsuite/cyginfra/assert.exp @ 76:435cced73e2f ecos-v1_3_1-release

eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
author jlarmour
date Tue, 28 Mar 2000 14:10:45 +0000
parents
children
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/host/infra/testsuite/cyginfra/assert.exp
@@ -0,0 +1,341 @@
+#===============================================================================
+#
+#    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 {}
+