summaryrefslogtreecommitdiffstats
path: root/testsuite/systemtap.base/cache.exp
blob: 439898ab51eade9a4447765f685b0e73b48dcda0 (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
# cache.exp

# flag values
proc F_UNCACHED {}   {return 0x1};	# compilation should be uncached
proc F_CACHED {}     {return 0x2};	# compilation should be cached
proc F_NO_COMPILE {} {return 0x4};	# script doesn't compile
proc F_COMPILE {}    {return 0x8};	# script compiles

# mask values to get either the cache vale or the compile value
proc F_CACHE_MASK {}   {return [expr [F_UNCACHED] | [F_CACHED]]}
proc F_COMPILE_MASK {} {return [expr [F_NO_COMPILE] | [F_COMPILE]]}

# convenience combination of flags
proc F_CACHED_COMPILE {}      {return [expr [F_CACHED] | [F_COMPILE]]}
proc F_UNCACHED_COMPILE {}    {return [expr [F_UNCACHED] | [F_COMPILE]]}
proc F_UNCACHED_NO_COMPILE {} {return [expr [F_UNCACHED] | [F_NO_COMPILE]]}

# stap_compile TEST_NAME flags script args
# - TEST_NAME is the name of the current test
# - flags indicates the expected outcome of this test
# - script is the script to compile
# Additional arguments are passed to stap as-is.
proc stap_compile { TEST_NAME flags script args } {
    set cmd [concat {stap -v -p4 -e} $script $args]
    
    eval spawn $cmd
    set cached 0
    set compile_errors 0
    expect {
	-re {^Pass\ [1234]:[^\r]*\ in\ .*\ ms.\r\n} {exp_continue}
	-re {^Pass\ [34]: using cached [^\r\n]+\r\n} {incr cached 1; exp_continue}
	-re "compilation failed" {incr compile_errors 1; exp_continue}
	-re "semantic error:" {incr compile_errors 1; exp_continue}
    }
    catch close
    wait

    # If we've got compile errors and the script was supposed to
    # compile, fail.
    if {$compile_errors > 0
	&& [expr $flags & [F_COMPILE_MASK]] == [F_COMPILE]} {
	fail "$TEST_NAME compilation failed"
	return
    }

    # If we were supposed to use a cached module...
    if {[expr $flags & [F_CACHE_MASK]] == [F_CACHED]} {
	if {$cached == 2} {
	    pass "$TEST_NAME was cached"
	} else {
	    fail "$TEST_NAME wasn't cached"
	}
    # If we weren't supposed to use a cached module...
    } else {
	if {$cached > 0} {
	    fail "$TEST_NAME was cached"
	} else {
	    pass "$TEST_NAME wasn't cached"
	}
    }
}

# Since we need a clean cache directory, we'll use a temporary
# systemtap directory and cache
set local_systemtap_dir [exec pwd]/.cache_test
exec /bin/rm -rf $local_systemtap_dir
if [info exists env(SYSTEMTAP_DIR)] {
    set old_systemtap_dir $env(SYSTEMTAP_DIR)
}
set env(SYSTEMTAP_DIR) $local_systemtap_dir

# Set up the scripts we'll use.
set basic_script1 "\"probe begin { }\""
set basic_script2 "\"probe begin, end { }\""
set error_script "\"probe XbeginX { }\""

# Check basic functionality.  The 1st compilation of a script won't
# be cached, the 2nd should be cached.
stap_compile BASIC1 [F_UNCACHED_COMPILE] $basic_script1
stap_compile BASIC2 [F_CACHED_COMPILE] $basic_script1

# Adding in a macro definition should change the hash
stap_compile OPTION1 [F_UNCACHED_COMPILE] $basic_script1 -DFOO=1
stap_compile OPTION2 [F_CACHED_COMPILE] $basic_script1 -DFOO=1

# Changing the runtime directory should change the hash
set new_runtime [exec pwd]/.cache_test_runtime
exec /bin/rm -f $new_runtime
exec /bin/ln -s $env(SYSTEMTAP_RUNTIME) $new_runtime
stap_compile RUNTIME1 [F_UNCACHED_COMPILE] $basic_script1 -R $new_runtime
stap_compile RUNTIME2 [F_CACHED_COMPILE] $basic_script1 -R $new_runtime
exec /bin/rm -f $new_runtime

# Disable the cache with SYSTEMTAP_DIR
set env(SYSTEMTAP_DIR) /dev/null
stap_compile DISABLED1 [F_UNCACHED_COMPILE] $basic_script1
stap_compile DISABLED2 [F_UNCACHED_COMPILE] $basic_script1
set env(SYSTEMTAP_DIR) $local_systemtap_dir

# Disable the cache with '-m'
stap_compile MODNAM1 [F_UNCACHED_COMPILE] $basic_script1 -m modnam
stap_compile MODNAM2 [F_UNCACHED_COMPILE] $basic_script1 -m modnam

# Make sure scripts that don't actually compile don't get cached
stap_compile ERROR1 [F_UNCACHED_NO_COMPILE] $error_script
stap_compile ERROR2 [F_UNCACHED_NO_COMPILE] $error_script

# Make sure basic stuff still works.
stap_compile BASIC3 [F_UNCACHED_COMPILE] $basic_script2
stap_compile BASIC4 [F_CACHED_COMPILE] $basic_script2

# Cleanup.
exec /bin/rm -rf $local_systemtap_dir
if [info exists old_systemtap_dir] {
    set env(SYSTEMTAP_DIR) $old_systemtap_dir
} else {
    unset env(SYSTEMTAP_DIR)
}