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
|
# stap_run TEST_NAME LOAD_GEN_FUNCTION OUTPUT_CHECK_STRING
# TEST_NAME is path to the current test
# LOAD_GEN_FUNCTION (optional) to produce something to measure
# returns 0 if successful
# returns 1 if there was a problem
# OUTPUT_CHECK_STRING (optional) examines the output of experiment
# returns 0 if successful
# returns 1 if there was a problem
# Additional arguments are passed to stap as-is.
#
# As a side-effect, global 'probe_errors' and 'skipped_probes' are set
# to the number of probe errors and skipped probes seen while
# running the probe.
proc stap_run { TEST_NAME {LOAD_GEN_FUNCTION ""} {OUTPUT_CHECK_STRING ""} args } {
global probe_errors
global skipped_probes
# zap the srcdir prefix
set test_file_name $TEST_NAME
set TEST_NAME [regsub {.*/testsuite/} $TEST_NAME ""]
# initialize probe_errors and skipped_probes to 0
set probe_errors 0
set skipped_probes 0
set warning_regexp {^WARNING: Number of errors: ([0-9]+), skipped probes: ([0-9]+)\r\n}
if {[info procs installtest_p] != "" && ![installtest_p]} { untested $TEST_NAME; return }
set cmd [concat {stap -v} $args]
if [file readable $test_file_name] {
lappend cmd $test_file_name
}
eval spawn $cmd
expect {
-timeout 180
-re {^Warning: using '-m' disables cache support.\r\n} {exp_continue}
-re {^WARNING: cannot find module [^\r]*DWARF[^\r]*\r\n} {exp_continue}
-re {^Pass\ ([1234]):[^\r]*\ in\ ([0-9]+)usr/([0-9]+)sys/([0-9]+)real\ ms\.\r\n}
{set pass$expect_out(1,string) "\t$expect_out(2,string)\t$expect_out(3,string)\t$expect_out(4,string)"; exp_continue}
-re {^Pass\ ([34]): using cached [^\r]+\r\n}
{set pass$expect_out(1,string) "\t0\t0\t0"; exp_continue}
-re {^Pass 5: starting run.\r\n} {exp_continue}
-re "^systemtap starting probe\r\n" {
pass "$TEST_NAME startup"
if {$LOAD_GEN_FUNCTION != ""} then {
#run the interesting test here
if {[eval $LOAD_GEN_FUNCTION] == 0} then {
pass "$TEST_NAME load generation"
} else {
fail "$TEST_NAME load generation"
}
}
exec kill -INT -[exp_pid]
# check the output to see if it is sane
set output "^systemtap ending probe\r\n$OUTPUT_CHECK_STRING"
expect {
-timeout 20
-re $warning_regexp {
set probe_errors $expect_out(1,string)
set skipped_probes $expect_out(2,string)
exp_continue}
-re $output {
pass "$TEST_NAME shutdown and output"
expect {
-timeout -1
-re {^Pass\ ([5]):[^\r]*\ in\ ([0-9]+)usr/([0-9]+)sys/([0-9]+)real\ ms\.\r\n}
{set pass$expect_out(1,string) "\t$expect_out(2,string)\t$expect_out(3,string)\t$expect_out(4,string)"
verbose -log "metric:\t$TEST_NAME $pass1$pass2$pass3$pass4$pass5"}
-re $warning_regexp {
set probe_errors $expect_out(1,string)
set skipped_probes $expect_out(2,string)}
}
}
timeout {
fail "$TEST_NAME shutdown (timeout)"
exec kill -INT -[exp_pid]
}
eof { fail "$TEST_NAME shutdown (eof)" }
}
}
-re "semantic error:" { fail "$TEST_NAME compilation" }
timeout {
fail "$TEST_NAME startup (timeout)"
exec kill -INT -[exp_pid]
}
eof { fail "$TEST_NAME startup (eof)" }
}
# again for good measure
exec kill -INT -[exp_pid]
catch close
wait
}
proc no_load {} {
# nothing in here
# load to use when nothing is needed
return 0
}
proc print_system_info {} {
global Host Snapshot Distro
clone_output "\nHost: $Host"
if {[string compare $Snapshot "unknown"]!=0} {
clone_output "Snapshot: $Snapshot"
}
clone_output "Distro: $Distro\n"
}
print_system_info
# tests better all be true
set all_pass_string "(systemtap test success\r\n)+$"
|