File: server.exp

package info (click to toggle)
systemtap 3.1-2
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 32,860 kB
  • ctags: 12,513
  • sloc: cpp: 58,610; ansic: 58,189; exp: 37,322; sh: 10,633; xml: 7,771; perl: 2,252; python: 2,066; tcl: 1,305; makefile: 969; lisp: 105; java: 100; awk: 94; asm: 91; sed: 16
file content (174 lines) | stat: -rw-r--r-- 4,846 bytes parent folder | download
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
set test "Server Tests:"

# Create a new server log and make sure it's world writable.
set logfile "[pwd]/server.log"
catch {exec rm -f $logfile}
catch {exec touch $logfile}
catch {exec chmod 666 $logfile}

# Don't attempt these tests if the client/server are not available
if {! [setup_server]} then {
    untested "Server Tests"
    return
}

proc cleanup {} {
    global tmpdir
    catch {exec rm -f foo}
    catch {exec rm -fr $tmpdir}
    shutdown_server
}

# Whether the server can communicate with the client is tested in client.exp.
# Test that the the server can handle particular situations of interest.

#-------------------------------------------------------
# Building, returning and using the uprobes.ko module.
set subtest "uprobes"
if {! [uprobes_p]} then {
    untested "$test $subtest tests"
} else {
    # First compile a test application.
    catch {exec gcc -g -o foo $srcdir/systemtap.base/jennie.c} err
    if {$err == "" && [file exists foo]} {
	pass "$test $subtest compile foo"
    } else {
	fail "$test $subtest compile foo"
    }
    set foo [exec pwd]/foo

    if {[inode_uprobes_p]} {
	# Make sure that uprobes.ko is not loaded
	catch {exec /sbin/rmmod uprobes}
    }

    # Now use the server to compile the uprobes.stp script
    set failed 1
    set tmpdir ""
    set cmd [concat stap -p4 $srcdir/$subdir/uprobes.stp $use_server -k -c $foo]
    send_log "executing: $cmd\n"
    eval spawn $cmd
    expect {
	-timeout 150
	-re {.*Keeping temporary directory \"(.*)\"\r\n} {
	    set tmpdir "$expect_out(1,string)"
	    set failed 0
	}
	-re {^.*\r\n} { exp_continue }
	timeout { 
	    kill -INT -[exp_pid] 2
	}
    }
    catch {close}; catch {wait}
    if {$failed == 0} {
	pass "$test $subtest -p4"
    } else {
	fail "$test $subtest -p4"
    }

    # Make sure that the uprobes.ko module was returned.
    if {"$tmpdir" == "" || [inode_uprobes_p]} {
	untested "$test $subtest uprobes returned"
    } else {
	if {[file exists $tmpdir/server/stap000000/uprobes/uprobes.ko]} {
	    pass "$test $subtest uprobes returned"
	} else {
	    fail "$test $subtest uprobes returned"
	}
    }

    if {! [installtest_p]} {
	untested "$test $subtest -p5";
	cleanup
	return
    }

    # Now do it again, but follow through to phase 5

    if {! [inode_uprobes_p]} {
	# Make sure that uprobes.ko is not loaded
	catch {exec /sbin/rmmod uprobes}
    }

    # Now use the server to compile and run the uprobes.stp script
    set failed 1
    set cmd {stap $srcdir/$subdir/uprobes.stp $use_server -c "$foo 1 2 3 4"}
    send_log "executing: $cmd\n"
    eval spawn $cmd
    set ok 0
    expect {
	-re {^process[^\r\n]+foo[^\r\n]+main[^\r\n]+arg[cv]=0x[0-9a-f]+\ +arg[cv]=0x[0-9a-f]+\r\n} { incr ok; exp_continue }
	-re {^process[^\r\n]+foo[^\r\n]+main[^\r\n]+return=0x0\r\n} { incr ok; exp_continue }
	-re {^[^\r\n]*\r\n} { exp_continue }
	-timeout 60
	timeout { }
	eof { }
    }
    catch {close}; catch {wait}
    if {$ok == 10} {
	pass "$test $subtest -p5"
    } else {
	fail "$test $subtest -p5 ($ok)"
    }
}

#-------------------------------------------------------
# avahi-daemon restart: PR 15872
# Make sure that the server can survive an avahi-daemon restart and still accept requests
# via avahi. We can only test this is avahi is available.
if {$avahi_ok_p != 1} {
    set dontTest 1
} else {
    set dontTest 0
}

if {$dontTest == 1} {
    untested "$test $subtest"
} else {
    set subtest "server reacts to avahi-daemon restart"
    # Notice we are using the tcl 'exec' command redirection of
    # '2>@1', which is equivalent to the shell's '2>&1'.
    if {[as_root "service avahi-daemon restart 2>@1"]} {
	# Could not restart the avahi daemon
	set dontTest 1
    } else {
	# Give the server time to react
	catch {exec sleep 1}
    }
}

if {$dontTest == 1} {
    untested "$test $subtest"
} else {
    set rc [catch {exec grep "Avahi client failure: Daemon connection failed" $logfile} result]
    if {$rc != 0} {
	fail "$test $subtest"
    } else {
	pass "$test $subtest"
    }
}

set subtest "server re-established avahi-daemon connection"
if {$dontTest == 1} {
    untested "$test $subtest"
} else {
    set rc [catch {exec grep -c {Adding Avahi service .Systemtap Compile Server.*} $logfile} result]
    # Make sure the target line was found more than once.
    if {$rc != 0 || $result < 2} {
	fail "$test $subtest"
    } else {
	pass "$test $subtest"
    }
}

set subtest "server still serves client requests"
if {$dontTest == 1 || ! [installtest_p]} then {
    untested "$test $subtest"
} else {
    # Contact the server directly, so that we know we're getting the one we want.
    set rc [stap_run_batch $srcdir/systemtap.server/hello.stp --use-server=$server_spec]
    if {$rc == 0} { pass "$test $subtest" } else { fail "$test $subtest" }
}

#-------------------------------------------------------
cleanup