OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [rtos/] [ecos-2.0/] [tools/] [src/] [infra/] [testsuite/] [cyginfra/] [assert.exp] - Rev 214

Go to most recent revision | Compare with Previous | Blame | View Log

#===============================================================================
#
#    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 {}

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.