1# Test for the sample clients
2# This is a DejaGnu test script.
3# This script tests that sample user-user communication works.
4
5# This mostly just calls procedures in test/dejagnu/config/default.exp.
6
7if ![info exists KLIST] {
8    set KLIST [findfile $objdir/../../clients/klist/klist]
9}
10
11if ![info exists KDESTROY] {
12    set KDESTROY [findfile $objdir/../../clients/kdestroy/kdestroy]
13}
14
15if ![info exists SSERVER] {
16    set SSERVER [findfile $objdir/../../appl/sample/sserver/sserver]
17}
18if ![info exists SCLIENT] {
19    set SCLIENT [findfile $objdir/../../appl/sample/sclient/sclient]
20}
21
22# Set up the Kerberos files and environment.
23if {![get_hostname] || ![setup_kerberos_files] || ![setup_kerberos_env]} {
24    return
25}
26
27# Initialize the Kerberos database.  The argument tells
28# setup_kerberos_db that it is being called from here.
29if ![setup_kerberos_db 0] {
30    return
31}
32
33proc start_sserver_daemon { inetd } {
34    global spawn_id
35    global sserver_pid
36    global sserver_spawn_id
37    global SSERVER
38    global T_INETD
39    global tmppwd
40    global portbase
41
42    # if inetd = 0, then we are running stand-alone
43    if !{$inetd} {
44	    # Start the sserver
45	    spawn $SSERVER -p [expr 8 + $portbase] -S $tmppwd/keytab
46	    set sserver_pid [exp_pid]
47	    set sserver_spawn_id $spawn_id
48
49	    verbose "sserver_spawn is $sserver_spawn_id" 1
50
51	    # Give sserver some time to start
52	    sleep 2
53    } else {
54	    # Start the sserver
55	    spawn $T_INETD [expr 8 + $portbase] $SSERVER sserver -S $tmppwd/keytab
56	    set sserver_pid [exp_pid]
57	    set sserver_spawn_id $spawn_id
58
59	    verbose "sserver_spawn (t_inetd) is $sserver_spawn_id" 1
60
61	    expect {
62		-ex "Ready!"	{ }
63		eof		{ error "couldn't start t_inetd helper" }
64	    }
65    }
66
67    return 1
68}
69
70
71proc stop_sserver_daemon { } {
72    global sserver_pid
73    global sserver_spawn_id
74
75    if [info exists sserver_pid] {
76	catch "close -i $sserver_spawn_id"
77	catch "exec kill $sserver_pid"
78	wait -i $sserver_spawn_id
79	unset sserver_pid
80    }
81
82    return 1
83}
84
85proc stop_check_sserver_daemon { } {
86    global sserver_spawn_id
87    global sserver_pid
88
89    # Check the exit status of sserver - should exit here
90    set status_list [wait -i $sserver_spawn_id]
91    verbose "wait -i $sserver_spawn_id returned $status_list (sserver)"
92    catch "close -i $sserver_spawn_id"
93    if { [lindex $status_list 2] != 0 || [lindex $status_list 3] != 0 } {
94	send_log "exit status: $status_list\n"
95	verbose "exit status: $status_list"
96	fail "sserver"
97    } else {
98	pass "sserver"
99    }
100    # In either case the server shutdown
101    unset sserver_pid
102}
103
104proc test_sclient { msg } {
105    global REALMNAME
106    global SCLIENT
107    global hostname
108    global spawn_id
109    global portbase
110
111    # Test the client
112    spawn $SCLIENT $hostname [expr 8 + $portbase]
113    verbose "sclient_spawn is  $spawn_id" 1
114
115    expect {
116	"sendauth succeeded, reply is:" {
117		verbose "Start proper message"
118	}
119	timeout {
120		fail $msg
121		return 0
122	}
123	eof {
124		fail $msg
125		return 0
126	}
127     }
128
129    expect {
130	"You are krbtest/admin@$REALMNAME\r" {
131		verbose "received valid sample message"}
132	eof {
133		fail $msg
134		return 0
135	    }
136    }
137    # This last expect seems useless, but without it the test hangs on
138    # NETBSD.
139    expect {
140        "\r" { }
141    }
142
143    if ![check_exit_status "ssample"] {
144	return 0
145    }
146
147    return 1
148}
149# We are about to start up a couple of daemon processes.  We do all
150# the rest of the tests inside a proc, so that we can easily kill the
151# processes when the procedure ends.
152
153proc doit { } {
154    global hostname
155    global KEY
156    global sserver_pid
157    global sserver_spawn_id
158
159    # Start up the kerberos and kadmind daemons.
160    if ![start_kerberos_daemons 0] {
161	return
162    }
163
164    # Use kadmin to add an host key.
165    if ![add_random_key sample/$hostname 1] {
166	return
167    }
168
169    # Use ksrvutil to create a keytab entry for sample
170    if ![setup_keytab 1 sample] {
171	return
172    }
173
174    # Use kinit to get a ticket.
175    if ![kinit krbtest/admin adminpass$KEY 1] {
176	return
177    }
178
179    run_once sample_standalone {
180	if ![start_sserver_daemon 0 ] {
181	    return
182	}
183
184	if ![test_sclient sclient] {
185	    return
186	}
187
188	pass "sample - standalone"
189
190	stop_check_sserver_daemon
191    }
192
193    if ![start_sserver_daemon 1 ] {
194	return
195    }
196
197    if ![test_sclient sclient-inetd] {
198	return
199    }
200
201    pass "sample - inetd"
202
203    stop_check_sserver_daemon
204    return
205}
206
207set status [catch doit msg]
208
209stop_sserver_daemon
210
211stop_kerberos_daemons
212
213if { $status != 0 } {
214    send_error "ERROR: error in sample.exp\n"
215    send_error "$msg\n"
216    exit 1
217}
218