1 # This file tests the tclWinDde.c file.
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.
7 # Copyright (c) 1999 by Scriptics Corporation.
9 # See the file "license.terms" for information on usage and redistribution
10 # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
12 if {"::tcltest" ni [namespace children]} {
13 package require tcltest 2.5
14 #tcltest::configure -verbose {pass start}
15 namespace import -force ::tcltest::*
18 testConstraint debug [::tcl::pkgconfig get debug]
20 if {[testConstraint win]} {
22 ::tcltest::loadTestedCommands
23 set ::ddever [package require dde 1.4.4]
24 set ::ddelib [info loaded "" Dde]}]} {
30 # -------------------------------------------------------------------------
31 # Setup a script for a test server
34 set scriptName [makeFile {} script1.tcl]
36 proc createChildProcess {ddeServerName args} {
37 file delete -force $::scriptName
39 set f [open $::scriptName w+]
40 puts $f [list set ddeServerName $ddeServerName]
41 puts $f [list load $::ddelib Dde]
45 if {"::tcltest" ni [namespace children]} {
46 package require tcltest 2.5
47 namespace import -force ::tcltest::*
50 # If an error occurs during the tests, this process may end up not
51 # being closed down. To deal with this we create a 30s timeout.
53 global done ddeServerName
55 puts "winDde.test child process $ddeServerName timed out."
58 set timeout [after 30000 ::DoTimeout]
60 # Define a restricted handler.
62 if {$cmd eq "stop"} {set ::done 1}
66 puts $cmd ; flush stdout
70 if {$cmd eq "stop"} {set ::done 1}
71 puts [uplevel \#0 $cmd] ; flush stdout
74 proc Handler3 {prefix cmd} {
75 if {$cmd eq "stop"} {set ::done 1}
76 puts [list $prefix $cmd] ; flush stdout
80 # set the dde server name to the supplied argument.
81 puts $f [list dde servername {*}$args -- $ddeServerName]
83 # run the server and handle final cleanup.
84 after 200;# give dde a chance to get going.
88 # allow enough time for the calling process to
89 # claim all results, to avoid spurious "server did
91 after 200 {set reallyDone 1}
97 # run the child server script.
98 set f [open |[list [interpreter] $::scriptName] r]
99 fconfigure $f -buffering line
104 # -------------------------------------------------------------------------
105 test winDde-1.0 {check if we are testing the right dll} {win dde} {
109 test winDde-1.1 {Settings the server's topic name} -constraints dde -body {
110 list [dde servername foobar] [dde servername] [dde servername self]
111 } -result {foobar foobar self}
113 test winDde-2.1 {Checking for other services} -constraints dde -body {
114 expr {[llength [dde services {} {}]] >= 0}
116 test winDde-2.2 {Checking for existence, with service and topic specified} \
117 -constraints dde -body {
118 llength [dde services TclEval self]
120 test winDde-2.3 {Checking for existence, with only the service specified} \
121 -constraints dde -body {
122 expr {[llength [dde services TclEval {}]] >= 1}
124 test winDde-2.4 {Checking for existence, with only the topic specified} \
125 -constraints dde -body {
126 expr {[llength [dde services {} self]] >= 1}
129 # -------------------------------------------------------------------------
131 test winDde-3.1 {DDE execute locally} -constraints dde -body {
133 dde execute TclEval self [list set \xe1 foo]
136 test winDde-3.2 {DDE execute -async locally} -constraints dde -body {
138 dde execute -async TclEval self [list set \xe1 foo]
142 test winDde-3.3 {DDE request locally} -constraints dde -body {
144 dde execute TclEval self [list set \xe1 foo]
145 dde request TclEval self \xe1
147 test winDde-3.4 {DDE eval locally} -constraints dde -body {
149 dde eval self set \xe1 foo
151 test winDde-3.5 {DDE request locally} -constraints dde -body {
153 dde execute TclEval self [list set \xe1 foo]
154 dde request -binary TclEval self \xe1
156 # Set variable a to A with diaeresis (unicode C4) by relying on the fact
157 # that utf-8 is sent (e.g. "c3 84" on the wire)
158 test winDde-3.6 {DDE request utf-8} -constraints dde -body {
160 dde execute TclEval self "set \xe1 \xc4"
163 # Set variable a to A with diaeresis (unicode C4) using binary execute
164 # and compose utf-8 (e.g. "c3 84" ) manualy
165 test winDde-3.7 {DDE request binary} -constraints dde -body {
167 dde execute -binary TclEval self [list set \xc3\xa1 \xc3\x84\x00]
170 test winDde-3.8 {DDE poke locally} -constraints {dde debug} -body {
172 dde poke TclEval self \xe1 \xc4
173 dde request TclEval self \xe1
175 test winDde-3.9 {DDE poke -binary locally} -constraints {dde debug} -body {
177 dde poke -binary TclEval self \xe1 \xc3\x84\x00
178 dde request TclEval self \xe1
181 # -------------------------------------------------------------------------
183 test winDde-4.1 {DDE execute remotely} -constraints {dde stdio} -body {
185 set name ch\xEDld-4.1
186 set child [createChildProcess $name]
187 dde execute TclEval $name [list set \xe1 foo]
188 dde execute TclEval $name {set done 1}
192 test winDde-4.2 {DDE execute async remotely} -constraints {dde stdio} -body {
194 set name ch\xEDld-4.2
195 set child [createChildProcess $name]
196 dde execute -async TclEval $name [list set \xe1 foo]
198 dde execute TclEval $name {set done 1}
202 test winDde-4.3 {DDE request remotely} -constraints {dde stdio} -body {
204 set name ch\xEDld-4.3
205 set child [createChildProcess $name]
206 dde execute TclEval $name [list set \xe1 foo]
207 set \xe1 [dde request TclEval $name \xe1]
208 dde execute TclEval $name {set done 1}
212 test winDde-4.4 {DDE eval remotely} -constraints {dde stdio} -body {
214 set name ch\xEDld-4.4
215 set child [createChildProcess $name]
216 set \xe1 [dde eval $name set \xe1 foo]
217 dde execute TclEval $name {set done 1}
221 test winDde-4.5 {DDE poke remotely} -constraints {dde debug stdio} -body {
223 set name ch\xEDld-4.5
224 set child [createChildProcess $name]
225 dde poke TclEval $name \xe1 foo
226 set \xe1 [dde request TclEval $name \xe1]
227 dde execute TclEval $name {set done 1}
232 # -------------------------------------------------------------------------
234 test winDde-5.1 {check for bad arguments} -constraints dde -body {
235 dde execute "" "" "" ""
236 } -returnCodes error -result {wrong # args: should be "dde execute ?-async? ?-binary? serviceName topicName value"}
237 test winDde-5.2 {check for bad arguments} -constraints dde -body {
238 dde execute -binary "" "" ""
239 } -returnCodes error -result {cannot execute null data}
240 test winDde-5.3 {check for bad arguments} -constraints dde -body {
241 dde execute -foo "" "" ""
242 } -returnCodes error -result {wrong # args: should be "dde execute ?-async? ?-binary? serviceName topicName value"}
243 test winDde-5.4 {DDE eval bad arguments} -constraints dde -body {
245 } -returnCodes error -result {invalid service name ""}
247 # -------------------------------------------------------------------------
249 test winDde-6.1 {DDE servername bad arguments} -constraints dde -body {
250 dde servername -z -z -z
251 } -returnCodes error -result {bad option "-z": must be -force, -handler, or --}
252 test winDde-6.2 {DDE servername set name} -constraints dde -body {
253 dde servername -- winDde-6.2
254 } -result {winDde-6.2}
255 test winDde-6.3 {DDE servername set exact name} -constraints dde -body {
256 dde servername -force winDde-6.3
257 } -result {winDde-6.3}
258 test winDde-6.4 {DDE servername set exact name} -constraints dde -body {
259 dde servername -force -- winDde-6.4
260 } -result {winDde-6.4}
261 test winDde-6.5 {DDE remote servername collision} -constraints {dde stdio} -setup {
262 set name ch\xEDld-6.5
263 set child [createChildProcess $name]
265 dde servername -- $name
267 dde execute TclEval $name {set done 1}
269 } -result "ch\xEDld-6.5 #2"
270 test winDde-6.6 {DDE remote servername collision force} -constraints {dde stdio} -setup {
271 set name ch\xEDld-6.6
272 set child [createChildProcess $name]
274 dde servername -force -- $name
276 dde execute TclEval $name {set done 1}
278 } -result "ch\xEDld-6.6"
280 # -------------------------------------------------------------------------
282 test winDde-7.1 {Load DDE in child interpreter} -constraints dde -setup {
285 child eval [list load $::ddelib Dde]
286 child eval [list dde servername -- dde-interp-7.1]
289 } -result {dde-interp-7.1}
290 test winDde-7.2 {DDE child cleanup} -constraints dde -setup {
292 child eval [list load $::ddelib Dde]
293 child eval [list dde servername -- dde-interp-7.5]
296 dde services TclEval {}
297 set s [dde services TclEval {}]
298 set m [list [list TclEval dde-interp-7.5]]
303 test winDde-7.3 {DDE present in child interp} -constraints dde -setup {
305 child eval [list load $::ddelib Dde]
306 child eval [list dde servername -- dde-interp-7.3]
308 dde services TclEval dde-interp-7.3
311 } -result {{TclEval dde-interp-7.3}}
312 test winDde-7.4 {interp name collision with -force} -constraints dde -setup {
314 child eval [list load $::ddelib Dde]
315 child eval [list dde servername -- dde-interp-7.4]
317 dde servername -force -- dde-interp-7.4
320 } -result {dde-interp-7.4}
321 test winDde-7.5 {interp name collision without -force} -constraints dde -setup {
323 child eval [list load $::ddelib Dde]
324 child eval [list dde servername -- dde-interp-7.5]
326 dde servername -- dde-interp-7.5
329 } -result "dde-interp-7.5 #2"
331 # -------------------------------------------------------------------------
333 test winDde-8.1 {Safe DDE load} -constraints dde -setup {
334 interp create -safe child
335 child invokehidden load $::ddelib Dde
337 child eval dde servername child
340 } -returnCodes error -result {invalid command name "dde"}
341 test winDde-8.2 {Safe DDE set servername} -constraints dde -setup {
342 interp create -safe child
343 child invokehidden load $::ddelib Dde
345 child invokehidden dde servername child
346 } -cleanup {interp delete child} -result {child}
347 test winDde-8.3 {Safe DDE check handler required for eval} -constraints dde -setup {
348 interp create -safe child
349 child invokehidden load $::ddelib Dde
350 child invokehidden dde servername child
352 catch {dde eval child set a 1} msg
353 } -cleanup {interp delete child} -result {1}
354 test winDde-8.4 {Safe DDE check that execute is denied} -constraints dde -setup {
355 interp create -safe child
356 child invokehidden load $::ddelib Dde
357 child invokehidden dde servername child
360 dde execute TclEval child {set a 2}
362 } -cleanup {interp delete child} -result 1
363 test winDde-8.5 {Safe DDE check that request is denied} -constraints dde -setup {
364 interp create -safe child
365 child invokehidden load $::ddelib Dde
366 child invokehidden dde servername child
369 dde request TclEval child a
372 } -returnCodes error -result {remote server cannot handle this command}
373 test winDde-8.6 {Safe DDE assign handler procedure} -constraints dde -setup {
374 interp create -safe child
375 child invokehidden load $::ddelib Dde
376 child eval {proc DDEACCEPT {cmd} {set ::DDECMD $cmd}}
378 child invokehidden dde servername -handler DDEACCEPT child
379 } -cleanup {interp delete child} -result child
380 test winDde-8.7 {Safe DDE check simple command} -constraints dde -setup {
381 interp create -safe child
382 child invokehidden load $::ddelib Dde
383 child eval {proc DDEACCEPT {cmd} {set ::DDECMD $cmd}}
384 child invokehidden dde servername -handler DDEACCEPT child
386 dde eval child set x 1
387 } -cleanup {interp delete child} -result {set x 1}
388 test winDde-8.8 {Safe DDE check non-list command} -constraints dde -setup {
389 interp create -safe child
390 child invokehidden load $::ddelib Dde
391 child eval {proc DDEACCEPT {cmd} {set ::DDECMD $cmd}}
392 child invokehidden dde servername -handler DDEACCEPT child
394 set s "c:\\Program Files\\Microsoft Visual Studio\\"
396 string equal [child eval set DDECMD] $s
397 } -cleanup {interp delete child} -result 1
398 test winDde-8.9 {Safe DDE check command evaluation} -constraints dde -setup {
399 interp create -safe child
400 child invokehidden load $::ddelib Dde
401 child eval {proc DDEACCEPT {cmd} {set ::DDECMD [uplevel \#0 $cmd]}}
402 child invokehidden dde servername -handler DDEACCEPT child
404 dde eval child set \xe1 1
406 } -cleanup {interp delete child} -result 1
407 test winDde-8.10 {Safe DDE check command evaluation (2)} -constraints dde -setup {
408 interp create -safe child
409 child invokehidden load $::ddelib Dde
410 child eval {proc DDEACCEPT {cmd} {set ::DDECMD [uplevel \#0 $cmd]}}
411 child invokehidden dde servername -handler DDEACCEPT child
413 dde eval child [list set x 1]
415 } -cleanup {interp delete child} -result 1
416 test winDde-8.11 {Safe DDE check command evaluation (3)} -constraints dde -setup {
417 interp create -safe child
418 child invokehidden load $::ddelib Dde
419 child eval {proc DDEACCEPT {cmd} {set ::DDECMD [uplevel \#0 $cmd]}}
420 child invokehidden dde servername -handler DDEACCEPT child
422 dde eval child [list [list set x 1]]
424 } -cleanup {interp delete child} -returnCodes error -result {invalid command name "set x 1"}
426 # -------------------------------------------------------------------------
428 test winDde-9.1 {External safe DDE check string passing} -constraints {dde stdio} -setup {
429 set name ch\xEDld-9.1
430 set child [createChildProcess $name -handler Handler1]
431 file copy -force script1.tcl dde-script.tcl
433 dde eval $name set x 1
437 dde execute TclEval $name stop
439 file delete -force -- dde-script.tcl
441 test winDde-9.2 {External safe DDE check command evaluation} -constraints {dde stdio} -setup {
442 set name ch\xEDld-9.2
443 set child [createChildProcess $name -handler Handler2]
444 file copy -force script1.tcl dde-script.tcl
446 dde eval $name set x 1
450 dde execute TclEval $name stop
452 file delete -force -- dde-script.tcl
454 test winDde-9.3 {External safe DDE check prefixed arguments} -constraints {dde stdio} -setup {
455 set name ch\xEDld-9.3
456 set child [createChildProcess $name -handler [list Handler3 ARG]]
457 file copy -force script1.tcl dde-script.tcl
459 dde eval $name set x 1
463 dde execute TclEval $name stop
465 file delete -force -- dde-script.tcl
466 } -result {ARG {set x 1}}
467 test winDde-9.4 {External safe DDE check null data passing} -constraints {dde stdio} -setup {
468 set name ch\xEDld-9.4
469 set child [createChildProcess $name -handler Handler1]
470 file copy -force script1.tcl dde-script.tcl
472 dde execute TclEval $name ""
476 dde execute TclEval $name stop
478 file delete -force -- dde-script.tcl
479 } -result {null data}
481 # -------------------------------------------------------------------------
484 #catch {interp delete $child}; # ensure we clean up the child.
485 file delete -force $::scriptName
486 ::tcltest::cleanupTests