blob: a458914bfdf4a63802b92138026f4614642b6061 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
set dir ""
set current_dir ""
proc cleanup {} {
global dir current_dir
if {$current_dir != ""} {
cd $current_dir
set current_dir ""
}
if {$dir != ""} {
# puts "rm -rf $dir"
exec rm -rf $dir
set dir ""
}
}
proc cleanup_and_exit {} {
# puts "cleanup_and_exit"
cleanup
exit 0
}
proc bgerror {error} {
puts "ERROR: $error"
cleanup
}
trap {cleanup_and_exit} SIGINT
proc run_one_test {filename flags} {
global dir current_dir
set testname [file tail [string range $filename 0 end-2]]
set result "UNSUPP"
if {[catch {exec mktemp -d [pwd]/staptestXXXXX} dir]} {
puts stderr "Failed to create temporary directory: $dir"
cleanup
}
target_compile $filename $dir/$testname executable $flags
set sys_prog "[file dirname [file normalize $filename]]/sys.stp"
set cmd "stap --skip-badvars -c $dir/${testname} ${sys_prog}"
# Extract the expected results
# Use the preprocessor so we can ifdef tests in and out
set ccmd "gcc -E -C -P $filename"
# XXX: but note, this will expand all system headers too!
catch {eval exec $ccmd} output
set ind 0
foreach line [split $output "\n"] {
if {[regsub {//staptest//} $line {} line]} {
set line "$testname: [string trimleft $line]"
# We need to quote all these metacharacters
regsub -all {\(} $line {\\(} line
regsub -all {\)} $line {\\)} line
regsub -all {\|} $line {\|} line
# + and * are metacharacters, but should always be used
# as metacharacters in the expressions, don't escape them.
#regsub -all {\+} $line {\\+} line
#regsub -all {\*} $line {\\*} line
regsub -all NNNN $line {[\-0-9]+} line
regsub -all XXXX $line {[x0-9a-fA-F]+} line
set results($ind) $line
incr ind
}
}
if {$ind == 0} {
# unsupported
cleanup
return $result
}
set current_dir [pwd]
cd $dir
catch {eval exec $cmd} output
set i 0
foreach line [split $output "\n"] {
# send_log "Comparing $results($i) against $line"
if {[regexp $results($i) $line]} {
incr i
if {$i >= $ind} {break}
}
}
if {$i >= $ind} {
set result "PASS"
# puts "PASS $testname"
} else {
set result "FAIL $testname"
send_log "$testname FAILED. output of \"$cmd\" was:"
send_log "\n------------------------------------------\n"
send_log $output
send_log "\n------------------------------------------\n"
send_log "RESULTS: (\'*\' = MATCHED EXPECTED)\n"
set i 0
foreach line [split $output "\n"] {
if {[regexp "${testname}: " $line]} {
if {[regexp $results($i) $line]} {
send_log "*$line\n"
incr i
if {$i >= $ind} {break}
} else {
send_log "$line\n"
}
}
}
if {$i < $ind} {
send_log -- "--------- EXPECTED and NOT MATCHED ----------\n"
}
for {} {$i < $ind} {incr i} {
send_log "$results($i)\n"
}
}
cleanup
return $result
}
|