Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/tcl8.5.2/tests/winDde.test @ 68

Last change on this file since 68 was 25, checked in by landauf, 16 years ago

added tcl to libs

File size: 14.9 KB
Line 
1# This file tests the tclWinDde.c file.
2#
3# This file contains a collection of tests for one or more of the Tcl
4# built-in commands.  Sourcing this file into Tcl runs the tests and
5# generates output for errors. No output means no errors were found.
6#
7# Copyright (c) 1999 by Scriptics Corporation.
8#
9# See the file "license.terms" for information on usage and redistribution
10# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
11#
12# RCS: @(#) $Id: winDde.test,v 1.28 2005/05/10 18:35:25 kennykb Exp $
13
14if {[lsearch [namespace children] ::tcltest] == -1} {
15    package require tcltest 2
16    #tcltest::configure -verbose {pass start}
17    namespace import -force ::tcltest::*
18}
19
20if {[testConstraint win]} {
21    if [catch {
22        # Is the dde extension already static to this shell?
23        if [catch {load {} Dde; set ::ddelib {}}] {
24            # try the location given to use on the commandline to tcltest
25            ::tcltest::loadTestedCommands
26            load $::ddelib Dde
27        }
28        testConstraint dde 1
29    }] {
30        testConstraint dde 0
31    }
32}
33
34
35# -------------------------------------------------------------------------
36# Setup a script for a test server
37#
38
39set scriptName [makeFile {} script1.tcl]
40
41proc createChildProcess { ddeServerName {handler {}}} {
42    file delete -force $::scriptName
43
44    set f [open $::scriptName w+]
45    puts $f [list set ddeServerName $ddeServerName]
46    if {$::ddelib != ""} {
47        puts $f [list load $::ddelib Dde]
48    }
49    puts $f {
50        # DDE child server -
51        #
52        if {[lsearch [namespace children] ::tcltest] == -1} {
53            package require tcltest
54            namespace import -force ::tcltest::*
55        }
56       
57        # If an error occurs during the tests, this process may end up not
58        # being closed down. To deal with this we create a 30s timeout.
59        proc ::DoTimeout {} {
60            global done ddeServerName
61            set done 1
62            puts "winDde.test child process $ddeServerName timed out."
63            flush stdout
64        }
65        set timeout [after 30000 ::DoTimeout]
66       
67        # Define a restricted handler.
68        proc Handler1 {cmd} {
69            if {$cmd eq "stop"} {set ::done 1}
70            puts $cmd ; flush stdout
71            return
72        }
73        proc Handler2 {cmd} {
74            if {$cmd eq "stop"} {set ::done 1}
75            puts [uplevel \#0 $cmd] ; flush stdout
76            return
77        }
78        proc Handler3 {prefix cmd} {
79            if {$cmd eq "stop"} {set ::done 1}
80            puts [list $prefix $cmd] ; flush stdout
81            return
82        }
83    }
84    # set the dde server name to the supplied argument.
85    if {$handler == {}} {
86        puts $f [list dde servername $ddeServerName]
87    } else {
88        puts $f [list dde servername -handler $handler -- $ddeServerName]
89    }       
90    puts $f {
91        # run the server and handle final cleanup.
92        after 200;# give dde a chance to get going.
93        puts ready
94        flush stdout
95        vwait done
96        # allow enough time for the calling process to
97        # claim all results, to avoid spurious "server did
98        # not respond"
99        after 200 { set reallyDone 1 }
100        vwait reallyDone
101        exit
102    }
103    close $f
104   
105    # run the child server script.
106    set f [open |[list [interpreter] $::scriptName] r]
107    fconfigure $f -buffering line
108    gets $f line
109    return $f
110}
111
112# -------------------------------------------------------------------------
113
114test winDde-1.1 {Settings the server's topic name} {win dde} {
115    list [dde servername foobar] [dde servername] [dde servername self]
116}  {foobar foobar self}
117
118test winDde-2.1 {Checking for other services} {win dde} {
119    expr [llength [dde services {} {}]] >= 0
120} 1
121test winDde-2.2 {Checking for existence, with service and topic specified} \
122        {win dde} {
123    llength [dde services TclEval self]
124} 1
125test winDde-2.3 {Checking for existence, with only the service specified} \
126        {win dde} {
127    expr [llength [dde services TclEval {}]] >= 1
128} 1
129test winDde-2.4 {Checking for existence, with only the topic specified} \
130        {win dde} {
131    expr [llength [dde services {} self]] >= 1
132} 1
133
134# -------------------------------------------------------------------------
135
136test winDde-3.1 {DDE execute locally} {win dde} {
137    set a ""
138    dde execute TclEval self {set a "foo"}
139    set a
140} foo
141test winDde-3.2 {DDE execute -async locally} {win dde} {
142    set a ""
143    dde execute -async TclEval self {set a "foo"}
144    update
145    set a
146} foo
147test winDde-3.3 {DDE request locally} {win dde} {
148    set a ""
149    dde execute TclEval self {set a "foo"}
150    dde request TclEval self a
151} foo
152test winDde-3.4 {DDE eval locally} {win dde} {
153    set a ""
154    dde eval self set a "foo"
155} foo
156test winDde-3.5 {DDE request locally} {win dde} {
157    set a ""
158    dde execute TclEval self {set a "foo"}
159    dde request -binary TclEval self a
160} "foo\x00"
161
162# -------------------------------------------------------------------------
163
164test winDde-4.1 {DDE execute remotely} {stdio win dde} {
165    set a ""
166    set name child-4.1
167    set child [createChildProcess $name]
168    dde execute TclEval $name {set a "foo"}
169    dde execute TclEval $name {set done 1}
170    update
171    set a
172} ""
173test winDde-4.2 {DDE execute async remotely} {stdio win dde} {
174    set a ""
175    set name child-4.2
176    set child [createChildProcess $name]
177    dde execute -async TclEval $name {set a "foo"}
178    update
179    dde execute TclEval $name {set done 1}
180    update
181    set a
182} ""
183test winDde-4.3 {DDE request remotely} {stdio win dde} {
184    set a ""
185    set name chile-4.3
186    set child [createChildProcess $name]
187    dde execute TclEval $name {set a "foo"}
188    set a [dde request TclEval $name a]
189    dde execute TclEval $name {set done 1}
190    update
191    set a
192} foo
193test winDde-4.4 {DDE eval remotely} {stdio win dde} {
194    set a ""
195    set name child-4.4
196    set child [createChildProcess $name]
197    set a [dde eval $name set a "foo"]
198    dde execute TclEval $name {set done 1}
199    update
200    set a
201} foo
202
203# -------------------------------------------------------------------------
204
205test winDde-5.1 {check for bad arguments} -constraints {win dde} -body {
206    dde execute "" "" "" ""
207} -returnCodes error -result {wrong # args: should be "dde execute ?-async? serviceName topicName value"}
208test winDde-5.2 {check for bad arguments} -constraints {win dde} -body {
209    dde execute "" "" ""
210} -returnCodes error -result {cannot execute null data}
211test winDde-5.3 {check for bad arguments} -constraints {win dde} -body {
212    dde execute -foo "" "" ""
213} -returnCodes error -result {wrong # args: should be "dde execute ?-async? serviceName topicName value"}
214test winDde-5.4 {DDE eval bad arguments} -constraints {win dde} -body {
215    dde eval "" "foo"
216} -returnCodes error -result {invalid service name ""}
217
218# -------------------------------------------------------------------------
219
220test winDde-6.1 {DDE servername bad arguments} -constraints {win dde} -body {
221    dde servername -z -z -z
222} -returnCodes error -result {bad option "-z": must be -force, -handler, or --}
223test winDde-6.2 {DDE servername set name} -constraints {win dde} -body {
224    dde servername -- winDde-6.2
225} -result {winDde-6.2}
226test winDde-6.3 {DDE servername set exact name} -constraints {win dde} -body {
227    dde servername -force winDde-6.3
228} -result {winDde-6.3}
229test winDde-6.4 {DDE servername set exact name} -constraints {win dde} -body {
230    dde servername -force -- winDde-6.4
231} -result {winDde-6.4}
232test winDde-6.5 {DDE remote servername collision} -constraints {stdio win dde} -setup {
233    set name child-6.5
234    set child [createChildProcess $name]
235} -body {
236    dde servername -- $name
237} -cleanup {
238    dde execute TclEval $name {set done 1}
239    update
240} -result "child-6.5 #2"
241test winDde-6.6 {DDE remote servername collision force} -constraints {stdio win dde} -setup {
242    set name child-6.6
243    set child [createChildProcess $name]
244} -body {
245    dde servername -force -- $name
246} -cleanup {
247    dde execute TclEval $name {set done 1}
248    update
249} -result {child-6.6}
250
251# -------------------------------------------------------------------------
252
253test winDde-7.1 {Load DDE in slave interpreter } -constraints {win dde} -setup {
254    interp create slave
255} -body {
256    slave eval [list load $::ddelib Dde]
257    slave eval [list dde servername -- dde-interp-7.1]
258} -cleanup {
259    interp delete slave
260} -result {dde-interp-7.1}
261test winDde-7.2 {DDE slave cleanup} -constraints {win dde} -setup {
262    interp create slave
263    slave eval [list load $::ddelib Dde]
264    slave eval [list dde servername -- dde-interp-7.5]
265    interp delete slave
266} -body {
267    dde services TclEval {}
268    set s [dde services TclEval {}]
269    set m [list [list TclEval dde-interp-7.5]]
270    if {[lsearch -exact $s $m] != -1} {
271        set s
272    }
273} -result {}
274test winDde-7.3 {DDE present in slave interp} -constraints {win dde} -setup {
275    interp create slave
276    slave eval [list load $::ddelib Dde]
277    slave eval [list dde servername -- dde-interp-7.3]
278} -body {
279    dde services TclEval dde-interp-7.3
280} -cleanup {
281    interp delete slave
282} -result {{TclEval dde-interp-7.3}}
283test winDde-7.4 {interp name collision with -force} -constraints {win dde} -setup {
284    interp create slave
285    slave eval [list load $::ddelib Dde]
286    slave eval [list dde servername -- dde-interp-7.4]
287} -body {
288    dde servername -force -- dde-interp-7.4
289} -cleanup {
290    interp delete slave
291} -result {dde-interp-7.4}
292test winDde-7.5 {interp name collision without -force} -constraints {win dde} -setup {
293    interp create slave
294    slave eval [list load $::ddelib Dde]
295    slave eval [list dde servername -- dde-interp-7.5]
296} -body {
297    dde servername -- dde-interp-7.5
298} -cleanup {
299    interp delete slave
300} -result "dde-interp-7.5 #2"
301
302# -------------------------------------------------------------------------
303
304test winDde-8.1 {Safe DDE load} -constraints {win dde} -setup {
305    interp create -safe slave
306    slave invokehidden load $::ddelib Dde
307} -body {
308    slave eval dde servername slave
309} -cleanup {
310    interp delete slave
311} -returnCodes error -result {invalid command name "dde"}
312test winDde-8.2 {Safe DDE set servername} -constraints {win dde} -setup {
313    interp create -safe slave
314    slave invokehidden load $::ddelib Dde
315} -body {
316    slave invokehidden dde servername slave
317} -cleanup {interp delete slave} -result {slave}
318test winDde-8.3 {Safe DDE check handler required for eval} -constraints {win dde} -setup {
319    interp create -safe slave
320    slave invokehidden load $::ddelib Dde
321    slave invokehidden dde servername slave
322} -body {
323    catch {dde eval slave set a 1} msg
324} -cleanup {interp delete slave} -result {1}
325test winDde-8.4 {Safe DDE check that execute is denied} -constraints {win dde} -setup {
326    interp create -safe slave
327    slave invokehidden load $::ddelib Dde
328    slave invokehidden dde servername slave
329} -body {
330    slave eval set a 1
331    dde execute TclEval slave {set a 2}
332    slave eval set a
333} -cleanup {interp delete slave} -result 1
334test winDde-8.5 {Safe DDE check that request is denied} -constraints {win dde} -setup {
335    interp create -safe slave
336    slave invokehidden load $::ddelib Dde
337    slave invokehidden dde servername slave
338} -body {
339    slave eval set a 1
340    dde request TclEval slave a
341} -cleanup {
342    interp delete slave
343} -returnCodes error -result {remote server cannot handle this command}
344test winDde-8.6 {Safe DDE assign handler procedure} -constraints {win dde} -setup {
345    interp create -safe slave
346    slave invokehidden load $::ddelib Dde
347    slave eval {proc DDEACCEPT {cmd} {set ::DDECMD $cmd}}
348} -body {
349    slave invokehidden dde servername -handler DDEACCEPT slave
350} -cleanup {interp delete slave} -result slave
351test winDde-8.7 {Safe DDE check simple command} -constraints {win dde} -setup {
352    interp create -safe slave
353    slave invokehidden load $::ddelib Dde
354    slave eval {proc DDEACCEPT {cmd} {set ::DDECMD $cmd}}
355    slave invokehidden dde servername -handler DDEACCEPT slave
356} -body {
357    dde eval slave set x 1
358} -cleanup {interp delete slave} -result {set x 1}
359test winDde-8.8 {Safe DDE check non-list command} -constraints {win dde} -setup {
360    interp create -safe slave
361    slave invokehidden load $::ddelib Dde
362    slave eval {proc DDEACCEPT {cmd} {set ::DDECMD $cmd}}
363    slave invokehidden dde servername -handler DDEACCEPT slave
364} -body {
365    set s "c:\\Program Files\\Microsoft Visual Studio\\"
366    dde eval slave $s
367    string equal [slave eval set DDECMD] $s
368} -cleanup {interp delete slave} -result 1
369test winDde-8.9 {Safe DDE check command evaluation} -constraints {win dde} -setup {
370    interp create -safe slave
371    slave invokehidden load $::ddelib Dde
372    slave eval {proc DDEACCEPT {cmd} {set ::DDECMD [uplevel \#0 $cmd]}}
373    slave invokehidden dde servername -handler DDEACCEPT slave
374} -body {
375    dde eval slave set x 1
376    slave eval set x
377} -cleanup {interp delete slave} -result 1
378test winDde-8.10 {Safe DDE check command evaluation (2)} -constraints {win dde} -setup {
379    interp create -safe slave
380    slave invokehidden load $::ddelib Dde
381    slave eval {proc DDEACCEPT {cmd} {set ::DDECMD [uplevel \#0 $cmd]}}
382    slave invokehidden dde servername -handler DDEACCEPT slave
383} -body {
384    dde eval slave [list set x 1]
385    slave eval set x
386} -cleanup {interp delete slave} -result 1
387test winDde-8.11 {Safe DDE check command evaluation (3)} -constraints {win dde} -setup {
388    interp create -safe slave
389    slave invokehidden load $::ddelib Dde
390    slave eval {proc DDEACCEPT {cmd} {set ::DDECMD [uplevel \#0 $cmd]}}
391    slave invokehidden dde servername -handler DDEACCEPT slave
392} -body {
393    dde eval slave [list [list set x 1]]
394    slave eval set x
395} -cleanup {interp delete slave} -returnCodes error -result {invalid command name "set x 1"}
396
397# -------------------------------------------------------------------------
398
399test winDde-9.1 {External safe DDE check string passing} -constraints {win dde stdio} -setup {
400    set name child-9.1
401    set child [createChildProcess $name Handler1]
402    file copy -force script1.tcl dde-script.tcl
403} -body {
404    dde eval $name set x 1
405    gets $child line
406    set line
407} -cleanup {
408    dde execute TclEval $name stop
409    update
410    file delete -force -- dde-script.tcl
411} -result {set x 1}
412test winDde-9.2 {External safe DDE check command evaluation} -constraints {win dde stdio} -setup {
413    set name child-9.2
414    set child [createChildProcess $name Handler2]
415    file copy -force script1.tcl dde-script.tcl
416} -body {
417    dde eval $name set x 1
418    gets $child line
419    set line
420} -cleanup {
421    dde execute TclEval $name stop
422    update
423    file delete -force -- dde-script.tcl
424} -result 1
425test winDde-9.3 {External safe DDE check prefixed arguments} -constraints {win dde stdio} -setup {
426    set name child-9.3
427    set child [createChildProcess $name [list Handler3 ARG]]
428    file copy -force script1.tcl dde-script.tcl
429} -body {
430    dde eval $name set x 1
431    gets $child line
432    set line
433} -cleanup {
434    dde execute TclEval $name stop
435    update
436    file delete -force -- dde-script.tcl
437} -result {ARG {set x 1}}
438
439# -------------------------------------------------------------------------
440
441#cleanup
442#catch {interp delete $slave};           # ensure we clean up the slave.
443file delete -force $::scriptName
444::tcltest::cleanupTests
445return
446
447# Local Variables:
448# mode: tcl
449# End:
Note: See TracBrowser for help on using the repository browser.